diff --git a/composer.lock b/composer.lock
index fc2d6741de16815cf597ac827d16a20b575c23fc..f3807eadf3498020ea225c38da4fd96901c85ca5 100644
--- a/composer.lock
+++ b/composer.lock
@@ -535,7 +535,7 @@
             "dist": {
                 "type": "path",
                 "url": "core",
-                "reference": "f3d27c6d13a1d3b6b5e3f2bf2074f63d24c17603"
+                "reference": "1349b63771ae6c0b66e9d870c692bf7f51024171"
             },
             "require": {
                 "asm89/stack-cors": "^1.1",
@@ -599,6 +599,7 @@
                 "drupal/book": "self.version",
                 "drupal/breakpoint": "self.version",
                 "drupal/ckeditor": "self.version",
+                "drupal/ckeditor5": "self.version",
                 "drupal/claro": "self.version",
                 "drupal/classy": "self.version",
                 "drupal/color": "self.version",
diff --git a/core/.cspell.json b/core/.cspell.json
index ca08c426d021cc040537e58d2afcfbc5062a6ab6..56df9c720214e7027c15b4b91d2c0a9d893b0250 100644
--- a/core/.cspell.json
+++ b/core/.cspell.json
@@ -13,6 +13,7 @@
       "**/LICENSE.txt",
       "../**/LICENSE.txt",
       "modules/**/Migrate*Test.php",
+      "modules/ckeditor5/js/build/*",
       "modules/color/preview.html",
       "modules/color/tests/modules/color_test/themes/color_test_theme/color/preview.html",
       "modules/media/tests/fixtures/oembed/*",
diff --git a/core/.eslintignore b/core/.eslintignore
index 0cf12c6e25545c984a9e0598909620702eb22d6e..655ca871470f5d9431dcd4007ae7e64cadcef8a6 100644
--- a/core/.eslintignore
+++ b/core/.eslintignore
@@ -3,6 +3,7 @@ node_modules/**/*
 **/js_test_files/**/*
 *.js
 !*.es6.js
+!modules/ckeditor5/js/ckeditor5_plugins/**/*.js
 modules/locale/tests/locale_test.es6.js
 !tests/Drupal/Nightwatch/**/*.js
 misc/polyfills/array.find.es6.js
diff --git a/core/assets/vendor/ckeditor5/alignment.js b/core/assets/vendor/ckeditor5/alignment.js
new file mode 100644
index 0000000000000000000000000000000000000000..9c07cac3f41aa359b5c929e9727b46d55eb6f104
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/alignment.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Align center","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":"Text alignment toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.alignment=function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=4)}([function(t,e,n){t.exports=n(3)("./src/core.js")},function(t,e,n){t.exports=n(3)("./src/utils.js")},function(t,e,n){t.exports=n(3)("./src/ui.js")},function(t,e){t.exports=CKEditor5.dll},function(t,e,n){"use strict";n.r(e),n.d(e,"Alignment",(function(){return f})),n.d(e,"AlignmentEditing",(function(){return u})),n.d(e,"AlignmentUI",(function(){return m}));var i=n(0),o=n(1);const r=["left","right","center","justify"];function a(t){return r.includes(t)}function l(t,e){return"rtl"==e.contentLanguageDirection?"right"===t:"left"===t}function s(t){const e=t.map(t=>{let e;return e="string"==typeof t?{name:t}:t,e}).filter(t=>{const e=!!r.includes(t.name);return e||Object(o.logWarning)("alignment-config-name-not-recognized",{option:t}),e}),n=e.filter(t=>!!t.className).length;if(n&&n<e.length)throw new o.CKEditorError("alignment-config-classnames-are-missing",{configuredOptions:t});return e.forEach((e,n,i)=>{const r=i.slice(n+1);if(r.some(t=>t.name==e.name))throw new o.CKEditorError("alignment-config-name-already-defined",{option:e,configuredOptions:t});if(e.className){if(r.some(t=>t.className==e.className))throw new o.CKEditorError("alignment-config-classname-already-defined",{option:e,configuredOptions:t})}}),e}class c extends i.Command{refresh(){const t=this.editor.locale,e=Object(o.first)(this.editor.model.document.selection.getSelectedBlocks());this.isEnabled=!!e&&this._canBeAligned(e),this.isEnabled&&e.hasAttribute("alignment")?this.value=e.getAttribute("alignment"):this.value="rtl"===t.contentLanguageDirection?"right":"left"}execute(t={}){const e=this.editor,n=e.locale,i=e.model,o=i.document,r=t.value;i.change(t=>{const e=Array.from(o.selection.getSelectedBlocks()).filter(t=>this._canBeAligned(t)),i=e[0].getAttribute("alignment");l(r,n)||i===r||!r?function(t,e){for(const n of t)e.removeAttribute("alignment",n)}(e,t):function(t,e,n){for(const i of t)e.setAttribute("alignment",n,i)}(e,t,r)})}_canBeAligned(t){return this.editor.model.schema.checkAttribute(t,"alignment")}}class u extends i.Plugin{static get pluginName(){return"AlignmentEditing"}constructor(t){super(t),t.config.define("alignment",{options:[...r.map(t=>({name:t}))]})}init(){const t=this.editor,e=t.locale,n=t.model.schema,i=s(t.config.get("alignment.options")).filter(t=>a(t.name)&&!l(t.name,e)),o=i.some(t=>!!t.className);n.extend("$block",{allowAttributes:"alignment"}),t.model.schema.setAttributeProperties("alignment",{isFormatting:!0}),o?t.conversion.attributeToAttribute(function(t){const e={model:{key:"alignment",values:t.map(t=>t.name)},view:{}};for(const n of t)e.view[n.name]={key:"class",value:n.className};return e}(i)):t.conversion.for("downcast").attributeToAttribute(function(t){const e={model:{key:"alignment",values:t.map(t=>t.name)},view:{}};for(const{name:n}of t)e.view[n]={key:"style",value:{"text-align":n}};return e}(i));const r=function(t){const e=[];for(const{name:n}of t)e.push({view:{key:"style",value:{"text-align":n}},model:{key:"alignment",value:n}});return e}(i);for(const e of r)t.conversion.for("upcast").attributeToAttribute(e);const u=function(t){const e=[];for(const{name:n}of t)e.push({view:{key:"align",value:n},model:{key:"alignment",value:n}});return e}(i);for(const e of u)t.conversion.for("upcast").attributeToAttribute(e);t.commands.add("alignment",new c(t))}}var g=n(2);const d=new Map([["left",i.icons.alignLeft],["right",i.icons.alignRight],["center",i.icons.alignCenter],["justify",i.icons.alignJustify]]);class m extends i.Plugin{get localizedOptionTitles(){const t=this.editor.t;return{left:t("Align left"),right:t("Align right"),center:t("Align center"),justify:t("Justify")}}static get pluginName(){return"AlignmentUI"}init(){const t=this.editor,e=t.ui.componentFactory,n=t.t,i=s(t.config.get("alignment.options"));i.map(t=>t.name).filter(a).forEach(t=>this._addButton(t)),e.add("alignment",t=>{const o=Object(g.createDropdown)(t),r=i.map(t=>e.create("alignment:"+t.name));Object(g.addToolbarToDropdown)(o,r),o.buttonView.set({label:n("Text alignment"),tooltip:!0}),o.toolbarView.isVertical=!0,o.toolbarView.ariaLabel=n("Text alignment toolbar"),o.extendTemplate({attributes:{class:"ck-alignment-dropdown"}});const a="rtl"===t.contentLanguageDirection?d.get("right"):d.get("left");return o.buttonView.bind("icon").toMany(r,"isOn",(...t)=>{const e=t.findIndex(t=>t);return e<0?a:r[e].icon}),o.bind("isEnabled").toMany(r,"isEnabled",(...t)=>t.some(t=>t)),o})}_addButton(t){const e=this.editor;e.ui.componentFactory.add("alignment:"+t,n=>{const i=e.commands.get("alignment"),o=new g.ButtonView(n);return o.set({label:this.localizedOptionTitles[t],icon:d.get(t),tooltip:!0,isToggleable:!0}),o.bind("isEnabled").to(i),o.bind("isOn").to(i,"value",e=>e===t),this.listenTo(o,"execute",()=>{e.execute("alignment",{value:t}),e.editing.view.focus()}),o})}}class f extends i.Plugin{static get requires(){return[u,m]}static get pluginName(){return"Alignment"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/basic-styles.js b/core/assets/vendor/ckeditor5/basic-styles.js
new file mode 100644
index 0000000000000000000000000000000000000000..8a8c7c10d7f47105a915f57fb57df8f19b2e052a
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/basic-styles.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Bold",Code:"Code",Italic:"Italic",Strikethrough:"Strikethrough",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.basicStyles=function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.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 r in t)i.d(n,r,function(e){return t[e]}.bind(null,r));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=7)}([function(t,e,i){t.exports=i(3)("./src/core.js")},function(t,e,i){t.exports=i(3)("./src/ui.js")},function(t,e,i){t.exports=i(3)("./src/typing.js")},function(t,e){t.exports=CKEditor5.dll},function(t,e,i){var n=i(5),r=i(6);"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[t.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(r,s);t.exports=r.locals||{}},function(t,e,i){"use strict";var n,r=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]}}(),o=[];function c(t){for(var e=-1,i=0;i<o.length;i++)if(o[i].identifier===t){e=i;break}return e}function a(t,e){for(var i={},n=[],r=0;r<t.length;r++){var s=t[r],a=e.base?s[0]+e.base:s[0],u=i[a]||0,l="".concat(a," ").concat(u);i[a]=u+1;var d=c(l),g={css:s[1],media:s[2],sourceMap:s[3]};-1!==d?(o[d].references++,o[d].updater(g)):o.push({identifier:l,updater:b(g,e),references:1}),n.push(l)}return n}function u(t){var e=document.createElement("style"),n=t.attributes||{};if(void 0===n.nonce){var r=i.nc;r&&(n.nonce=r)}if(Object.keys(n).forEach((function(t){e.setAttribute(t,n[t])})),"function"==typeof t.insert)t.insert(e);else{var o=s(t.insert||"head");if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(e)}return e}var l,d=(l=[],function(t,e){return l[t]=e,l.filter(Boolean).join("\n")});function g(t,e,i,n){var r=i?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(t.styleSheet)t.styleSheet.cssText=d(e,r);else{var s=document.createTextNode(r),o=t.childNodes;o[e]&&t.removeChild(o[e]),o.length?t.insertBefore(s,o[e]):t.appendChild(s)}}function p(t,e,i){var n=i.css,r=i.media,s=i.sourceMap;if(r?t.setAttribute("media",r):t.removeAttribute("media"),s&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(s))))," */")),t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}var m=null,h=0;function b(t,e){var i,n,r;if(e.singleton){var s=h++;i=m||(m=u(e)),n=g.bind(null,i,s,!1),r=g.bind(null,i,s,!0)}else i=u(e),n=p.bind(null,i,e),r=function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(i)};return n(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;n(t=e)}else r()}}t.exports=function(t,e){(e=e||{}).singleton||"boolean"==typeof e.singleton||(e.singleton=r());var i=a(t=t||[],e);return function(t){if(t=t||[],"[object Array]"===Object.prototype.toString.call(t)){for(var n=0;n<i.length;n++){var r=c(i[n]);o[r].references--}for(var s=a(t,e),u=0;u<i.length;u++){var l=c(i[u]);0===o[l].references&&(o[l].updater(),o.splice(l,1))}i=s}}}},function(t,e){t.exports=".ck-content code{background-color:hsla(0,0%,78%,.3);padding:.15em;border-radius:2px}.ck.ck-editor__editable .ck-code_selected{background-color:hsla(0,0%,78%,.5)}"},function(t,e,i){"use strict";i.r(e),i.d(e,"Bold",(function(){return a})),i.d(e,"BoldEditing",(function(){return s})),i.d(e,"BoldUI",(function(){return c})),i.d(e,"Code",(function(){return p})),i.d(e,"CodeEditing",(function(){return d})),i.d(e,"CodeUI",(function(){return g})),i.d(e,"Italic",(function(){return b})),i.d(e,"ItalicEditing",(function(){return m})),i.d(e,"ItalicUI",(function(){return h})),i.d(e,"Strikethrough",(function(){return w})),i.d(e,"StrikethroughEditing",(function(){return f})),i.d(e,"StrikethroughUI",(function(){return v})),i.d(e,"Subscript",(function(){return E})),i.d(e,"SubscriptEditing",(function(){return x})),i.d(e,"SubscriptUI",(function(){return y})),i.d(e,"Superscript",(function(){return k})),i.d(e,"SuperscriptEditing",(function(){return S})),i.d(e,"SuperscriptUI",(function(){return T})),i.d(e,"Underline",(function(){return I})),i.d(e,"UnderlineEditing",(function(){return A})),i.d(e,"UnderlineUI",(function(){return C}));var n=i(0);class r extends n.Command{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 r=e.schema.getValidRanges(i.getRanges(),this.attributeKey);for(const e of r)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 s extends n.Plugin{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 r(t,"bold")),t.keystrokes.set("CTRL+B","bold")}}var o=i(1);class c extends n.Plugin{static get pluginName(){return"BoldUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("bold",i=>{const n=t.commands.get("bold"),r=new o.ButtonView(i);return r.set({label:e("Bold"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.187 17H5.773c-.637 0-1.092-.138-1.364-.415-.273-.277-.409-.718-.409-1.323V4.738c0-.617.14-1.062.419-1.332.279-.27.73-.406 1.354-.406h4.68c.69 0 1.288.041 1.793.124.506.083.96.242 1.36.478.341.197.644.447.906.75a3.262 3.262 0 0 1 .808 2.162c0 1.401-.722 2.426-2.167 3.075C15.05 10.175 16 11.315 16 13.01a3.756 3.756 0 0 1-2.296 3.504 6.1 6.1 0 0 1-1.517.377c-.571.073-1.238.11-2 .11zm-.217-6.217H7v4.087h3.069c1.977 0 2.965-.69 2.965-2.072 0-.707-.256-1.22-.768-1.537-.512-.319-1.277-.478-2.296-.478zM7 5.13v3.619h2.606c.729 0 1.292-.067 1.69-.2a1.6 1.6 0 0 0 .91-.765c.165-.267.247-.566.247-.897 0-.707-.26-1.176-.778-1.409-.519-.232-1.31-.348-2.375-.348H7z"/></svg>',keystroke:"CTRL+B",tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("bold"),t.editing.view.focus()}),r})}}class a extends n.Plugin{static get requires(){return[s,c]}static get pluginName(){return"Bold"}}var u=i(2);const l="code";class d extends n.Plugin{static get pluginName(){return"CodeEditing"}static get requires(){return[u.TwoStepCaretMovement]}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:l}),t.model.schema.setAttributeProperties(l,{isFormatting:!0,copyOnEnter:!1}),t.conversion.attributeToElement({model:l,view:"code",upcastAlso:{styles:{"word-wrap":"break-word"}}}),t.commands.add(l,new r(t,l)),t.plugins.get(u.TwoStepCaretMovement).registerAttribute(l),Object(u.inlineHighlight)(t,l,"code","ck-code_selected")}}i(4);class g extends n.Plugin{static get pluginName(){return"CodeUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("code",i=>{const n=t.commands.get("code"),r=new o.ButtonView(i);return r.set({label:e("Code"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m12.5 5.7 5.2 3.9v1.3l-5.6 4c-.1.2-.3.2-.5.2-.3-.1-.6-.7-.6-1l.3-.4 4.7-3.5L11.5 7l-.2-.2c-.1-.3-.1-.6 0-.8.2-.2.5-.4.8-.4a.8.8 0 0 1 .4.1zm-5.2 0L2 9.6v1.3l5.6 4c.1.2.3.2.5.2.3-.1.7-.7.6-1 0-.1 0-.3-.2-.4l-5-3.5L8.2 7l.2-.2c.1-.3.1-.6 0-.8-.2-.2-.5-.4-.8-.4a.8.8 0 0 0-.3.1z"/></svg>',tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("code"),t.editing.view.focus()}),r})}}class p extends n.Plugin{static get requires(){return[d,g]}static get pluginName(){return"Code"}}class m extends n.Plugin{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 r(t,"italic")),t.keystrokes.set("CTRL+I","italic")}}class h extends n.Plugin{static get pluginName(){return"ItalicUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("italic",i=>{const n=t.commands.get("italic"),r=new o.ButtonView(i);return r.set({label:e("Italic"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m9.586 14.633.021.004c-.036.335.095.655.393.962.082.083.173.15.274.201h1.474a.6.6 0 1 1 0 1.2H5.304a.6.6 0 0 1 0-1.2h1.15c.474-.07.809-.182 1.005-.334.157-.122.291-.32.404-.597l2.416-9.55a1.053 1.053 0 0 0-.281-.823 1.12 1.12 0 0 0-.442-.296H8.15a.6.6 0 0 1 0-1.2h6.443a.6.6 0 1 1 0 1.2h-1.195c-.376.056-.65.155-.823.296-.215.175-.423.439-.623.79l-2.366 9.347z"/></svg>',keystroke:"CTRL+I",tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("italic"),t.editing.view.focus()}),r})}}class b extends n.Plugin{static get requires(){return[m,h]}static get pluginName(){return"Italic"}}class f extends n.Plugin{static get pluginName(){return"StrikethroughEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"strikethrough"}),t.model.schema.setAttributeProperties("strikethrough",{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:"strikethrough",view:"s",upcastAlso:["del","strike",{styles:{"text-decoration":"line-through"}}]}),t.commands.add("strikethrough",new r(t,"strikethrough")),t.keystrokes.set("CTRL+SHIFT+X","strikethrough")}}class v extends n.Plugin{static get pluginName(){return"StrikethroughUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("strikethrough",i=>{const n=t.commands.get("strikethrough"),r=new o.ButtonView(i);return r.set({label:e("Strikethrough"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 16.4c-.8-.4-1.5-.9-2.2-1.5a.6.6 0 0 1-.2-.5l.3-.6h1c1 1.2 2.1 1.7 3.7 1.7 1 0 1.8-.3 2.3-.6.6-.4.6-1.2.6-1.3.2-1.2-.9-2.1-.9-2.1h2.1c.3.7.4 1.2.4 1.7v.8l-.6 1.2c-.6.8-1.1 1-1.6 1.2a6 6 0 0 1-2.4.6c-1 0-1.8-.3-2.5-.6zM6.8 9 6 8.3c-.4-.5-.5-.8-.5-1.6 0-.7.1-1.3.5-1.8.4-.6 1-1 1.6-1.3a6.3 6.3 0 0 1 4.7 0 4 4 0 0 1 1.7 1l.3.7c0 .1.2.4-.2.7-.4.2-.9.1-1 0a3 3 0 0 0-1.2-1c-.4-.2-1-.3-2-.4-.7 0-1.4.2-2 .6-.8.6-1 .8-1 1.5 0 .8.5 1 1.2 1.5.6.4 1.1.7 1.9 1H6.8z"/><path d="M3 10.5V9h14v1.5z"/></svg>',keystroke:"CTRL+SHIFT+X",tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("strikethrough"),t.editing.view.focus()}),r})}}class w extends n.Plugin{static get requires(){return[f,v]}static get pluginName(){return"Strikethrough"}}class x extends n.Plugin{static get pluginName(){return"SubscriptEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"subscript"}),t.model.schema.setAttributeProperties("subscript",{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:"subscript",view:"sub",upcastAlso:[{styles:{"vertical-align":"sub"}}]}),t.commands.add("subscript",new r(t,"subscript"))}}class y extends n.Plugin{static get pluginName(){return"SubscriptUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("subscript",i=>{const n=t.commands.get("subscript"),r=new o.ButtonView(i);return r.set({label:e("Subscript"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m7.03 10.349 3.818-3.819a.8.8 0 1 1 1.132 1.132L8.16 11.48l3.819 3.818a.8.8 0 1 1-1.132 1.132L7.03 12.61l-3.818 3.82a.8.8 0 1 1-1.132-1.132L5.9 11.48 2.08 7.662A.8.8 0 1 1 3.212 6.53l3.818 3.82zm8.147 7.829h2.549c.254 0 .447.05.58.152a.49.49 0 0 1 .201.413.54.54 0 0 1-.159.393c-.105.108-.266.162-.48.162h-3.594c-.245 0-.435-.066-.572-.197a.621.621 0 0 1-.205-.463c0-.114.044-.265.132-.453a1.62 1.62 0 0 1 .288-.444c.433-.436.824-.81 1.172-1.122.348-.312.597-.517.747-.615.267-.183.49-.368.667-.553.177-.185.312-.375.405-.57.093-.194.139-.384.139-.57a1.008 1.008 0 0 0-.554-.917 1.197 1.197 0 0 0-.56-.133c-.426 0-.761.182-1.005.546a2.332 2.332 0 0 0-.164.39 1.609 1.609 0 0 1-.258.488c-.096.114-.237.17-.423.17a.558.558 0 0 1-.405-.156.568.568 0 0 1-.161-.427c0-.218.05-.446.151-.683.101-.238.252-.453.452-.646s.454-.349.762-.467a2.998 2.998 0 0 1 1.081-.178c.498 0 .923.076 1.274.228a1.916 1.916 0 0 1 1.004 1.032 1.984 1.984 0 0 1-.156 1.794c-.2.32-.405.572-.613.754-.208.182-.558.468-1.048.857-.49.39-.826.691-1.008.906a2.703 2.703 0 0 0-.24.309z"/></svg>',tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("subscript"),t.editing.view.focus()}),r})}}class E extends n.Plugin{static get requires(){return[x,y]}static get pluginName(){return"Subscript"}}class S extends n.Plugin{static get pluginName(){return"SuperscriptEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"superscript"}),t.model.schema.setAttributeProperties("superscript",{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:"superscript",view:"sup",upcastAlso:[{styles:{"vertical-align":"super"}}]}),t.commands.add("superscript",new r(t,"superscript"))}}class T extends n.Plugin{static get pluginName(){return"SuperscriptUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("superscript",i=>{const n=t.commands.get("superscript"),r=new o.ButtonView(i);return r.set({label:e("Superscript"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M15.677 8.678h2.549c.254 0 .447.05.58.152a.49.49 0 0 1 .201.413.54.54 0 0 1-.159.393c-.105.108-.266.162-.48.162h-3.594c-.245 0-.435-.066-.572-.197a.621.621 0 0 1-.205-.463c0-.114.044-.265.132-.453a1.62 1.62 0 0 1 .288-.444c.433-.436.824-.81 1.172-1.122.348-.312.597-.517.747-.615.267-.183.49-.368.667-.553.177-.185.312-.375.405-.57.093-.194.139-.384.139-.57a1.008 1.008 0 0 0-.554-.917 1.197 1.197 0 0 0-.56-.133c-.426 0-.761.182-1.005.546a2.332 2.332 0 0 0-.164.39 1.609 1.609 0 0 1-.258.488c-.096.114-.237.17-.423.17a.558.558 0 0 1-.405-.156.568.568 0 0 1-.161-.427c0-.218.05-.446.151-.683.101-.238.252-.453.452-.646s.454-.349.762-.467a2.998 2.998 0 0 1 1.081-.178c.498 0 .923.076 1.274.228a1.916 1.916 0 0 1 1.004 1.032 1.984 1.984 0 0 1-.156 1.794c-.2.32-.405.572-.613.754-.208.182-.558.468-1.048.857-.49.39-.826.691-1.008.906a2.703 2.703 0 0 0-.24.309zM7.03 10.349l3.818-3.819a.8.8 0 1 1 1.132 1.132L8.16 11.48l3.819 3.818a.8.8 0 1 1-1.132 1.132L7.03 12.61l-3.818 3.82a.8.8 0 1 1-1.132-1.132L5.9 11.48 2.08 7.662A.8.8 0 1 1 3.212 6.53l3.818 3.82z"/></svg>',tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("superscript"),t.editing.view.focus()}),r})}}class k extends n.Plugin{static get requires(){return[S,T]}static get pluginName(){return"Superscript"}}class A extends n.Plugin{static get pluginName(){return"UnderlineEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"underline"}),t.model.schema.setAttributeProperties("underline",{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:"underline",view:"u",upcastAlso:{styles:{"text-decoration":"underline"}}}),t.commands.add("underline",new r(t,"underline")),t.keystrokes.set("CTRL+U","underline")}}class C extends n.Plugin{static get pluginName(){return"UnderlineUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("underline",i=>{const n=t.commands.get("underline"),r=new o.ButtonView(i);return r.set({label:e("Underline"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 18v-1.5h14V18zm2.2-8V3.6c0-.4.4-.6.8-.6.3 0 .7.2.7.6v6.2c0 2 1.3 2.8 3.2 2.8 1.9 0 3.4-.9 3.4-2.9V3.6c0-.3.4-.5.8-.5.3 0 .7.2.7.5V10c0 2.7-2.2 4-4.9 4-2.6 0-4.7-1.2-4.7-4z"/></svg>',keystroke:"CTRL+U",tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("underline"),t.editing.view.focus()}),r})}}class I extends n.Plugin{static get requires(){return[A,C]}static get pluginName(){return"Underline"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/block-quote.js b/core/assets/vendor/ckeditor5/block-quote.js
new file mode 100644
index 0000000000000000000000000000000000000000..8900c3492a410b5277906c4a0feb4b9983faf7ab
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/block-quote.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.blockQuote=function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=9)}([function(e,t,n){e.exports=n(1)("./src/core.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,n){e.exports=n(1)("./src/utils.js")},function(e,t,n){e.exports=n(1)("./src/enter.js")},function(e,t,n){e.exports=n(1)("./src/typing.js")},function(e,t,n){e.exports=n(1)("./src/ui.js")},function(e,t,n){var o=n(7),r=n(8);"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var i={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};o(r,i);e.exports=r.locals||{}},function(e,t,n){"use strict";var o,r=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},i=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),c=[];function s(e){for(var t=-1,n=0;n<c.length;n++)if(c[n].identifier===e){t=n;break}return t}function l(e,t){for(var n={},o=[],r=0;r<e.length;r++){var i=e[r],l=t.base?i[0]+t.base:i[0],u=n[l]||0,a="".concat(l," ").concat(u);n[l]=u+1;var d=s(a),f={css:i[1],media:i[2],sourceMap:i[3]};-1!==d?(c[d].references++,c[d].updater(f)):c.push({identifier:a,updater:b(f,t),references:1}),o.push(a)}return o}function u(e){var t=document.createElement("style"),o=e.attributes||{};if(void 0===o.nonce){var r=n.nc;r&&(o.nonce=r)}if(Object.keys(o).forEach((function(e){t.setAttribute(e,o[e])})),"function"==typeof e.insert)e.insert(t);else{var c=i(e.insert||"head");if(!c)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");c.appendChild(t)}return t}var a,d=(a=[],function(e,t){return a[e]=t,a.filter(Boolean).join("\n")});function f(e,t,n,o){var r=n?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(e.styleSheet)e.styleSheet.cssText=d(t,r);else{var i=document.createTextNode(r),c=e.childNodes;c[t]&&e.removeChild(c[t]),c.length?e.insertBefore(i,c[t]):e.appendChild(i)}}function p(e,t,n){var o=n.css,r=n.media,i=n.sourceMap;if(r?e.setAttribute("media",r):e.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleSheet)e.styleSheet.cssText=o;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(o))}}var m=null,h=0;function b(e,t){var n,o,r;if(t.singleton){var i=h++;n=m||(m=u(t)),o=f.bind(null,n,i,!1),r=f.bind(null,n,i,!0)}else n=u(t),o=p.bind(null,n,t),r=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else r()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=r());var n=l(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var o=0;o<n.length;o++){var r=s(n[o]);c[r].references--}for(var i=l(e,t),u=0;u<n.length;u++){var a=s(n[u]);0===c[a].references&&(c[a].updater(),c.splice(a,1))}n=i}}}},function(e,t){e.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(e,t,n){"use strict";n.r(t),n.d(t,"BlockQuote",(function(){return m})),n.d(t,"BlockQuoteEditing",(function(){return d})),n.d(t,"BlockQuoteUI",(function(){return p}));var o=n(0),r=n(3),i=n(4),c=n(2);class s extends o.Command{refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(e={}){const t=this.editor.model,n=t.schema,o=t.document.selection,r=Array.from(o.getSelectedBlocks()),i=void 0===e.forceValue?!this.value:e.forceValue;t.change(e=>{if(i){const t=r.filter(e=>l(e)||a(n,e));this._applyQuote(e,t)}else this._removeQuote(e,r.filter(l))})}_getValue(){const e=this.editor.model.document.selection,t=Object(c.first)(e.getSelectedBlocks());return!(!t||!l(t))}_checkEnabled(){if(this.value)return!0;const e=this.editor.model.document.selection,t=this.editor.model.schema,n=Object(c.first)(e.getSelectedBlocks());return!!n&&a(t,n)}_removeQuote(e,t){u(e,t).reverse().forEach(t=>{if(t.start.isAtStart&&t.end.isAtEnd)return void e.unwrap(t.start.parent);if(t.start.isAtStart){const n=e.createPositionBefore(t.start.parent);return void e.move(t,n)}t.end.isAtEnd||e.split(t.end);const n=e.createPositionAfter(t.end.parent);e.move(t,n)})}_applyQuote(e,t){const n=[];u(e,t).reverse().forEach(t=>{let o=l(t.start);o||(o=e.createElement("blockQuote"),e.wrap(t,o)),n.push(o)}),n.reverse().reduce((t,n)=>t.nextSibling==n?(e.merge(e.createPositionAfter(t)),t):n)}}function l(e){return"blockQuote"==e.parent.name?e.parent:null}function u(e,t){let n,o=0;const r=[];for(;o<t.length;){const i=t[o],c=t[o+1];n||(n=e.createPositionBefore(i)),c&&i.nextSibling==c||(r.push(e.createRange(n,e.createPositionAfter(i))),n=null),o++}return r}function a(e,t){const n=e.checkChild(t.parent,"blockQuote"),o=e.checkChild(["$root","blockQuote"],t);return n&&o}class d extends o.Plugin{static get pluginName(){return"BlockQuoteEditing"}static get requires(){return[r.Enter,i.Delete]}init(){const e=this.editor,t=e.model.schema;e.commands.add("blockQuote",new s(e)),t.register("blockQuote",{allowWhere:"$block",allowContentOf:"$root"}),e.conversion.elementToElement({model:"blockQuote",view:"blockquote"}),e.model.document.registerPostFixer(n=>{const o=e.model.document.differ.getChanges();for(const e of o)if("insert"==e.type){const o=e.position.nodeAfter;if(!o)continue;if(o.is("element","blockQuote")&&o.isEmpty)return n.remove(o),!0;if(o.is("element","blockQuote")&&!t.checkChild(e.position,o))return n.unwrap(o),!0;if(o.is("element")){const e=n.createRangeIn(o);for(const o of e.getItems())if(o.is("element","blockQuote")&&!t.checkChild(n.createPositionBefore(o),o))return n.unwrap(o),!0}}else if("remove"==e.type){const t=e.position.parent;if(t.is("element","blockQuote")&&t.isEmpty)return n.remove(t),!0}return!1});const n=this.editor.editing.view.document,o=e.model.document.selection,r=e.commands.get("blockQuote");this.listenTo(n,"enter",(t,n)=>{if(!o.isCollapsed||!r.value)return;o.getLastPosition().parent.isEmpty&&(e.execute("blockQuote"),e.editing.view.scrollToTheSelection(),n.preventDefault(),t.stop())},{context:"blockquote"}),this.listenTo(n,"delete",(t,n)=>{if("backward"!=n.direction||!o.isCollapsed||!r.value)return;const i=o.getLastPosition().parent;i.isEmpty&&!i.previousSibling&&(e.execute("blockQuote"),e.editing.view.scrollToTheSelection(),n.preventDefault(),t.stop())},{context:"blockquote"})}}var f=n(5);n(6);class p extends o.Plugin{static get pluginName(){return"BlockQuoteUI"}init(){const e=this.editor,t=e.t;e.ui.componentFactory.add("blockQuote",n=>{const r=e.commands.get("blockQuote"),i=new f.ButtonView(n);return i.set({label:t("Block quote"),icon:o.icons.quote,tooltip:!0,isToggleable:!0}),i.bind("isOn","isEnabled").to(r,"value","isEnabled"),this.listenTo(i,"execute",()=>{e.execute("blockQuote"),e.editing.view.focus()}),i})}}class m extends o.Plugin{static get requires(){return[d,p]}static get pluginName(){return"BlockQuote"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/ckeditor5-dll.js b/core/assets/vendor/ckeditor5/ckeditor5-dll.js
new file mode 100644
index 0000000000000000000000000000000000000000..878b81535de0b4a2682705ad80c58c31a2dc762d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/ckeditor5-dll.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Aquamarine",Black:"Black",Blue:"Blue",Cancel:"Cancel","Dim grey":"Dim grey","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Editor toolbar":"Editor toolbar",Green:"Green",Grey:"Grey","Insert paragraph after block":"Insert paragraph after block","Insert paragraph before block":"Insert paragraph before block","Light blue":"Light blue","Light green":"Light green","Light grey":"Light grey",Next:"Next",Orange:"Orange",Previous:"Previous",Purple:"Purple",Red:"Red",Redo:"Redo","Remove color":"Remove color","Restore default":"Restore default","Rich Text Editor":"Rich Text Editor","Rich Text Editor, %0":"Rich Text Editor, %0",Save:"Save","Select all":"Select all","Show more items":"Show more items",Turquoise:"Turquoise",Undo:"Undo","Upload in progress":"Upload in progress",White:"White","Widget toolbar":"Widget toolbar",Yellow:"Yellow"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.dll=function(e){var t={};function o(i){if(t[i])return t[i].exports;var s=t[i]={i:i,l:!1,exports:{}};return e[i].call(s.exports,s,s.exports,o),s.l=!0,s.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)o.d(i,s,function(t){return e[t]}.bind(null,s));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}({"./node_modules/lodash-es/_ListCache.js":function(e,t,o){"use strict";var i=function(){this.__data__=[],this.size=0},s=o("./node_modules/lodash-es/eq.js");var r=function(e,t){for(var o=e.length;o--;)if(Object(s.a)(e[o][0],t))return o;return-1},n=Array.prototype.splice;var a=function(e){var t=this.__data__,o=r(t,e);return!(o<0)&&(o==t.length-1?t.pop():n.call(t,o,1),--this.size,!0)};var c=function(e){var t=this.__data__,o=r(t,e);return o<0?void 0:t[o][1]};var l=function(e){return r(this.__data__,e)>-1};var d=function(e,t){var o=this.__data__,i=r(o,e);return i<0?(++this.size,o.push([e,t])):o[i][1]=t,this};function u(e){var t=-1,o=null==e?0:e.length;for(this.clear();++t<o;){var i=e[t];this.set(i[0],i[1])}}u.prototype.clear=i,u.prototype.delete=a,u.prototype.get=c,u.prototype.has=l,u.prototype.set=d;t.a=u},"./node_modules/lodash-es/_Map.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_getNative.js"),s=o("./node_modules/lodash-es/_root.js"),r=Object(i.a)(s.a,"Map");t.a=r},"./node_modules/lodash-es/_MapCache.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_getNative.js"),s=Object(i.a)(Object,"create");var r=function(){this.__data__=s?s(null):{},this.size=0};var n=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},a=Object.prototype.hasOwnProperty;var c=function(e){var t=this.__data__;if(s){var o=t[e];return"__lodash_hash_undefined__"===o?void 0:o}return a.call(t,e)?t[e]:void 0},l=Object.prototype.hasOwnProperty;var d=function(e){var t=this.__data__;return s?void 0!==t[e]:l.call(t,e)};var u=function(e,t){var o=this.__data__;return this.size+=this.has(e)?0:1,o[e]=s&&void 0===t?"__lodash_hash_undefined__":t,this};function h(e){var t=-1,o=null==e?0:e.length;for(this.clear();++t<o;){var i=e[t];this.set(i[0],i[1])}}h.prototype.clear=r,h.prototype.delete=n,h.prototype.get=c,h.prototype.has=d,h.prototype.set=u;var p=h,g=o("./node_modules/lodash-es/_ListCache.js"),f=o("./node_modules/lodash-es/_Map.js");var m=function(){this.size=0,this.__data__={hash:new p,map:new(f.a||g.a),string:new p}};var k=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e};var b=function(e,t){var o=e.__data__;return k(t)?o["string"==typeof t?"string":"hash"]:o.map};var _=function(e){var t=b(this,e).delete(e);return this.size-=t?1:0,t};var w=function(e){return b(this,e).get(e)};var v=function(e){return b(this,e).has(e)};var y=function(e,t){var o=b(this,e),i=o.size;return o.set(e,t),this.size+=o.size==i?0:1,this};function j(e){var t=-1,o=null==e?0:e.length;for(this.clear();++t<o;){var i=e[t];this.set(i[0],i[1])}}j.prototype.clear=m,j.prototype.delete=_,j.prototype.get=w,j.prototype.has=v,j.prototype.set=y;t.a=j},"./node_modules/lodash-es/_Stack.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_ListCache.js");var s=function(){this.__data__=new i.a,this.size=0};var r=function(e){var t=this.__data__,o=t.delete(e);return this.size=t.size,o};var n=function(e){return this.__data__.get(e)};var a=function(e){return this.__data__.has(e)},c=o("./node_modules/lodash-es/_Map.js"),l=o("./node_modules/lodash-es/_MapCache.js");var d=function(e,t){var o=this.__data__;if(o instanceof i.a){var s=o.__data__;if(!c.a||s.length<199)return s.push([e,t]),this.size=++o.size,this;o=this.__data__=new l.a(s)}return o.set(e,t),this.size=o.size,this};function u(e){var t=this.__data__=new i.a(e);this.size=t.size}u.prototype.clear=s,u.prototype.delete=r,u.prototype.get=n,u.prototype.has=a,u.prototype.set=d;t.a=u},"./node_modules/lodash-es/_Symbol.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_root.js").a.Symbol;t.a=i},"./node_modules/lodash-es/_Uint8Array.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_root.js").a.Uint8Array;t.a=i},"./node_modules/lodash-es/_arrayLikeKeys.js":function(e,t,o){"use strict";var i=function(e,t){for(var o=-1,i=Array(e);++o<e;)i[o]=t(o);return i},s=o("./node_modules/lodash-es/isArguments.js"),r=o("./node_modules/lodash-es/isArray.js"),n=o("./node_modules/lodash-es/isBuffer.js"),a=o("./node_modules/lodash-es/_isIndex.js"),c=o("./node_modules/lodash-es/isTypedArray.js"),l=Object.prototype.hasOwnProperty;t.a=function(e,t){var o=Object(r.a)(e),d=!o&&Object(s.a)(e),u=!o&&!d&&Object(n.a)(e),h=!o&&!d&&!u&&Object(c.a)(e),p=o||d||u||h,g=p?i(e.length,String):[],f=g.length;for(var m in e)!t&&!l.call(e,m)||p&&("length"==m||u&&("offset"==m||"parent"==m)||h&&("buffer"==m||"byteLength"==m||"byteOffset"==m)||Object(a.a)(m,f))||g.push(m);return g}},"./node_modules/lodash-es/_arrayPush.js":function(e,t,o){"use strict";t.a=function(e,t){for(var o=-1,i=t.length,s=e.length;++o<i;)e[s+o]=t[o];return e}},"./node_modules/lodash-es/_assignValue.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseAssignValue.js"),s=o("./node_modules/lodash-es/eq.js"),r=Object.prototype.hasOwnProperty;t.a=function(e,t,o){var n=e[t];r.call(e,t)&&Object(s.a)(n,o)&&(void 0!==o||t in e)||Object(i.a)(e,t,o)}},"./node_modules/lodash-es/_baseAssignValue.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_defineProperty.js");t.a=function(e,t,o){"__proto__"==t&&i.a?Object(i.a)(e,t,{configurable:!0,enumerable:!0,value:o,writable:!0}):e[t]=o}},"./node_modules/lodash-es/_baseClone.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_Stack.js");var s=function(e,t){for(var o=-1,i=null==e?0:e.length;++o<i&&!1!==t(e[o],o,e););return e},r=o("./node_modules/lodash-es/_assignValue.js"),n=o("./node_modules/lodash-es/_copyObject.js"),a=o("./node_modules/lodash-es/keys.js");var c=function(e,t){return e&&Object(n.a)(t,Object(a.a)(t),e)},l=o("./node_modules/lodash-es/keysIn.js");var d=function(e,t){return e&&Object(n.a)(t,Object(l.a)(t),e)},u=o("./node_modules/lodash-es/_cloneBuffer.js"),h=o("./node_modules/lodash-es/_copyArray.js"),p=o("./node_modules/lodash-es/_getSymbols.js");var g=function(e,t){return Object(n.a)(e,Object(p.a)(e),t)},f=o("./node_modules/lodash-es/_arrayPush.js"),m=o("./node_modules/lodash-es/_getPrototype.js"),k=o("./node_modules/lodash-es/stubArray.js"),b=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)Object(f.a)(t,Object(p.a)(e)),e=Object(m.a)(e);return t}:k.a;var _=function(e,t){return Object(n.a)(e,b(e),t)},w=o("./node_modules/lodash-es/_getAllKeys.js"),v=o("./node_modules/lodash-es/_baseGetAllKeys.js");var y=function(e){return Object(v.a)(e,l.a,b)},j=o("./node_modules/lodash-es/_getTag.js"),x=Object.prototype.hasOwnProperty;var P=function(e){var t=e.length,o=new e.constructor(t);return t&&"string"==typeof e[0]&&x.call(e,"index")&&(o.index=e.index,o.input=e.input),o},O=o("./node_modules/lodash-es/_cloneArrayBuffer.js");var A=function(e,t){var o=t?Object(O.a)(e.buffer):e.buffer;return new e.constructor(o,e.byteOffset,e.byteLength)},T=/\w*$/;var C=function(e){var t=new e.constructor(e.source,T.exec(e));return t.lastIndex=e.lastIndex,t},E=o("./node_modules/lodash-es/_Symbol.js"),S=E.a?E.a.prototype:void 0,R=S?S.valueOf:void 0;var M=function(e){return R?Object(R.call(e)):{}},N=o("./node_modules/lodash-es/_cloneTypedArray.js");var I=function(e,t,o){var i=e.constructor;switch(t){case"[object ArrayBuffer]":return Object(O.a)(e);case"[object Boolean]":case"[object Date]":return new i(+e);case"[object DataView]":return A(e,o);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return Object(N.a)(e,o);case"[object Map]":return new i;case"[object Number]":case"[object String]":return new i(e);case"[object RegExp]":return C(e);case"[object Set]":return new i;case"[object Symbol]":return M(e)}},z=o("./node_modules/lodash-es/_initCloneObject.js"),V=o("./node_modules/lodash-es/isArray.js"),D=o("./node_modules/lodash-es/isBuffer.js"),B=o("./node_modules/lodash-es/isObjectLike.js");var F=function(e){return Object(B.a)(e)&&"[object Map]"==Object(j.a)(e)},L=o("./node_modules/lodash-es/_baseUnary.js"),W=o("./node_modules/lodash-es/_nodeUtil.js"),H=W.a&&W.a.isMap,q=H?Object(L.a)(H):F,$=o("./node_modules/lodash-es/isObject.js");var U=function(e){return Object(B.a)(e)&&"[object Set]"==Object(j.a)(e)},K=W.a&&W.a.isSet,G=K?Object(L.a)(K):U,J={};J["[object Arguments]"]=J["[object Array]"]=J["[object ArrayBuffer]"]=J["[object DataView]"]=J["[object Boolean]"]=J["[object Date]"]=J["[object Float32Array]"]=J["[object Float64Array]"]=J["[object Int8Array]"]=J["[object Int16Array]"]=J["[object Int32Array]"]=J["[object Map]"]=J["[object Number]"]=J["[object Object]"]=J["[object RegExp]"]=J["[object Set]"]=J["[object String]"]=J["[object Symbol]"]=J["[object Uint8Array]"]=J["[object Uint8ClampedArray]"]=J["[object Uint16Array]"]=J["[object Uint32Array]"]=!0,J["[object Error]"]=J["[object Function]"]=J["[object WeakMap]"]=!1;t.a=function e(t,o,n,p,f,m){var k,b=1&o,v=2&o,x=4&o;if(n&&(k=f?n(t,p,f,m):n(t)),void 0!==k)return k;if(!Object($.a)(t))return t;var O=Object(V.a)(t);if(O){if(k=P(t),!b)return Object(h.a)(t,k)}else{var A=Object(j.a)(t),T="[object Function]"==A||"[object GeneratorFunction]"==A;if(Object(D.a)(t))return Object(u.a)(t,b);if("[object Object]"==A||"[object Arguments]"==A||T&&!f){if(k=v||T?{}:Object(z.a)(t),!b)return v?_(t,d(k,t)):g(t,c(k,t))}else{if(!J[A])return f?t:{};k=I(t,A,b)}}m||(m=new i.a);var C=m.get(t);if(C)return C;m.set(t,k),G(t)?t.forEach((function(i){k.add(e(i,o,n,i,t,m))})):q(t)&&t.forEach((function(i,s){k.set(s,e(i,o,n,s,t,m))}));var E=x?v?y:w.a:v?l.a:a.a,S=O?void 0:E(t);return s(S||t,(function(i,s){S&&(i=t[s=i]),Object(r.a)(k,s,e(i,o,n,s,t,m))})),k}},"./node_modules/lodash-es/_baseGetAllKeys.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_arrayPush.js"),s=o("./node_modules/lodash-es/isArray.js");t.a=function(e,t,o){var r=t(e);return Object(s.a)(e)?r:Object(i.a)(r,o(e))}},"./node_modules/lodash-es/_baseGetTag.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_Symbol.js"),s=Object.prototype,r=s.hasOwnProperty,n=s.toString,a=i.a?i.a.toStringTag:void 0;var c=function(e){var t=r.call(e,a),o=e[a];try{e[a]=void 0;var i=!0}catch(e){}var s=n.call(e);return i&&(t?e[a]=o:delete e[a]),s},l=Object.prototype.toString;var d=function(e){return l.call(e)},u=i.a?i.a.toStringTag:void 0;t.a=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":u&&u in Object(e)?c(e):d(e)}},"./node_modules/lodash-es/_baseIsEqual.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_Stack.js"),s=o("./node_modules/lodash-es/_MapCache.js");var r=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this};var n=function(e){return this.__data__.has(e)};function a(e){var t=-1,o=null==e?0:e.length;for(this.__data__=new s.a;++t<o;)this.add(e[t])}a.prototype.add=a.prototype.push=r,a.prototype.has=n;var c=a;var l=function(e,t){for(var o=-1,i=null==e?0:e.length;++o<i;)if(t(e[o],o,e))return!0;return!1};var d=function(e,t){return e.has(t)};var u=function(e,t,o,i,s,r){var n=1&o,a=e.length,u=t.length;if(a!=u&&!(n&&u>a))return!1;var h=r.get(e),p=r.get(t);if(h&&p)return h==t&&p==e;var g=-1,f=!0,m=2&o?new c:void 0;for(r.set(e,t),r.set(t,e);++g<a;){var k=e[g],b=t[g];if(i)var _=n?i(b,k,g,t,e,r):i(k,b,g,e,t,r);if(void 0!==_){if(_)continue;f=!1;break}if(m){if(!l(t,(function(e,t){if(!d(m,t)&&(k===e||s(k,e,o,i,r)))return m.push(t)}))){f=!1;break}}else if(k!==b&&!s(k,b,o,i,r)){f=!1;break}}return r.delete(e),r.delete(t),f},h=o("./node_modules/lodash-es/_Symbol.js"),p=o("./node_modules/lodash-es/_Uint8Array.js"),g=o("./node_modules/lodash-es/eq.js");var f=function(e){var t=-1,o=Array(e.size);return e.forEach((function(e,i){o[++t]=[i,e]})),o};var m=function(e){var t=-1,o=Array(e.size);return e.forEach((function(e){o[++t]=e})),o},k=h.a?h.a.prototype:void 0,b=k?k.valueOf:void 0;var _=function(e,t,o,i,s,r,n){switch(o){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!r(new p.a(e),new p.a(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return Object(g.a)(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var a=f;case"[object Set]":var c=1&i;if(a||(a=m),e.size!=t.size&&!c)return!1;var l=n.get(e);if(l)return l==t;i|=2,n.set(e,t);var d=u(a(e),a(t),i,s,r,n);return n.delete(e),d;case"[object Symbol]":if(b)return b.call(e)==b.call(t)}return!1},w=o("./node_modules/lodash-es/_getAllKeys.js"),v=Object.prototype.hasOwnProperty;var y=function(e,t,o,i,s,r){var n=1&o,a=Object(w.a)(e),c=a.length;if(c!=Object(w.a)(t).length&&!n)return!1;for(var l=c;l--;){var d=a[l];if(!(n?d in t:v.call(t,d)))return!1}var u=r.get(e),h=r.get(t);if(u&&h)return u==t&&h==e;var p=!0;r.set(e,t),r.set(t,e);for(var g=n;++l<c;){var f=e[d=a[l]],m=t[d];if(i)var k=n?i(m,f,d,t,e,r):i(f,m,d,e,t,r);if(!(void 0===k?f===m||s(f,m,o,i,r):k)){p=!1;break}g||(g="constructor"==d)}if(p&&!g){var b=e.constructor,_=t.constructor;b==_||!("constructor"in e)||!("constructor"in t)||"function"==typeof b&&b instanceof b&&"function"==typeof _&&_ instanceof _||(p=!1)}return r.delete(e),r.delete(t),p},j=o("./node_modules/lodash-es/_getTag.js"),x=o("./node_modules/lodash-es/isArray.js"),P=o("./node_modules/lodash-es/isBuffer.js"),O=o("./node_modules/lodash-es/isTypedArray.js"),A="[object Object]",T=Object.prototype.hasOwnProperty;var C=function(e,t,o,s,r,n){var a=Object(x.a)(e),c=Object(x.a)(t),l=a?"[object Array]":Object(j.a)(e),d=c?"[object Array]":Object(j.a)(t),h=(l="[object Arguments]"==l?A:l)==A,p=(d="[object Arguments]"==d?A:d)==A,g=l==d;if(g&&Object(P.a)(e)){if(!Object(P.a)(t))return!1;a=!0,h=!1}if(g&&!h)return n||(n=new i.a),a||Object(O.a)(e)?u(e,t,o,s,r,n):_(e,t,l,o,s,r,n);if(!(1&o)){var f=h&&T.call(e,"__wrapped__"),m=p&&T.call(t,"__wrapped__");if(f||m){var k=f?e.value():e,b=m?t.value():t;return n||(n=new i.a),r(k,b,o,s,n)}}return!!g&&(n||(n=new i.a),y(e,t,o,s,r,n))},E=o("./node_modules/lodash-es/isObjectLike.js");t.a=function e(t,o,i,s,r){return t===o||(null==t||null==o||!Object(E.a)(t)&&!Object(E.a)(o)?t!=t&&o!=o:C(t,o,i,s,e,r))}},"./node_modules/lodash-es/_baseUnary.js":function(e,t,o){"use strict";t.a=function(e){return function(t){return e(t)}}},"./node_modules/lodash-es/_cloneArrayBuffer.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_Uint8Array.js");t.a=function(e){var t=new e.constructor(e.byteLength);return new i.a(t).set(new i.a(e)),t}},"./node_modules/lodash-es/_cloneBuffer.js":function(e,t,o){"use strict";(function(e){var i=o("./node_modules/lodash-es/_root.js"),s="object"==typeof exports&&exports&&!exports.nodeType&&exports,r=s&&"object"==typeof e&&e&&!e.nodeType&&e,n=r&&r.exports===s?i.a.Buffer:void 0,a=n?n.allocUnsafe:void 0;t.a=function(e,t){if(t)return e.slice();var o=e.length,i=a?a(o):new e.constructor(o);return e.copy(i),i}}).call(this,o("./node_modules/webpack/buildin/harmony-module.js")(e))},"./node_modules/lodash-es/_cloneTypedArray.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_cloneArrayBuffer.js");t.a=function(e,t){var o=t?Object(i.a)(e.buffer):e.buffer;return new e.constructor(o,e.byteOffset,e.length)}},"./node_modules/lodash-es/_copyArray.js":function(e,t,o){"use strict";t.a=function(e,t){var o=-1,i=e.length;for(t||(t=Array(i));++o<i;)t[o]=e[o];return t}},"./node_modules/lodash-es/_copyObject.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_assignValue.js"),s=o("./node_modules/lodash-es/_baseAssignValue.js");t.a=function(e,t,o,r){var n=!o;o||(o={});for(var a=-1,c=t.length;++a<c;){var l=t[a],d=r?r(o[l],e[l],l,o,e):void 0;void 0===d&&(d=e[l]),n?Object(s.a)(o,l,d):Object(i.a)(o,l,d)}return o}},"./node_modules/lodash-es/_createAssigner.js":function(e,t,o){"use strict";var i=function(e){return e};var s=function(e,t,o){switch(o.length){case 0:return e.call(t);case 1:return e.call(t,o[0]);case 2:return e.call(t,o[0],o[1]);case 3:return e.call(t,o[0],o[1],o[2])}return e.apply(t,o)},r=Math.max;var n=function(e,t,o){return t=r(void 0===t?e.length-1:t,0),function(){for(var i=arguments,n=-1,a=r(i.length-t,0),c=Array(a);++n<a;)c[n]=i[t+n];n=-1;for(var l=Array(t+1);++n<t;)l[n]=i[n];return l[t]=o(c),s(e,this,l)}};var a=function(e){return function(){return e}},c=o("./node_modules/lodash-es/_defineProperty.js"),l=c.a?function(e,t){return Object(c.a)(e,"toString",{configurable:!0,enumerable:!1,value:a(t),writable:!0})}:i,d=Date.now;var u=function(e){var t=0,o=0;return function(){var i=d(),s=16-(i-o);if(o=i,s>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(l);var h=function(e,t){return u(n(e,t,i),e+"")},p=o("./node_modules/lodash-es/eq.js"),g=o("./node_modules/lodash-es/isArrayLike.js"),f=o("./node_modules/lodash-es/_isIndex.js"),m=o("./node_modules/lodash-es/isObject.js");var k=function(e,t,o){if(!Object(m.a)(o))return!1;var i=typeof t;return!!("number"==i?Object(g.a)(o)&&Object(f.a)(t,o.length):"string"==i&&t in o)&&Object(p.a)(o[t],e)};t.a=function(e){return h((function(t,o){var i=-1,s=o.length,r=s>1?o[s-1]:void 0,n=s>2?o[2]:void 0;for(r=e.length>3&&"function"==typeof r?(s--,r):void 0,n&&k(o[0],o[1],n)&&(r=s<3?void 0:r,s=1),t=Object(t);++i<s;){var a=o[i];a&&e(t,a,i,r)}return t}))}},"./node_modules/lodash-es/_defineProperty.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_getNative.js"),s=function(){try{var e=Object(i.a)(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();t.a=s},"./node_modules/lodash-es/_freeGlobal.js":function(e,t,o){"use strict";(function(e){var o="object"==typeof e&&e&&e.Object===Object&&e;t.a=o}).call(this,o("./node_modules/webpack/buildin/global.js"))},"./node_modules/lodash-es/_getAllKeys.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseGetAllKeys.js"),s=o("./node_modules/lodash-es/_getSymbols.js"),r=o("./node_modules/lodash-es/keys.js");t.a=function(e){return Object(i.a)(e,r.a,s.a)}},"./node_modules/lodash-es/_getNative.js":function(e,t,o){"use strict";var i,s=o("./node_modules/lodash-es/isFunction.js"),r=o("./node_modules/lodash-es/_root.js").a["__core-js_shared__"],n=(i=/[^.]+$/.exec(r&&r.keys&&r.keys.IE_PROTO||""))?"Symbol(src)_1."+i:"";var a=function(e){return!!n&&n in e},c=o("./node_modules/lodash-es/isObject.js"),l=o("./node_modules/lodash-es/_toSource.js"),d=/^\[object .+?Constructor\]$/,u=Function.prototype,h=Object.prototype,p=u.toString,g=h.hasOwnProperty,f=RegExp("^"+p.call(g).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");var m=function(e){return!(!Object(c.a)(e)||a(e))&&(Object(s.a)(e)?f:d).test(Object(l.a)(e))};var k=function(e,t){return null==e?void 0:e[t]};t.a=function(e,t){var o=k(e,t);return m(o)?o:void 0}},"./node_modules/lodash-es/_getPrototype.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_overArg.js"),s=Object(i.a)(Object.getPrototypeOf,Object);t.a=s},"./node_modules/lodash-es/_getSymbols.js":function(e,t,o){"use strict";var i=function(e,t){for(var o=-1,i=null==e?0:e.length,s=0,r=[];++o<i;){var n=e[o];t(n,o,e)&&(r[s++]=n)}return r},s=o("./node_modules/lodash-es/stubArray.js"),r=Object.prototype.propertyIsEnumerable,n=Object.getOwnPropertySymbols,a=n?function(e){return null==e?[]:(e=Object(e),i(n(e),(function(t){return r.call(e,t)})))}:s.a;t.a=a},"./node_modules/lodash-es/_getTag.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_getNative.js"),s=o("./node_modules/lodash-es/_root.js"),r=Object(i.a)(s.a,"DataView"),n=o("./node_modules/lodash-es/_Map.js"),a=Object(i.a)(s.a,"Promise"),c=Object(i.a)(s.a,"Set"),l=Object(i.a)(s.a,"WeakMap"),d=o("./node_modules/lodash-es/_baseGetTag.js"),u=o("./node_modules/lodash-es/_toSource.js"),h=Object(u.a)(r),p=Object(u.a)(n.a),g=Object(u.a)(a),f=Object(u.a)(c),m=Object(u.a)(l),k=d.a;(r&&"[object DataView]"!=k(new r(new ArrayBuffer(1)))||n.a&&"[object Map]"!=k(new n.a)||a&&"[object Promise]"!=k(a.resolve())||c&&"[object Set]"!=k(new c)||l&&"[object WeakMap]"!=k(new l))&&(k=function(e){var t=Object(d.a)(e),o="[object Object]"==t?e.constructor:void 0,i=o?Object(u.a)(o):"";if(i)switch(i){case h:return"[object DataView]";case p:return"[object Map]";case g:return"[object Promise]";case f:return"[object Set]";case m:return"[object WeakMap]"}return t});t.a=k},"./node_modules/lodash-es/_initCloneObject.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/isObject.js"),s=Object.create,r=function(){function e(){}return function(t){if(!Object(i.a)(t))return{};if(s)return s(t);e.prototype=t;var o=new e;return e.prototype=void 0,o}}(),n=o("./node_modules/lodash-es/_getPrototype.js"),a=o("./node_modules/lodash-es/_isPrototype.js");t.a=function(e){return"function"!=typeof e.constructor||Object(a.a)(e)?{}:r(Object(n.a)(e))}},"./node_modules/lodash-es/_isIndex.js":function(e,t,o){"use strict";var i=/^(?:0|[1-9]\d*)$/;t.a=function(e,t){var o=typeof e;return!!(t=null==t?9007199254740991:t)&&("number"==o||"symbol"!=o&&i.test(e))&&e>-1&&e%1==0&&e<t}},"./node_modules/lodash-es/_isPrototype.js":function(e,t,o){"use strict";var i=Object.prototype;t.a=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||i)}},"./node_modules/lodash-es/_nodeUtil.js":function(e,t,o){"use strict";(function(e){var i=o("./node_modules/lodash-es/_freeGlobal.js"),s="object"==typeof exports&&exports&&!exports.nodeType&&exports,r=s&&"object"==typeof e&&e&&!e.nodeType&&e,n=r&&r.exports===s&&i.a.process,a=function(){try{var e=r&&r.require&&r.require("util").types;return e||n&&n.binding&&n.binding("util")}catch(e){}}();t.a=a}).call(this,o("./node_modules/webpack/buildin/harmony-module.js")(e))},"./node_modules/lodash-es/_overArg.js":function(e,t,o){"use strict";t.a=function(e,t){return function(o){return e(t(o))}}},"./node_modules/lodash-es/_root.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_freeGlobal.js"),s="object"==typeof self&&self&&self.Object===Object&&self,r=i.a||s||Function("return this")();t.a=r},"./node_modules/lodash-es/_toSource.js":function(e,t,o){"use strict";var i=Function.prototype.toString;t.a=function(e){if(null!=e){try{return i.call(e)}catch(e){}try{return e+""}catch(e){}}return""}},"./node_modules/lodash-es/assignIn.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_copyObject.js"),s=o("./node_modules/lodash-es/_createAssigner.js"),r=o("./node_modules/lodash-es/keysIn.js"),n=Object(s.a)((function(e,t){Object(i.a)(t,Object(r.a)(t),e)}));t.a=n},"./node_modules/lodash-es/clone.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseClone.js");t.a=function(e){return Object(i.a)(e,4)}},"./node_modules/lodash-es/cloneDeep.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseClone.js");t.a=function(e){return Object(i.a)(e,5)}},"./node_modules/lodash-es/cloneDeepWith.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseClone.js");t.a=function(e,t){return t="function"==typeof t?t:void 0,Object(i.a)(e,5,t)}},"./node_modules/lodash-es/debounce.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/isObject.js"),s=o("./node_modules/lodash-es/_root.js"),r=function(){return s.a.Date.now()},n=/\s/;var a=function(e){for(var t=e.length;t--&&n.test(e.charAt(t)););return t},c=/^\s+/;var l=function(e){return e?e.slice(0,a(e)+1).replace(c,""):e},d=o("./node_modules/lodash-es/isSymbol.js"),u=/^[-+]0x[0-9a-f]+$/i,h=/^0b[01]+$/i,p=/^0o[0-7]+$/i,g=parseInt;var f=function(e){if("number"==typeof e)return e;if(Object(d.a)(e))return NaN;if(Object(i.a)(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Object(i.a)(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=l(e);var o=h.test(e);return o||p.test(e)?g(e.slice(2),o?2:8):u.test(e)?NaN:+e},m=Math.max,k=Math.min;t.a=function(e,t,o){var s,n,a,c,l,d,u=0,h=!1,p=!1,g=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function b(t){var o=s,i=n;return s=n=void 0,u=t,c=e.apply(i,o)}function _(e){return u=e,l=setTimeout(v,t),h?b(e):c}function w(e){var o=e-d;return void 0===d||o>=t||o<0||p&&e-u>=a}function v(){var e=r();if(w(e))return y(e);l=setTimeout(v,function(e){var o=t-(e-d);return p?k(o,a-(e-u)):o}(e))}function y(e){return l=void 0,g&&s?b(e):(s=n=void 0,c)}function j(){var e=r(),o=w(e);if(s=arguments,n=this,d=e,o){if(void 0===l)return _(d);if(p)return clearTimeout(l),l=setTimeout(v,t),b(d)}return void 0===l&&(l=setTimeout(v,t)),c}return t=f(t)||0,Object(i.a)(o)&&(h=!!o.leading,a=(p="maxWait"in o)?m(f(o.maxWait)||0,t):a,g="trailing"in o?!!o.trailing:g),j.cancel=function(){void 0!==l&&clearTimeout(l),u=0,s=d=n=l=void 0},j.flush=function(){return void 0===l?c:y(r())},j}},"./node_modules/lodash-es/eq.js":function(e,t,o){"use strict";t.a=function(e,t){return e===t||e!=e&&t!=t}},"./node_modules/lodash-es/isArguments.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseGetTag.js"),s=o("./node_modules/lodash-es/isObjectLike.js");var r=function(e){return Object(s.a)(e)&&"[object Arguments]"==Object(i.a)(e)},n=Object.prototype,a=n.hasOwnProperty,c=n.propertyIsEnumerable,l=r(function(){return arguments}())?r:function(e){return Object(s.a)(e)&&a.call(e,"callee")&&!c.call(e,"callee")};t.a=l},"./node_modules/lodash-es/isArray.js":function(e,t,o){"use strict";var i=Array.isArray;t.a=i},"./node_modules/lodash-es/isArrayLike.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/isFunction.js"),s=o("./node_modules/lodash-es/isLength.js");t.a=function(e){return null!=e&&Object(s.a)(e.length)&&!Object(i.a)(e)}},"./node_modules/lodash-es/isBuffer.js":function(e,t,o){"use strict";(function(e){var i=o("./node_modules/lodash-es/_root.js"),s=o("./node_modules/lodash-es/stubFalse.js"),r="object"==typeof exports&&exports&&!exports.nodeType&&exports,n=r&&"object"==typeof e&&e&&!e.nodeType&&e,a=n&&n.exports===r?i.a.Buffer:void 0,c=(a?a.isBuffer:void 0)||s.a;t.a=c}).call(this,o("./node_modules/webpack/buildin/harmony-module.js")(e))},"./node_modules/lodash-es/isElement.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/isObjectLike.js"),s=o("./node_modules/lodash-es/isPlainObject.js");t.a=function(e){return Object(i.a)(e)&&1===e.nodeType&&!Object(s.a)(e)}},"./node_modules/lodash-es/isFunction.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseGetTag.js"),s=o("./node_modules/lodash-es/isObject.js");t.a=function(e){if(!Object(s.a)(e))return!1;var t=Object(i.a)(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}},"./node_modules/lodash-es/isLength.js":function(e,t,o){"use strict";t.a=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},"./node_modules/lodash-es/isObject.js":function(e,t,o){"use strict";t.a=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},"./node_modules/lodash-es/isObjectLike.js":function(e,t,o){"use strict";t.a=function(e){return null!=e&&"object"==typeof e}},"./node_modules/lodash-es/isPlainObject.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseGetTag.js"),s=o("./node_modules/lodash-es/_getPrototype.js"),r=o("./node_modules/lodash-es/isObjectLike.js"),n=Function.prototype,a=Object.prototype,c=n.toString,l=a.hasOwnProperty,d=c.call(Object);t.a=function(e){if(!Object(r.a)(e)||"[object Object]"!=Object(i.a)(e))return!1;var t=Object(s.a)(e);if(null===t)return!0;var o=l.call(t,"constructor")&&t.constructor;return"function"==typeof o&&o instanceof o&&c.call(o)==d}},"./node_modules/lodash-es/isSymbol.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseGetTag.js"),s=o("./node_modules/lodash-es/isObjectLike.js");t.a=function(e){return"symbol"==typeof e||Object(s.a)(e)&&"[object Symbol]"==Object(i.a)(e)}},"./node_modules/lodash-es/isTypedArray.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseGetTag.js"),s=o("./node_modules/lodash-es/isLength.js"),r=o("./node_modules/lodash-es/isObjectLike.js"),n={};n["[object Float32Array]"]=n["[object Float64Array]"]=n["[object Int8Array]"]=n["[object Int16Array]"]=n["[object Int32Array]"]=n["[object Uint8Array]"]=n["[object Uint8ClampedArray]"]=n["[object Uint16Array]"]=n["[object Uint32Array]"]=!0,n["[object Arguments]"]=n["[object Array]"]=n["[object ArrayBuffer]"]=n["[object Boolean]"]=n["[object DataView]"]=n["[object Date]"]=n["[object Error]"]=n["[object Function]"]=n["[object Map]"]=n["[object Number]"]=n["[object Object]"]=n["[object RegExp]"]=n["[object Set]"]=n["[object String]"]=n["[object WeakMap]"]=!1;var a=function(e){return Object(r.a)(e)&&Object(s.a)(e.length)&&!!n[Object(i.a)(e)]},c=o("./node_modules/lodash-es/_baseUnary.js"),l=o("./node_modules/lodash-es/_nodeUtil.js"),d=l.a&&l.a.isTypedArray,u=d?Object(c.a)(d):a;t.a=u},"./node_modules/lodash-es/keys.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_arrayLikeKeys.js"),s=o("./node_modules/lodash-es/_isPrototype.js"),r=o("./node_modules/lodash-es/_overArg.js"),n=Object(r.a)(Object.keys,Object),a=Object.prototype.hasOwnProperty;var c=function(e){if(!Object(s.a)(e))return n(e);var t=[];for(var o in Object(e))a.call(e,o)&&"constructor"!=o&&t.push(o);return t},l=o("./node_modules/lodash-es/isArrayLike.js");t.a=function(e){return Object(l.a)(e)?Object(i.a)(e):c(e)}},"./node_modules/lodash-es/keysIn.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_arrayLikeKeys.js"),s=o("./node_modules/lodash-es/isObject.js"),r=o("./node_modules/lodash-es/_isPrototype.js");var n=function(e){var t=[];if(null!=e)for(var o in Object(e))t.push(o);return t},a=Object.prototype.hasOwnProperty;var c=function(e){if(!Object(s.a)(e))return n(e);var t=Object(r.a)(e),o=[];for(var i in e)("constructor"!=i||!t&&a.call(e,i))&&o.push(i);return o},l=o("./node_modules/lodash-es/isArrayLike.js");t.a=function(e){return Object(l.a)(e)?Object(i.a)(e,!0):c(e)}},"./node_modules/lodash-es/stubArray.js":function(e,t,o){"use strict";t.a=function(){return[]}},"./node_modules/lodash-es/stubFalse.js":function(e,t,o){"use strict";t.a=function(){return!1}},"./node_modules/lodash-es/throttle.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/debounce.js"),s=o("./node_modules/lodash-es/isObject.js");t.a=function(e,t,o){var r=!0,n=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return Object(s.a)(o)&&(r="leading"in o?!!o.leading:r,n="trailing"in o?!!o.trailing:n),Object(i.a)(e,t,{leading:r,maxWait:t,trailing:n})}},"./node_modules/lodash-es/toString.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_Symbol.js");var s=function(e,t){for(var o=-1,i=null==e?0:e.length,s=Array(i);++o<i;)s[o]=t(e[o],o,e);return s},r=o("./node_modules/lodash-es/isArray.js"),n=o("./node_modules/lodash-es/isSymbol.js"),a=i.a?i.a.prototype:void 0,c=a?a.toString:void 0;var l=function e(t){if("string"==typeof t)return t;if(Object(r.a)(t))return s(t,e)+"";if(Object(n.a)(t))return c?c.call(t):"";var o=t+"";return"0"==o&&1/t==-1/0?"-0":o};t.a=function(e){return null==e?"":l(e)}},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-clipboard/theme/clipboard.css":function(e,t){e.exports='.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position{display:inline;position:relative;pointer-events:none}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{position:absolute;width:0}.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__selection-handle,.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__type-around{display:none}:root{--ck-clipboard-drop-target-dot-width:12px;--ck-clipboard-drop-target-dot-height:8px;--ck-clipboard-drop-target-color:var(--ck-color-focus-border)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{bottom:calc(var(--ck-clipboard-drop-target-dot-height)*-0.5);top:calc(var(--ck-clipboard-drop-target-dot-height)*-0.5);border:1px solid var(--ck-clipboard-drop-target-color);background:var(--ck-clipboard-drop-target-color);margin-left:-1px}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span:after{content:"";width:0;height:0;display:block;position:absolute;left:50%;top:calc(var(--ck-clipboard-drop-target-dot-height)*-0.5);transform:translateX(-50%);border-left:calc(var(--ck-clipboard-drop-target-dot-width)*0.5) solid transparent;border-bottom:0 solid transparent;border-right:calc(var(--ck-clipboard-drop-target-dot-width)*0.5) solid transparent;border-top:calc(var(--ck-clipboard-drop-target-dot-height)) solid var(--ck-clipboard-drop-target-color)}.ck.ck-editor__editable .ck-widget.ck-clipboard-drop-target-range{outline:var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color)!important}.ck.ck-editor__editable .ck-widget:-webkit-drag{zoom:.6;outline:none!important}'},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-engine/theme/placeholder.css":function(e,t){e.exports=".ck.ck-placeholder,.ck .ck-placeholder{position:relative}.ck.ck-placeholder:before,.ck .ck-placeholder:before{position:absolute;left:0;right:0;content:attr(data-placeholder);pointer-events:none}.ck.ck-read-only .ck-placeholder:before{display:none}.ck.ck-placeholder:before,.ck .ck-placeholder:before{cursor:text;color:var(--ck-color-engine-placeholder-text)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-engine/theme/renderer.css":function(e,t){e.exports=".ck.ck-editor__editable span[data-ck-hidden]{display:none}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/button/button.css":function(e,t){e.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(var(--ck-spacing-small)*-1);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(var(--ck-spacing-small)*-1);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}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/button/switchbutton.css":function(e,t){e.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:calc(var(--ck-switch-button-toggle-width) - var(--ck-switch-button-toggle-inner-size) - var(--ck-switch-button-toggle-spacing)*2)}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__label{margin-right:calc(var(--ck-spacing-large)*2)}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__label{margin-left:calc(var(--ck-spacing-large)*2)}.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(var(--ck-border-radius)*0.5)}.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(var(--ck-switch-button-translation)*-1))}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/colorgrid/colorgrid.css":function(e,t){e.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)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/dropdown.css":function(e,t){e.exports=":root{--ck-dropdown-max-width:75vw}.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);max-width:var(--ck-dropdown-max-width);position:absolute}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel-visible{display:inline-block}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw{bottom:100%}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw,.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}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s{left:50%;transform:translateX(-50%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw{left:75%;transform:translateX(-75%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme{left:25%;transform:translateX(-25%)}.ck.ck-toolbar .ck-dropdown__panel{z-index:calc(var(--ck-z-modal) + 1)}:root{--ck-dropdown-arrow-size:calc(var(--ck-icon-size)*0.5)}.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-standard)}[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 .ck-button.ck-dropdown__button.ck-dropdown__button_label-width_auto .ck-button__label{width:auto}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active{box-shadow:none}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active:focus,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active:focus{box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-dropdown__panel{border-radius:0}.ck-rounded-corners .ck.ck-dropdown__panel,.ck.ck-dropdown__panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-dropdown__panel{box-shadow:var(--ck-drop-shadow),0 0;background:var(--ck-color-dropdown-panel-background);border:1px solid var(--ck-color-dropdown-panel-border);bottom:0;min-width:100%}.ck.ck-dropdown__panel.ck-dropdown__panel_se{border-top-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_sw{border-top-right-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_ne{border-bottom-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_nw{border-bottom-right-radius:0}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/listdropdown.css":function(e,t){e.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}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/splitbutton.css":function(e,t){e.exports='.ck.ck-splitbutton{font-size:inherit}.ck.ck-splitbutton .ck-splitbutton__action:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-button .ck-tooltip{display:none}:root{--ck-color-split-button-hover-background:#ebebeb;--ck-color-split-button-hover-border:#b3b3b3}[dir=ltr] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,[dir=ltr] .ck.ck-splitbutton:hover>.ck-splitbutton__action{border-top-right-radius:unset;border-bottom-right-radius:unset}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__action{border-top-left-radius:unset;border-bottom-left-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow{min-width:unset}[dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-top-left-radius:unset;border-bottom-left-radius:unset}[dir=rtl] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-top-right-radius:unset;border-bottom-right-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow svg{width:var(--ck-dropdown-arrow-size)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover),.ck.ck-splitbutton:hover>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover){background:var(--ck-color-split-button-hover-background)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{content:"";position:absolute;width:1px;height:100%;background-color:var(--ck-color-split-button-hover-border)}[dir=ltr] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,[dir=ltr] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{left:-1px}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{right:-1px}.ck.ck-splitbutton.ck-splitbutton_open{border-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__action{border-bottom-left-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__arrow{border-bottom-right-radius:0}'},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css":function(e,t){e.exports=":root{--ck-toolbar-dropdown-max-width:60vw}.ck.ck-toolbar-dropdown>.ck-dropdown__panel{width:max-content;max-width:var(--ck-toolbar-dropdown-max-width)}.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}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/editorui/editorui.css":function(e,t){e.exports=":root{--ck-color-editable-blur-selection:#d9d9d9}.ck.ck-editor__editable:not(.ck-editor__nested-editable){border-radius:0}.ck-rounded-corners .ck.ck-editor__editable:not(.ck-editor__nested-editable),.ck.ck-editor__editable:not(.ck-editor__nested-editable).ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-editor__editable:not(.ck-editor__nested-editable).ck-focused{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0}.ck.ck-editor__editable_inline{overflow:auto;padding:0 var(--ck-spacing-standard);border:1px solid transparent}.ck.ck-editor__editable_inline[dir=ltr]{text-align:left}.ck.ck-editor__editable_inline[dir=rtl]{text-align:right}.ck.ck-editor__editable_inline>:first-child{margin-top:var(--ck-spacing-large)}.ck.ck-editor__editable_inline>:last-child{margin-bottom:var(--ck-spacing-large)}.ck.ck-editor__editable_inline.ck-blurred ::selection{background:var(--ck-color-editable-blur-selection)}.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)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/formheader/formheader.css":function(e,t){e.exports=".ck.ck-form__header{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between}:root{--ck-form-header-height:38px}.ck.ck-form__header{padding:var(--ck-spacing-small) var(--ck-spacing-large);height:var(--ck-form-header-height);line-height:var(--ck-form-header-height);border-bottom:1px solid var(--ck-color-base-border)}.ck.ck-form__header .ck-form__header__label{font-weight:700}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/icon/icon.css":function(e,t){e.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}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/inputtext/inputtext.css":function(e,t){e.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{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 .1s ease-in-out,border .1s ease-in-out}.ck.ck-input-text:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0}.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),0 0}.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),0 0}@keyframes ck-text-input-shake{20%{transform:translateX(-2px)}40%{transform:translateX(2px)}60%{transform:translateX(-1px)}80%{transform:translateX(1px)}}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/label/label.css":function(e,t){e.exports=".ck.ck-label{display:block}.ck.ck-voice-label{display:none}.ck.ck-label{font-weight:700}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css":function(e,t){e.exports=".ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{display:flex;position:relative}.ck.ck-labeled-field-view .ck.ck-label{display:block;position:absolute}:root{--ck-labeled-field-view-transition:.1s cubic-bezier(0,0,0.24,0.95);--ck-labeled-field-empty-unfocused-max-width:100% - 2 * var(--ck-spacing-medium);--ck-color-labeled-field-label-background:var(--ck-color-base-background)}.ck.ck-labeled-field-view{border-radius:0}.ck-rounded-corners .ck.ck-labeled-field-view,.ck.ck-labeled-field-view.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{width:100%}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{top:0}[dir=ltr] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{left:0}[dir=rtl] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{right:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{pointer-events:none;transform-origin:0 0;transform:translate(var(--ck-spacing-medium),-6px) scale(.75);background:var(--ck-color-labeled-field-label-background);padding:0 calc(var(--ck-font-size-tiny)*0.5);line-height:normal;font-weight:400;text-overflow:ellipsis;overflow:hidden;max-width:100%;transition:transform var(--ck-labeled-field-view-transition),padding var(--ck-labeled-field-view-transition),background var(--ck-labeled-field-view-transition)}.ck.ck-labeled-field-view.ck-error .ck-input:not([readonly])+.ck.ck-label,.ck.ck-labeled-field-view.ck-error>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view .ck-labeled-field-view__status{font-size:var(--ck-font-size-small);margin-top:var(--ck-spacing-small);white-space:normal}.ck.ck-labeled-field-view .ck-labeled-field-view__status.ck-labeled-field-view__status_error{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-input-disabled-text)}[dir=ltr] .ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=ltr] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(var(--ck-spacing-medium),calc(var(--ck-font-size-base)*0.6)) scale(1)}[dir=rtl] .ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=rtl] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(calc(var(--ck-spacing-medium)*-1),calc(var(--ck-font-size-base)*0.6)) scale(1)}.ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width));background:transparent;padding:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck.ck-button{background:transparent}.ck.ck-labeled-field-view.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck-button>.ck-button__label{opacity:0}.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown+.ck-label{max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard))}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/list/list.css":function(e,t){e.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(var(--ck-line-height-base)*0.2*var(--ck-font-size-base)) calc(var(--ck-line-height-base)*0.4*var(--ck-font-size-base))}.ck.ck-list__item .ck-button .ck-button__label{line-height:calc(var(--ck-line-height-base)*1.2*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)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/balloonpanel.css":function(e,t){e.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-balloon-arrow-drop-shadow:0 2px 2px var(--ck-color-shadow-drop)}.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);filter:drop-shadow(var(--ck-balloon-arrow-drop-shadow))}.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(var(--ck-balloon-arrow-half-width)*-1);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:before{left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:before{right:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.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(var(--ck-balloon-arrow-half-width)*-1);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:before{left:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:before{right:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:before{right:25%;margin-right:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:before{left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:before{right:25%;margin-right:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:before{left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}'},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/balloonrotator.css":function(e,t){e.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}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/fakepanel.css":function(e,t){e.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}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/stickypanel.css":function(e,t){e.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}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css":function(e,t){e.exports=".ck.ck-block-toolbar-button{position:absolute;z-index:var(--ck-z-default)}:root{--ck-color-block-toolbar-button:var(--ck-color-text);--ck-block-toolbar-button-size:var(--ck-font-size-normal)}.ck.ck-block-toolbar-button{color:var(--ck-color-block-toolbar-button);font-size:var(--ck-block-toolbar-size)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/toolbar/toolbar.css":function(e,t){e.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__line-break{flex-basis:100%}.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.ck-toolbar__separator{align-self:stretch;width:1px;min-width:1px;background:var(--ck-color-toolbar-border);margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small)}.ck.ck-toolbar .ck-toolbar__line-break{height:0}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break){margin-right:var(--ck-spacing-small)}.ck.ck-toolbar>.ck-toolbar__items:empty+.ck.ck-toolbar__separator{display:none}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break),.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown{margin-top:var(--ck-spacing-small);margin-bottom: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>*{margin:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>:not(:first-child):not(:last-child){border-radius:0}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck.ck-button.ck-dropdown__button{padding-left:var(--ck-spacing-tiny)}.ck-toolbar-container .ck.ck-toolbar{border:0}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck{margin-right:0}.ck.ck-toolbar[dir=rtl]:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-left:0}.ck.ck-toolbar[dir=rtl].ck-toolbar_compact>.ck-toolbar__items>.ck:first-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.ck.ck-toolbar[dir=rtl].ck-toolbar_compact>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.ck.ck-toolbar[dir=rtl]>.ck.ck-toolbar__separator,[dir=rtl] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=rtl].ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=rtl] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child){margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr]>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-right:0}.ck.ck-toolbar[dir=ltr].ck-toolbar_compact>.ck-toolbar__items>.ck:first-child,[dir=ltr] .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[dir=ltr].ck-toolbar_compact>.ck-toolbar__items>.ck:last-child,[dir=ltr] .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[dir=ltr]>.ck.ck-toolbar__separator,[dir=ltr] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-right:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr].ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=ltr] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child){margin-right:var(--ck-spacing-small)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/tooltip/tooltip.css":function(e,t){e.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,.ck.ck-tooltip.ck-tooltip_se,.ck.ck-tooltip.ck-tooltip_sw{bottom:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateY(100%)}.ck.ck-tooltip.ck-tooltip_s .ck-tooltip__text:after,.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text:after,.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text:after{top:calc(var(--ck-tooltip-arrow-size)*-1 + 1px);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_sw{right:50%;left:auto}.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text{left:auto;right:calc(var(--ck-tooltip-arrow-size)*-2)}.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text:after{left:auto;right:0}.ck.ck-tooltip.ck-tooltip_se{left:50%;right:auto}.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text{right:auto;left:calc(var(--ck-tooltip-arrow-size)*-2)}.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text:after{right:auto;left:0;transform:translateX(50%)}.ck.ck-tooltip.ck-tooltip_n{top:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateY(-100%)}.ck.ck-tooltip.ck-tooltip_n .ck-tooltip__text:after{bottom:calc(var(--ck-tooltip-arrow-size)*-1);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)}.ck.ck-tooltip.ck-tooltip_e{left:calc(100% + var(--ck-tooltip-arrow-size));top:50%}.ck.ck-tooltip.ck-tooltip_e .ck-tooltip__text{left:0;transform:translateY(-50%)}.ck.ck-tooltip.ck-tooltip_e .ck-tooltip__text:after{left:calc(var(--ck-tooltip-arrow-size)*-1);top:calc(50% - var(--ck-tooltip-arrow-size)*1);border-left-color:transparent;border-bottom-color:transparent;border-right-color:var(--ck-color-tooltip-background);border-top-color:transparent;border-left-width:0;border-bottom-width:var(--ck-tooltip-arrow-size);border-right-width:var(--ck-tooltip-arrow-size);border-top-width:var(--ck-tooltip-arrow-size)}.ck.ck-tooltip.ck-tooltip_w{right:calc(100% + var(--ck-tooltip-arrow-size));left:auto;top:50%}.ck.ck-tooltip.ck-tooltip_w .ck-tooltip__text{left:0;transform:translateY(-50%)}.ck.ck-tooltip.ck-tooltip_w .ck-tooltip__text:after{left:100%;top:calc(50% - var(--ck-tooltip-arrow-size)*1);border-left-color:var(--ck-color-tooltip-background);border-bottom-color:transparent;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:0;border-top-width:var(--ck-tooltip-arrow-size)}'},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/globals/globals.css":function(e,t){e.exports=".ck-hidden{display:none!important}.ck.ck-reset,.ck.ck-reset_all,.ck.ck-reset_all *{box-sizing:border-box;width:auto;height:auto;position:static}:root{--ck-z-default:1;--ck-z-modal:calc(var(--ck-z-default) + 999)}.ck-transitions-disabled,.ck-transitions-disabled *{transition:none!important}:root{--ck-color-base-foreground:#fafafa;--ck-color-base-background:#fff;--ck-color-base-border:#c4c4c4;--ck-color-base-action:#61b045;--ck-color-base-focus:#6cb5f9;--ck-color-base-text:#333;--ck-color-base-active:#198cf0;--ck-color-base-active-focus:#0e7fe1;--ck-color-base-error:#db3700;--ck-color-focus-border-coordinates:208,79%,51%;--ck-color-focus-border:hsl(var(--ck-color-focus-border-coordinates));--ck-color-focus-outer-shadow:#bcdefb;--ck-color-focus-disabled-shadow:rgba(119,186,248,0.3);--ck-color-focus-error-shadow:rgba(255,64,31,0.3);--ck-color-text:var(--ck-color-base-text);--ck-color-shadow-drop:rgba(0,0,0,0.15);--ck-color-shadow-drop-active:rgba(0,0,0,0.2);--ck-color-shadow-inner:rgba(0,0,0,0.1);--ck-color-button-default-background:transparent;--ck-color-button-default-hover-background:#e6e6e6;--ck-color-button-default-active-background:#d9d9d9;--ck-color-button-default-active-shadow:#bfbfbf;--ck-color-button-default-disabled-background:transparent;--ck-color-button-on-background:#dedede;--ck-color-button-on-hover-background:#c4c4c4;--ck-color-button-on-active-background:#bababa;--ck-color-button-on-active-shadow:#a1a1a1;--ck-color-button-on-disabled-background:#dedede;--ck-color-button-action-background:var(--ck-color-base-action);--ck-color-button-action-hover-background:#579e3d;--ck-color-button-action-active-background:#53973b;--ck-color-button-action-active-shadow:#498433;--ck-color-button-action-disabled-background:#7ec365;--ck-color-button-action-text:var(--ck-color-base-background);--ck-color-button-save:#008a00;--ck-color-button-cancel:#db3700;--ck-color-switch-button-off-background:#b0b0b0;--ck-color-switch-button-off-hover-background:#a3a3a3;--ck-color-switch-button-on-background:var(--ck-color-button-action-background);--ck-color-switch-button-on-hover-background:#579e3d;--ck-color-switch-button-inner-background:var(--ck-color-base-background);--ck-color-switch-button-inner-shadow:rgba(0,0,0,0.1);--ck-color-dropdown-panel-background:var(--ck-color-base-background);--ck-color-dropdown-panel-border:var(--ck-color-base-border);--ck-color-input-background:var(--ck-color-base-background);--ck-color-input-border:#c7c7c7;--ck-color-input-error-border:var(--ck-color-base-error);--ck-color-input-text:var(--ck-color-base-text);--ck-color-input-disabled-background:#f2f2f2;--ck-color-input-disabled-border:#c7c7c7;--ck-color-input-disabled-text:#757575;--ck-color-list-background:var(--ck-color-base-background);--ck-color-list-button-hover-background:var(--ck-color-button-default-hover-background);--ck-color-list-button-on-background:var(--ck-color-base-active);--ck-color-list-button-on-background-focus:var(--ck-color-base-active-focus);--ck-color-list-button-on-text:var(--ck-color-base-background);--ck-color-panel-background:var(--ck-color-base-background);--ck-color-panel-border:var(--ck-color-base-border);--ck-color-toolbar-background:var(--ck-color-base-foreground);--ck-color-toolbar-border:var(--ck-color-base-border);--ck-color-tooltip-background:var(--ck-color-base-text);--ck-color-tooltip-text:var(--ck-color-base-background);--ck-color-engine-placeholder-text:#707070;--ck-color-upload-bar-background:#6cb5f9;--ck-color-link-default:#0000f0;--ck-color-link-selected-background:rgba(31,177,255,0.1);--ck-color-link-fake-selection:rgba(31,177,255,0.3);--ck-disabled-opacity:.5;--ck-focus-outer-shadow-geometry:0 0 0 3px;--ck-focus-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);--ck-focus-disabled-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);--ck-focus-error-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);--ck-focus-ring:1px solid var(--ck-color-focus-border);--ck-font-size-base:13px;--ck-line-height-base:1.84615;--ck-font-face:Helvetica,Arial,Tahoma,Verdana,Sans-Serif;--ck-font-size-tiny:0.7em;--ck-font-size-small:0.75em;--ck-font-size-normal:1em;--ck-font-size-big:1.4em;--ck-font-size-large:1.8em;--ck-ui-component-min-height:2.3em}.ck.ck-reset,.ck.ck-reset_all,.ck.ck-reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;vertical-align:middle;transition:none;word-wrap:break-word}.ck.ck-reset_all,.ck.ck-reset_all *{border-collapse:collapse;font:normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);color:var(--ck-color-text);text-align:left;white-space:nowrap;cursor:auto;float:none}.ck.ck-reset_all .ck-rtl *{text-align:right}.ck.ck-reset_all iframe{vertical-align:inherit}.ck.ck-reset_all textarea{white-space:pre-wrap}.ck.ck-reset_all input[type=password],.ck.ck-reset_all input[type=text],.ck.ck-reset_all textarea{cursor:text}.ck.ck-reset_all input[type=password][disabled],.ck.ck-reset_all input[type=text][disabled],.ck.ck-reset_all textarea[disabled]{cursor:default}.ck.ck-reset_all fieldset{padding:10px;border:2px groove #dfdee3}.ck.ck-reset_all button::-moz-focus-inner{padding:0;border:0}.ck[dir=rtl],.ck[dir=rtl] .ck{text-align:right}:root{--ck-border-radius:2px;--ck-inner-shadow:2px 2px 3px var(--ck-color-shadow-inner) inset;--ck-drop-shadow:0 1px 2px 1px var(--ck-color-shadow-drop);--ck-drop-shadow-active:0 3px 6px 1px var(--ck-color-shadow-drop-active);--ck-spacing-unit:0.6em;--ck-spacing-large:calc(var(--ck-spacing-unit)*1.5);--ck-spacing-standard:var(--ck-spacing-unit);--ck-spacing-medium:calc(var(--ck-spacing-unit)*0.8);--ck-spacing-small:calc(var(--ck-spacing-unit)*0.5);--ck-spacing-tiny:calc(var(--ck-spacing-unit)*0.3);--ck-spacing-extra-tiny:calc(var(--ck-spacing-unit)*0.16)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-widget/theme/widget.css":function(e,t){e.exports=":root{--ck-color-resizer:var(--ck-color-focus-border);--ck-color-resizer-tooltip-background:#262626;--ck-color-resizer-tooltip-text:#f2f2f2;--ck-resizer-border-radius:var(--ck-border-radius);--ck-resizer-tooltip-offset:10px;--ck-resizer-tooltip-height:calc(var(--ck-spacing-small)*2 + 10px)}.ck .ck-widget,.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:0 var(--ck-spacing-small);height:var(--ck-resizer-tooltip-height);line-height:var(--ck-resizer-tooltip-height)}.ck .ck-size-view.ck-orientation-above-center,.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)}.ck .ck-size-view.ck-orientation-above-center{top:calc(var(--ck-resizer-tooltip-height)*-1);left:50%;transform:translate(-50%)}: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));top:0}.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:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{opacity:1;background-color:var(--ck-color-focus-border)}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:1}.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.ck-editor__editable.ck-read-only .ck-widget{transition:none}.ck.ck-editor__editable.ck-read-only .ck-widget:not(.ck-widget_selected){--ck-widget-outline-thickness:0px}.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover{outline-color:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle>.ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle>.ck-widget__selection-handle:hover,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover.ck-widget_with-selection-handle>.ck-widget__selection-handle,.ck.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.ck-editor__editable>.ck-widget.ck-widget_with-selection-handle:first-child,.ck.ck-editor__editable blockquote>.ck-widget.ck-widget_with-selection-handle:first-child{margin-top:calc(1em + var(--ck-widget-handler-icon-size))}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-widget/theme/widgetresize.css":function(e,t){e.exports=".ck .ck-widget_with-resizer{position:relative}.ck .ck-widget__resizer{display:none;position:absolute;pointer-events:none;left:0;top:0}.ck-focused .ck-widget_with-resizer.ck-widget_selected>.ck-widget__resizer{display:block}.ck .ck-widget__resizer__handle{position:absolute;pointer-events:all}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{cursor:nwse-resize}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{cursor:nesw-resize}:root{--ck-resizer-size:10px;--ck-resizer-offset:calc(var(--ck-resizer-size)/-2 - 2px);--ck-resizer-border-width:1px}.ck .ck-widget__resizer{outline:1px solid var(--ck-color-resizer)}.ck .ck-widget__resizer__handle{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)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{top:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right{bottom:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left{bottom:var(--ck-resizer-offset);left:var(--ck-resizer-offset)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-widget/theme/widgettypearound.css":function(e,t){e.exports='.ck .ck-widget .ck-widget__type-around__button{display:block;position:absolute;overflow:hidden;z-index:var(--ck-z-default)}.ck .ck-widget .ck-widget__type-around__button svg{position:absolute;top:50%;left:50%;z-index:calc(var(--ck-z-default) + 2)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_before{top:calc(var(--ck-widget-outline-thickness)*-0.5);left:min(10%,30px);transform:translateY(-50%)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_after{bottom:calc(var(--ck-widget-outline-thickness)*-0.5);right:min(10%,30px);transform:translateY(50%)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{content:"";display:block;position:absolute;top:1px;left:1px;z-index:calc(var(--ck-z-default) + 1)}.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:none;position:absolute;left:0;right:0}.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__fake-caret{left:calc(var(--ck-widget-outline-thickness)*-1);right:calc(var(--ck-widget-outline-thickness)*-1)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__fake-caret{top:calc(var(--ck-widget-outline-thickness)*-1 - 1px);display:block}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__fake-caret{bottom:calc(var(--ck-widget-outline-thickness)*-1 - 1px);display:block}.ck.ck-editor__editable.ck-read-only .ck-widget__type-around,.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around,.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around{display:none}:root{--ck-widget-type-around-button-size:20px;--ck-color-widget-type-around-button-active:var(--ck-color-focus-border);--ck-color-widget-type-around-button-hover:var(--ck-color-widget-hover-border);--ck-color-widget-type-around-button-blurred-editable:var(--ck-color-widget-blurred-border);--ck-color-widget-type-around-button-radar-start-alpha:0;--ck-color-widget-type-around-button-radar-end-alpha:.3;--ck-color-widget-type-around-button-icon:var(--ck-color-base-background)}.ck .ck-widget .ck-widget__type-around__button{width:var(--ck-widget-type-around-button-size);height:var(--ck-widget-type-around-button-size);background:var(--ck-color-widget-type-around-button);border-radius:100px;transition:opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);opacity:0;pointer-events:none}.ck .ck-widget .ck-widget__type-around__button svg{width:10px;height:8px;transform:translate(-50%,-50%);transition:transform .5s ease;margin-top:1px}.ck .ck-widget .ck-widget__type-around__button svg *{stroke-dasharray:10;stroke-dashoffset:0;fill:none;stroke:var(--ck-color-widget-type-around-button-icon);stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.ck .ck-widget .ck-widget__type-around__button svg line{stroke-dasharray:7}.ck .ck-widget .ck-widget__type-around__button:hover{animation:ck-widget-type-around-button-sonar 1s ease infinite}.ck .ck-widget .ck-widget__type-around__button:hover svg polyline{animation:ck-widget-type-around-arrow-dash 2s linear}.ck .ck-widget .ck-widget__type-around__button:hover svg line{animation:ck-widget-type-around-arrow-tip-dash 2s linear}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:1;pointer-events:auto}.ck .ck-widget:not(.ck-widget_selected)>.ck-widget__type-around>.ck-widget__type-around__button{background:var(--ck-color-widget-type-around-button-hover)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover{background:var(--ck-color-widget-type-around-button-active)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{width:calc(var(--ck-widget-type-around-button-size) - 2px);height:calc(var(--ck-widget-type-around-button-size) - 2px);border-radius:100px;background:linear-gradient(135deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.3))}.ck .ck-widget.ck-widget_with-selection-handle>.ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:20px}.ck .ck-widget .ck-widget__type-around__fake-caret{pointer-events:none;height:1px;animation:ck-widget-type-around-fake-caret-pulse 1s linear infinite normal forwards;outline:1px solid hsla(0,0%,100%,.5);background:var(--ck-color-base-text)}.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_after,.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_before{outline-color:transparent}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected:hover,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{opacity:0}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer{opacity:0}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:0;margin-right:20px}.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover){background:var(--ck-color-widget-type-around-button-blurred-editable)}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover) svg *{stroke:#999}@keyframes ck-widget-type-around-arrow-dash{0%{stroke-dashoffset:10}20%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-arrow-tip-dash{0%,20%{stroke-dashoffset:7}40%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-button-sonar{0%{box-shadow:0 0 0 0 hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}50%{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-end-alpha))}to{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}}@keyframes ck-widget-type-around-fake-caret-pulse{0%{opacity:1}49%{opacity:1}50%{opacity:0}99%{opacity:0}to{opacity:1}}'},"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":function(e,t,o){"use strict";var i,s=function(){return void 0===i&&(i=Boolean(window&&document&&document.all&&!window.atob)),i},r=function(){var e={};return function(t){if(void 0===e[t]){var o=document.querySelector(t);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(e){o=null}e[t]=o}return e[t]}}(),n=[];function a(e){for(var t=-1,o=0;o<n.length;o++)if(n[o].identifier===e){t=o;break}return t}function c(e,t){for(var o={},i=[],s=0;s<e.length;s++){var r=e[s],c=t.base?r[0]+t.base:r[0],l=o[c]||0,d="".concat(c," ").concat(l);o[c]=l+1;var u=a(d),h={css:r[1],media:r[2],sourceMap:r[3]};-1!==u?(n[u].references++,n[u].updater(h)):n.push({identifier:d,updater:m(h,t),references:1}),i.push(d)}return i}function l(e){var t=document.createElement("style"),i=e.attributes||{};if(void 0===i.nonce){var s=o.nc;s&&(i.nonce=s)}if(Object.keys(i).forEach((function(e){t.setAttribute(e,i[e])})),"function"==typeof e.insert)e.insert(t);else{var n=r(e.insert||"head");if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(t)}return t}var d,u=(d=[],function(e,t){return d[e]=t,d.filter(Boolean).join("\n")});function h(e,t,o,i){var s=o?"":i.media?"@media ".concat(i.media," {").concat(i.css,"}"):i.css;if(e.styleSheet)e.styleSheet.cssText=u(t,s);else{var r=document.createTextNode(s),n=e.childNodes;n[t]&&e.removeChild(n[t]),n.length?e.insertBefore(r,n[t]):e.appendChild(r)}}function p(e,t,o){var i=o.css,s=o.media,r=o.sourceMap;if(s?e.setAttribute("media",s):e.removeAttribute("media"),r&&"undefined"!=typeof btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleSheet)e.styleSheet.cssText=i;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(i))}}var g=null,f=0;function m(e,t){var o,i,s;if(t.singleton){var r=f++;o=g||(g=l(t)),i=h.bind(null,o,r,!1),s=h.bind(null,o,r,!0)}else o=l(t),i=p.bind(null,o,t),s=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(o)};return i(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;i(e=t)}else s()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=s());var o=c(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var i=0;i<o.length;i++){var s=a(o[i]);n[s].references--}for(var r=c(e,t),l=0;l<o.length;l++){var d=a(o[l]);0===n[d].references&&(n[d].updater(),n.splice(d,1))}o=r}}}},"./node_modules/webpack/buildin/global.js":function(e,t){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(e){"object"==typeof window&&(o=window)}e.exports=o},"./node_modules/webpack/buildin/harmony-module.js":function(e,t){e.exports=function(e){if(!e.webpackPolyfill){var t=Object.create(e);t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,"exports",{enumerable:!0}),t.webpackPolyfill=1}return t}},"./packages/ckeditor5-clipboard/theme/clipboard.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-clipboard/theme/clipboard.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-core/src/command.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-utils/src/observablemixin.js"),s=o("./packages/ckeditor5-utils/src/mix.js");class r{constructor(e){this.editor=e,this.set("value",void 0),this.set("isEnabled",!1),this.affectsData=!0,this._disableStack=new Set,this.decorate("execute"),this.listenTo(this.editor.model.document,"change",()=>{this.refresh()}),this.on("execute",e=>{this.isEnabled||e.stop()},{priority:"high"}),this.listenTo(e,"change:isReadOnly",(e,t,o)=>{o&&this.affectsData?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")})}refresh(){this.isEnabled=!0}forceDisabled(e){this._disableStack.add(e),1==this._disableStack.size&&(this.on("set:isEnabled",n,{priority:"highest"}),this.isEnabled=!1)}clearForceDisabled(e){this._disableStack.delete(e),0==this._disableStack.size&&(this.off("set:isEnabled",n),this.refresh())}execute(){}destroy(){this.stopListening()}}function n(e){e.return=!1,e.stop()}Object(s.a)(r,i.a)},"./packages/ckeditor5-core/src/contextplugin.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-utils/src/observablemixin.js"),s=o("./packages/ckeditor5-utils/src/mix.js");class r{constructor(e){this.context=e}destroy(){this.stopListening()}static get isContextPlugin(){return!0}}Object(s.a)(r,i.a)},"./packages/ckeditor5-core/src/pendingactions.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-core/src/contextplugin.js"),s=o("./packages/ckeditor5-utils/src/observablemixin.js"),r=o("./packages/ckeditor5-utils/src/collection.js"),n=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class a extends i.a{static get pluginName(){return"PendingActions"}init(){this.set("hasAny",!1),this._actions=new r.a({idProperty:"_id"}),this._actions.delegate("add","remove").to(this)}add(e){if("string"!=typeof e)throw new n.a("pendingactions-add-invalid-message",this);const t=Object.create(s.a);return t.set("message",e),this._actions.add(t),this.hasAny=!0,t}remove(e){this._actions.remove(e),this.hasAny=!!this._actions.length}get first(){return this._actions.get(0)}[Symbol.iterator](){return this._actions[Symbol.iterator]()}}},"./packages/ckeditor5-core/src/plugin.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-utils/src/observablemixin.js"),s=o("./packages/ckeditor5-utils/src/mix.js");class r{constructor(e){this.editor=e,this.set("isEnabled",!0),this._disableStack=new Set}forceDisabled(e){this._disableStack.add(e),1==this._disableStack.size&&(this.on("set:isEnabled",n,{priority:"highest"}),this.isEnabled=!1)}clearForceDisabled(e){this._disableStack.delete(e),0==this._disableStack.size&&(this.off("set:isEnabled",n),this.isEnabled=!0)}destroy(){this.stopListening()}static get isContextPlugin(){return!1}}function n(e){e.return=!1,e.stop()}Object(s.a)(r,i.a)},"./packages/ckeditor5-core/theme/icons/pilcrow.svg":function(e,t,o){"use strict";t.a='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.999 2H15a1 1 0 0 1 0 2h-1.004v13a1 1 0 1 1-2 0V4H8.999v13a1 1 0 1 1-2 0v-7A4 4 0 0 1 3 6a4 4 0 0 1 3.999-4z"/></svg>'},"./packages/ckeditor5-core/theme/icons/three-vertical-dots.svg":function(e,t,o){"use strict";t.a='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><circle cx="9.5" cy="4.5" r="1.5"/><circle cx="9.5" cy="10.5" r="1.5"/><circle cx="9.5" cy="16.5" r="1.5"/></svg>'},"./packages/ckeditor5-engine/src/controller/datacontroller.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return j}));var i=o("./packages/ckeditor5-utils/src/mix.js"),s=o("./packages/ckeditor5-utils/src/observablemixin.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-engine/src/conversion/mapper.js"),a=o("./packages/ckeditor5-engine/src/conversion/downcastdispatcher.js"),c=o("./packages/ckeditor5-engine/src/conversion/downcasthelpers.js"),l=o("./node_modules/lodash-es/isArray.js");class d{constructor(){this._consumables=new Map}add(e,t){let o;e.is("$text")||e.is("documentFragment")?this._consumables.set(e,!0):(this._consumables.has(e)?o=this._consumables.get(e):(o=new u(e),this._consumables.set(e,o)),o.add(t))}test(e,t){const o=this._consumables.get(e);return void 0===o?null:e.is("$text")||e.is("documentFragment")?o:o.test(t)}consume(e,t){return!!this.test(e,t)&&(e.is("$text")||e.is("documentFragment")?this._consumables.set(e,!1):this._consumables.get(e).consume(t),!0)}revert(e,t){const o=this._consumables.get(e);void 0!==o&&(e.is("$text")||e.is("documentFragment")?this._consumables.set(e,!0):o.revert(t))}static consumablesFromElement(e){const t={element:e,name:!0,attributes:[],classes:[],styles:[]},o=e.getAttributeKeys();for(const e of o)"style"!=e&&"class"!=e&&t.attributes.push(e);const i=e.getClassNames();for(const e of i)t.classes.push(e);const s=e.getStyleNames();for(const e of s)t.styles.push(e);return t}static createFrom(e,t){if(t||(t=new d(e)),e.is("$text"))return t.add(e),t;e.is("element")&&t.add(e,d.consumablesFromElement(e)),e.is("documentFragment")&&t.add(e);for(const o of e.getChildren())t=d.createFrom(o,t);return t}}class u{constructor(e){this.element=e,this._canConsumeName=null,this._consumables={attributes:new Map,styles:new Map,classes:new Map}}add(e){e.name&&(this._canConsumeName=!0);for(const t in this._consumables)t in e&&this._add(t,e[t])}test(e){if(e.name&&!this._canConsumeName)return this._canConsumeName;for(const t in this._consumables)if(t in e){const o=this._test(t,e[t]);if(!0!==o)return o}return!0}consume(e){e.name&&(this._canConsumeName=!1);for(const t in this._consumables)t in e&&this._consume(t,e[t])}revert(e){e.name&&(this._canConsumeName=!0);for(const t in this._consumables)t in e&&this._revert(t,e[t])}_add(e,t){const o=Object(l.a)(t)?t:[t],i=this._consumables[e];for(const t of o){if("attributes"===e&&("class"===t||"style"===t))throw new r.a("viewconsumable-invalid-attribute",this);if(i.set(t,!0),"styles"===e)for(const e of this.element.document.stylesProcessor.getRelatedStyles(t))i.set(e,!0)}}_test(e,t){const o=Object(l.a)(t)?t:[t],i=this._consumables[e];for(const t of o)if("attributes"!==e||"class"!==t&&"style"!==t){const e=i.get(t);if(void 0===e)return null;if(!e)return!1}else{const e="class"==t?"classes":"styles",o=this._test(e,[...this._consumables[e].keys()]);if(!0!==o)return o}return!0}_consume(e,t){const o=Object(l.a)(t)?t:[t],i=this._consumables[e];for(const t of o)if("attributes"!==e||"class"!==t&&"style"!==t){if(i.set(t,!1),"styles"==e)for(const e of this.element.document.stylesProcessor.getRelatedStyles(t))i.set(e,!1)}else{const e="class"==t?"classes":"styles";this._consume(e,[...this._consumables[e].keys()])}}_revert(e,t){const o=Object(l.a)(t)?t:[t],i=this._consumables[e];for(const t of o)if("attributes"!==e||"class"!==t&&"style"!==t){!1===i.get(t)&&i.set(t,!0)}else{const e="class"==t?"classes":"styles";this._revert(e,[...this._consumables[e].keys()])}}}var h=o("./packages/ckeditor5-engine/src/model/range.js"),p=o("./packages/ckeditor5-engine/src/model/position.js"),g=o("./packages/ckeditor5-engine/src/model/schema.js"),f=o("./packages/ckeditor5-engine/src/model/utils/autoparagraphing.js"),m=o("./packages/ckeditor5-utils/src/emittermixin.js");class k{constructor(e={}){this._splitParts=new Map,this._cursorParents=new Map,this._modelCursor=null,this.conversionApi=Object.assign({},e),this.conversionApi.convertItem=this._convertItem.bind(this),this.conversionApi.convertChildren=this._convertChildren.bind(this),this.conversionApi.safeInsert=this._safeInsert.bind(this),this.conversionApi.updateConversionResult=this._updateConversionResult.bind(this),this.conversionApi.splitToAllowedParent=this._splitToAllowedParent.bind(this),this.conversionApi.getSplitParts=this._getSplitParts.bind(this)}convert(e,t,o=["$root"]){this.fire("viewCleanup",e),this._modelCursor=function(e,t){let o;for(const i of new g.a(e)){const e={};for(const t of i.getAttributeKeys())e[t]=i.getAttribute(t);const s=t.createElement(i.name,e);o&&t.append(s,o),o=p.a._createAt(s,0)}return o}(o,t),this.conversionApi.writer=t,this.conversionApi.consumable=d.createFrom(e),this.conversionApi.store={};const{modelRange:i}=this._convertItem(e,this._modelCursor),s=t.createDocumentFragment();if(i){this._removeEmptyElements();for(const e of Array.from(this._modelCursor.parent.getChildren()))t.append(e,s);s.markers=function(e,t){const o=new Set,i=new Map,s=h.a._createIn(e).getItems();for(const e of s)"$marker"==e.name&&o.add(e);for(const e of o){const o=e.getAttribute("data-name"),s=t.createPositionBefore(e);i.has(o)?i.get(o).end=s.clone():i.set(o,new h.a(s.clone())),t.remove(e)}return i}(s,t)}return this._modelCursor=null,this._splitParts.clear(),this._cursorParents.clear(),this.conversionApi.writer=null,this.conversionApi.store=null,s}_convertItem(e,t){const o=Object.assign({viewItem:e,modelCursor:t,modelRange:null});if(e.is("element")?this.fire("element:"+e.name,o,this.conversionApi):e.is("$text")?this.fire("text",o,this.conversionApi):this.fire("documentFragment",o,this.conversionApi),o.modelRange&&!(o.modelRange instanceof h.a))throw new r.a("view-conversion-dispatcher-incorrect-result",this);return{modelRange:o.modelRange,modelCursor:o.modelCursor}}_convertChildren(e,t){let o=t.is("position")?t:p.a._createAt(t,0);const i=new h.a(o);for(const t of Array.from(e.getChildren())){const e=this._convertItem(t,o);e.modelRange instanceof h.a&&(i.end=e.modelRange.end,o=e.modelCursor)}return{modelRange:i,modelCursor:o}}_safeInsert(e,t){const o=this._splitToAllowedParent(e,t);return!!o&&(this.conversionApi.writer.insert(e,o.position),!0)}_updateConversionResult(e,t){const o=this._getSplitParts(e),i=this.conversionApi.writer;t.modelRange||(t.modelRange=i.createRange(i.createPositionBefore(e),i.createPositionAfter(o[o.length-1])));const s=this._cursorParents.get(e);t.modelCursor=s?i.createPositionAt(s,0):t.modelRange.end}_splitToAllowedParent(e,t){const{schema:o,writer:i}=this.conversionApi;let s=o.findAllowedParent(t,e);if(s){if(s===t.parent)return{position:t};this._modelCursor.parent.getAncestors().includes(s)&&(s=null)}if(!s)return Object(f.b)(t,e,o)?{position:Object(f.c)(t,i)}:null;const r=this.conversionApi.writer.split(t,s),n=[];for(const e of r.range.getWalker())if("elementEnd"==e.type)n.push(e.item);else{const t=n.pop(),o=e.item;this._registerSplitPair(t,o)}const a=r.range.end.parent;return this._cursorParents.set(e,a),{position:r.position,cursorParent:a}}_registerSplitPair(e,t){this._splitParts.has(e)||this._splitParts.set(e,[e]);const o=this._splitParts.get(e);this._splitParts.set(t,o),o.push(t)}_getSplitParts(e){let t;return t=this._splitParts.has(e)?this._splitParts.get(e):[e],t}_removeEmptyElements(){let e=!1;for(const t of this._splitParts.keys())t.isEmpty&&(this.conversionApi.writer.remove(t),this._splitParts.delete(t),e=!0);e&&this._removeEmptyElements()}}Object(i.a)(k,m.c);var b=o("./packages/ckeditor5-engine/src/conversion/upcasthelpers.js"),_=o("./packages/ckeditor5-engine/src/view/documentfragment.js"),w=o("./packages/ckeditor5-engine/src/view/document.js"),v=o("./packages/ckeditor5-engine/src/view/downcastwriter.js"),y=o("./packages/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js");class j{constructor(e,t){this.model=e,this.mapper=new n.a,this.downcastDispatcher=new a.a({mapper:this.mapper,schema:e.schema}),this.downcastDispatcher.on("insert:$text",Object(c.e)(),{priority:"lowest"}),this.upcastDispatcher=new k({schema:e.schema}),this.viewDocument=new w.a(t),this.stylesProcessor=t,this.htmlProcessor=new y.a(this.viewDocument),this.processor=this.htmlProcessor,this._viewWriter=new v.a(this.viewDocument),this.upcastDispatcher.on("text",Object(b.b)(),{priority:"lowest"}),this.upcastDispatcher.on("element",Object(b.c)(),{priority:"lowest"}),this.upcastDispatcher.on("documentFragment",Object(b.c)(),{priority:"lowest"}),this.decorate("init"),this.decorate("set"),this.decorate("get"),this.on("init",()=>{this.fire("ready")},{priority:"lowest"}),this.on("ready",()=>{this.model.enqueueChange("transparent",f.a)},{priority:"lowest"})}get(e={}){const{rootName:t="main",trim:o="empty"}=e;if(!this._checkIfRootsExists([t]))throw new r.a("datacontroller-get-non-existent-root",this);const i=this.model.document.getRoot(t);return"empty"!==o||this.model.hasContent(i,{ignoreWhitespaces:!0})?this.stringify(i,e):""}stringify(e,t={}){const o=this.toView(e,t);return this.processor.toData(o)}toView(e,t={}){const o=this.viewDocument,i=this._viewWriter;this.mapper.clearBindings();const s=h.a._createIn(e),r=new _.a(o);this.mapper.bindElements(e,r),this.downcastDispatcher.conversionApi.options=t,this.downcastDispatcher.convertInsert(s,i);const n=e.is("documentFragment")?Array.from(e.markers):function(e){const t=[],o=e.root.document;if(!o)return[];const i=h.a._createIn(e);for(const e of o.model.markers){const o=e.getRange(),s=o.isCollapsed,r=o.start.isEqual(i.start)||o.end.isEqual(i.end);if(s&&r)t.push([e.name,o]);else{const s=i.getIntersection(o);s&&t.push([e.name,s])}}return t.sort(([e,t],[o,i])=>{if("after"!==t.end.compareWith(i.start))return 1;if("before"!==t.start.compareWith(i.end))return-1;switch(t.start.compareWith(i.start)){case"before":return 1;case"after":return-1;default:switch(t.end.compareWith(i.end)){case"before":return 1;case"after":return-1;default:return o.localeCompare(e)}}})}(e);for(const[e,t]of n)this.downcastDispatcher.convertMarkerAdd(e,t,i);return delete this.downcastDispatcher.conversionApi.options,r}init(e){if(this.model.document.version)throw new r.a("datacontroller-init-document-not-empty",this);let t={};if("string"==typeof e?t.main=e:t=e,!this._checkIfRootsExists(Object.keys(t)))throw new r.a("datacontroller-init-non-existent-root",this);return this.model.enqueueChange("transparent",e=>{for(const o of Object.keys(t)){const i=this.model.document.getRoot(o);e.insert(this.parse(t[o],i),i,0)}}),Promise.resolve()}set(e,t={}){let o={};if("string"==typeof e?o.main=e:o=e,!this._checkIfRootsExists(Object.keys(o)))throw new r.a("datacontroller-set-non-existent-root",this);const i=t.batchType||"default";this.model.enqueueChange(i,e=>{e.setSelection(null),e.removeSelectionAttribute(this.model.document.selection.getAttributeKeys());for(const t of Object.keys(o)){const i=this.model.document.getRoot(t);e.remove(e.createRangeIn(i)),e.insert(this.parse(o[t],i),i,0)}})}parse(e,t="$root"){const o=this.processor.toView(e);return this.toModel(o,t)}toModel(e,t="$root"){return this.model.change(o=>this.upcastDispatcher.convert(e,o,t))}addStyleProcessorRules(e){e(this.stylesProcessor)}registerRawContentMatcher(e){this.processor&&this.processor!==this.htmlProcessor&&this.processor.registerRawContentMatcher(e),this.htmlProcessor.registerRawContentMatcher(e)}destroy(){this.stopListening()}_checkIfRootsExists(e){for(const t of e)if(!this.model.document.getRootNames().includes(t))return!1;return!0}}Object(i.a)(j,s.a)},"./packages/ckeditor5-engine/src/controller/editingcontroller.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return Q}));var i=o("./packages/ckeditor5-engine/src/view/editableelement.js");const s=Symbol("rootName");class r extends i.a{constructor(e,t){super(e,t),this.rootName="main"}is(e,t=null){return t?t===this.name&&("rootElement"===e||"view:rootElement"===e||"editableElement"===e||"view:editableElement"===e||"containerElement"===e||"view:containerElement"===e||"element"===e||"view:element"===e):"rootElement"===e||"view:rootElement"===e||"editableElement"===e||"view:editableElement"===e||"containerElement"===e||"view:containerElement"===e||"element"===e||"view:element"===e||"node"===e||"view:node"===e}get rootName(){return this.getCustomProperty(s)}set rootName(e){this._setCustomProperty(s,e)}set _name(e){this.name=e}}var n=o("./packages/ckeditor5-engine/src/view/document.js"),a=o("./packages/ckeditor5-engine/src/view/downcastwriter.js"),c=o("./packages/ckeditor5-engine/src/view/renderer.js"),l=o("./packages/ckeditor5-engine/src/view/domconverter.js"),d=o("./packages/ckeditor5-engine/src/view/position.js"),u=o("./packages/ckeditor5-engine/src/view/range.js"),h=o("./packages/ckeditor5-engine/src/view/selection.js"),p=o("./packages/ckeditor5-engine/src/view/observer/observer.js"),g=o("./packages/ckeditor5-engine/src/view/filler.js"),f=o("./node_modules/lodash-es/_baseIsEqual.js");var m=function(e,t,o){var i=(o="function"==typeof o?o:void 0)?o(e,t):void 0;return void 0===i?Object(f.a)(e,t,void 0,o):!!i};class k extends p.a{constructor(e){super(e),this._config={childList:!0,characterData:!0,characterDataOldValue:!0,subtree:!0},this.domConverter=e.domConverter,this.renderer=e._renderer,this._domElements=[],this._mutationObserver=new window.MutationObserver(this._onMutations.bind(this))}flush(){this._onMutations(this._mutationObserver.takeRecords())}observe(e){this._domElements.push(e),this.isEnabled&&this._mutationObserver.observe(e,this._config)}enable(){super.enable();for(const e of this._domElements)this._mutationObserver.observe(e,this._config)}disable(){super.disable(),this._mutationObserver.disconnect()}destroy(){super.destroy(),this._mutationObserver.disconnect()}_onMutations(e){if(0===e.length)return;const t=this.domConverter,o=new Map,i=new Set;for(const o of e)if("childList"===o.type){const e=t.mapDomToView(o.target);if(e&&(e.is("uiElement")||e.is("rawElement")))continue;e&&!this._isBogusBrMutation(o)&&i.add(e)}for(const s of e){const e=t.mapDomToView(s.target);if((!e||!e.is("uiElement")&&!e.is("rawElement"))&&"characterData"===s.type){const e=t.findCorrespondingViewText(s.target);e&&!i.has(e.parent)?o.set(e,{type:"text",oldText:e.data,newText:Object(g.f)(s.target),node:e}):!e&&Object(g.i)(s.target)&&i.add(t.mapDomToView(s.target.parentNode))}}const s=[];for(const e of o.values())this.renderer.markToSync("text",e.node),s.push(e);for(const e of i){const o=t.mapViewToDom(e),i=Array.from(e.getChildren()),r=Array.from(t.domChildrenToView(o,{withChildren:!1}));m(i,r,a)||(this.renderer.markToSync("children",e),s.push({type:"children",oldChildren:i,newChildren:r,node:e}))}const r=e[0].target.ownerDocument.getSelection();let n=null;if(r&&r.anchorNode){const e=t.domPositionToView(r.anchorNode,r.anchorOffset),o=t.domPositionToView(r.focusNode,r.focusOffset);e&&o&&(n=new h.a(e),n.setFocus(o))}function a(e,t){if(!Array.isArray(e))return e===t||!(!e.is("$text")||!t.is("$text"))&&e.data===t.data}s.length&&(this.document.fire("mutations",s,n),this.view.forceRender())}_isBogusBrMutation(e){let t=null;return null===e.nextSibling&&0===e.removedNodes.length&&1==e.addedNodes.length&&(t=this.domConverter.domToView(e.addedNodes[0],{withChildren:!1})),t&&t.is("element","br")}}var b=o("./packages/ckeditor5-engine/src/view/observer/domeventobserver.js"),_=o("./packages/ckeditor5-utils/src/keyboard.js");class w extends b.a{constructor(e){super(e),this.domEventType=["keydown","keyup"]}onDomEvent(e){this.fire(e.type,e,{keyCode:e.keyCode,altKey:e.altKey,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,metaKey:e.metaKey,get keystroke(){return Object(_.a)(this)}})}}var v=o("./node_modules/lodash-es/debounce.js");class y extends p.a{constructor(e){super(e),this._fireSelectionChangeDoneDebounced=Object(v.a)(e=>this.document.fire("selectionChangeDone",e),200)}observe(){const e=this.document;e.on("arrowKey",(t,o)=>{e.selection.isFake&&this.isEnabled&&o.preventDefault()},{context:"$capture"}),e.on("arrowKey",(t,o)=>{e.selection.isFake&&this.isEnabled&&this._handleSelectionMove(o.keyCode)},{priority:"lowest"})}destroy(){super.destroy(),this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionMove(e){const t=this.document.selection,o=new h.a(t.getRanges(),{backward:t.isBackward,fake:!1});e!=_.f.arrowleft&&e!=_.f.arrowup||o.setTo(o.getFirstPosition()),e!=_.f.arrowright&&e!=_.f.arrowdown||o.setTo(o.getLastPosition());const i={oldSelection:t,newSelection:o,domSelection:null};this.document.fire("selectionChange",i),this._fireSelectionChangeDoneDebounced(i)}}class j extends p.a{constructor(e){super(e),this.mutationObserver=e.getObserver(k),this.selection=this.document.selection,this.domConverter=e.domConverter,this._documents=new WeakSet,this._fireSelectionChangeDoneDebounced=Object(v.a)(e=>this.document.fire("selectionChangeDone",e),200),this._clearInfiniteLoopInterval=setInterval(()=>this._clearInfiniteLoop(),1e3),this._documentIsSelectingInactivityTimeoutDebounced=Object(v.a)(()=>this.document.isSelecting=!1,5e3),this._loopbackCounter=0}observe(e){const t=e.ownerDocument,o=()=>{this.document.isSelecting=!1,this._documentIsSelectingInactivityTimeoutDebounced.cancel()};this.listenTo(e,"selectstart",()=>{this.document.isSelecting=!0,this._documentIsSelectingInactivityTimeoutDebounced()},{priority:"highest"}),this.listenTo(e,"keydown",o,{priority:"highest"}),this.listenTo(e,"keyup",o,{priority:"highest"}),this._documents.has(t)||(this.listenTo(t,"mouseup",o,{priority:"highest"}),this.listenTo(t,"selectionchange",(e,o)=>{this._handleSelectionChange(o,t),this._documentIsSelectingInactivityTimeoutDebounced()}),this._documents.add(t))}destroy(){super.destroy(),clearInterval(this._clearInfiniteLoopInterval),this._fireSelectionChangeDoneDebounced.cancel(),this._documentIsSelectingInactivityTimeoutDebounced.cancel()}_handleSelectionChange(e,t){if(!this.isEnabled)return;const o=t.defaultView.getSelection();if(this.checkShouldIgnoreEventFromTarget(o.anchorNode))return;this.mutationObserver.flush();const i=this.domConverter.domSelectionToView(o);if(0!=i.rangeCount){if(this.view.hasDomSelection=!0,!(this.selection.isEqual(i)&&this.domConverter.isDomSelectionCorrect(o)||++this._loopbackCounter>60))if(this.selection.isSimilar(i))this.view.forceRender();else{const e={oldSelection:this.selection,newSelection:i,domSelection:o};this.document.fire("selectionChange",e),this._fireSelectionChangeDoneDebounced(e)}}else this.view.hasDomSelection=!1}_clearInfiniteLoop(){this._loopbackCounter=0}}class x extends b.a{constructor(e){super(e),this.domEventType=["focus","blur"],this.useCapture=!0;const t=this.document;t.on("focus",()=>{t.isFocused=!0,this._renderTimeoutId=setTimeout(()=>e.change(()=>{}),50)}),t.on("blur",(o,i)=>{const s=t.selection.editableElement;null!==s&&s!==i.target||(t.isFocused=!1,e.change(()=>{}))})}onDomEvent(e){this.fire(e.type,e)}destroy(){this._renderTimeoutId&&clearTimeout(this._renderTimeoutId),super.destroy()}}class P extends b.a{constructor(e){super(e),this.domEventType=["compositionstart","compositionupdate","compositionend"];const t=this.document;t.on("compositionstart",()=>{t.isComposing=!0}),t.on("compositionend",()=>{t.isComposing=!1})}onDomEvent(e){this.fire(e.type,e)}}class O extends b.a{constructor(e){super(e),this.domEventType=["beforeinput"]}onDomEvent(e){this.fire(e.type,e)}}var A=o("./packages/ckeditor5-engine/src/view/observer/bubblingeventinfo.js"),T=o("./packages/ckeditor5-utils/src/index.js");class C extends p.a{constructor(e){super(e),this.document.on("keydown",(e,t)=>{if(this.isEnabled&&Object(T.v)(t.keyCode)){const o=new A.a(this.document,"arrowKey",this.document.selection.getFirstRange());this.document.fire(o,t),o.stop.called&&e.stop()}})}observe(){}}var E=o("./packages/ckeditor5-utils/src/observablemixin.js"),S=o("./packages/ckeditor5-utils/src/mix.js"),R=o("./packages/ckeditor5-utils/src/dom/isrange.js"),M=o("./packages/ckeditor5-utils/src/dom/rect.js"),N=o("./packages/ckeditor5-utils/src/dom/istext.js");function I({target:e,viewportOffset:t=0}){const o=W(e);let i=o,s=null;for(;i;){let r;r=H(i==o?e:s),V(r,()=>q(e,i));const n=q(e,i);if(z(i,n,t),i.parent!=i){if(s=i.frameElement,i=i.parent,!s)return}else i=null}}function z(e,t,o){const i=t.clone().moveBy(0,o),s=t.clone().moveBy(0,-o),r=new M.a(e).excludeScrollbarsAndBorders();if(![s,i].every(e=>r.contains(e))){let{scrollX:n,scrollY:a}=e;B(s,r)?a-=r.top-t.top+o:D(i,r)&&(a+=t.bottom-r.bottom+o),F(t,r)?n-=r.left-t.left+o:L(t,r)&&(n+=t.right-r.right+o),e.scrollTo(n,a)}}function V(e,t){const o=W(e);let i,s;for(;e!=o.document.body;)s=t(),i=new M.a(e).excludeScrollbarsAndBorders(),i.contains(s)||(B(s,i)?e.scrollTop-=i.top-s.top:D(s,i)&&(e.scrollTop+=s.bottom-i.bottom),F(s,i)?e.scrollLeft-=i.left-s.left:L(s,i)&&(e.scrollLeft+=s.right-i.right)),e=e.parentNode}function D(e,t){return e.bottom>t.bottom}function B(e,t){return e.top<t.top}function F(e,t){return e.left<t.left}function L(e,t){return e.right>t.right}function W(e){return Object(R.a)(e)?e.startContainer.ownerDocument.defaultView:e.ownerDocument.defaultView}function H(e){if(Object(R.a)(e)){let t=e.commonAncestorContainer;return Object(N.a)(t)&&(t=t.parentNode),t}return e.parentNode}function q(e,t){const o=W(e),i=new M.a(e);if(o===t)return i;{let e=o;for(;e!=t;){const t=e.frameElement,o=new M.a(t).excludeScrollbarsAndBorders();i.moveBy(o.left,o.top),e=e.parent}}return i}Object.assign({},{scrollViewportToShowTarget:I,scrollAncestorsToShowTarget:function(e){V(H(e),()=>new M.a(e))}});var $=o("./packages/ckeditor5-engine/src/view/uielement.js"),U=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),K=o("./packages/ckeditor5-utils/src/env.js");class G{constructor(e){this.document=new n.a(e),this.domConverter=new l.a(this.document),this.domRoots=new Map,this.set("isRenderingInProgress",!1),this.set("hasDomSelection",!1),this._renderer=new c.a(this.domConverter,this.document.selection),this._renderer.bind("isFocused","isSelecting").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 a.a(this.document),this.addObserver(k),this.addObserver(j),this.addObserver(x),this.addObserver(w),this.addObserver(y),this.addObserver(P),this.addObserver(C),K.a.isAndroid&&this.addObserver(O),Object(g.g)(this),Object($.b)(this),this.on("render",()=>{this._render(),this.document.fire("layoutChanged"),this._hasChangedSinceTheLastRendering=!1}),this.listenTo(this.document.selection,"change",()=>{this._hasChangedSinceTheLastRendering=!0}),this.listenTo(this.document,"change:isFocused",()=>{this._hasChangedSinceTheLastRendering=!0})}attachDomRoot(e,t="main"){const o=this.document.getRoot(t);o._name=e.tagName.toLowerCase();const i={};for(const{name:t,value:s}of Array.from(e.attributes))i[t]=s,"class"===t?this._writer.addClass(s.split(" "),o):this._writer.setAttribute(t,s,o);this._initialDomRootAttributes.set(e,i);const s=()=>{this._writer.setAttribute("contenteditable",!o.isReadOnly,o),o.isReadOnly?this._writer.addClass("ck-read-only",o):this._writer.removeClass("ck-read-only",o)};s(),this.domRoots.set(t,e),this.domConverter.bindElements(e,o),this._renderer.markToSync("children",o),this._renderer.markToSync("attributes",o),this._renderer.domDocuments.add(e.ownerDocument),o.on("change:children",(e,t)=>this._renderer.markToSync("children",t)),o.on("change:attributes",(e,t)=>this._renderer.markToSync("attributes",t)),o.on("change:text",(e,t)=>this._renderer.markToSync("text",t)),o.on("change:isReadOnly",()=>this.change(s)),o.on("change",()=>{this._hasChangedSinceTheLastRendering=!0});for(const o of this._observers.values())o.observe(e,t)}detachDomRoot(e){const t=this.domRoots.get(e);Array.from(t.attributes).forEach(({name:e})=>t.removeAttribute(e));const o=this._initialDomRootAttributes.get(t);for(const e in o)t.setAttribute(e,o[e]);this.domRoots.delete(e),this.domConverter.unbindDomElement(t)}getDomRoot(e="main"){return this.domRoots.get(e)}addObserver(e){let t=this._observers.get(e);if(t)return t;t=new e(this),this._observers.set(e,t);for(const[e,o]of this.domRoots)t.observe(o,e);return t.enable(),t}getObserver(e){return this._observers.get(e)}disableObservers(){for(const e of this._observers.values())e.disable()}enableObservers(){for(const e of this._observers.values())e.enable()}scrollToTheSelection(){const e=this.document.selection.getFirstRange();e&&I({target:this.domConverter.viewRangeToDom(e),viewportOffset:20})}focus(){if(!this.document.isFocused){const e=this.document.selection.editableElement;e&&(this.domConverter.focus(e),this.forceRender())}}change(e){if(this.isRenderingInProgress||this._postFixersInProgress)throw new U.a("cannot-change-view-tree",this);try{if(this._ongoingChange)return e(this._writer);this._ongoingChange=!0;const t=e(this._writer);return this._ongoingChange=!1,!this._renderingDisabled&&this._hasChangedSinceTheLastRendering&&(this._postFixersInProgress=!0,this.document._callPostFixers(this._writer),this._postFixersInProgress=!1,this.fire("render")),t}catch(e){U.a.rethrowUnexpectedError(e,this)}}forceRender(){this._hasChangedSinceTheLastRendering=!0,this.change(()=>{})}destroy(){for(const e of this._observers.values())e.destroy();this.document.destroy(),this.stopListening()}createPositionAt(e,t){return d.a._createAt(e,t)}createPositionAfter(e){return d.a._createAfter(e)}createPositionBefore(e){return d.a._createBefore(e)}createRange(e,t){return new u.a(e,t)}createRangeOn(e){return u.a._createOn(e)}createRangeIn(e){return u.a._createIn(e)}createSelection(e,t,o){return new h.a(e,t,o)}_disableRendering(e){this._renderingDisabled=e,0==e&&this.change(()=>{})}_render(){this.isRenderingInProgress=!0,this.disableObservers(),this._renderer.render(),this.enableObservers(),this.isRenderingInProgress=!1}}Object(S.a)(G,E.a);var J=o("./packages/ckeditor5-engine/src/conversion/mapper.js"),Y=o("./packages/ckeditor5-engine/src/conversion/downcastdispatcher.js"),X=o("./packages/ckeditor5-engine/src/conversion/downcasthelpers.js"),Z=o("./packages/ckeditor5-engine/src/conversion/upcasthelpers.js");class Q{constructor(e,t){this.model=e,this.view=new G(t),this.mapper=new J.a,this.downcastDispatcher=new Y.a({mapper:this.mapper,schema:e.schema});const o=this.model.document,i=o.selection,s=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(o,"change",()=>{this.view.change(e=>{this.downcastDispatcher.convertChanges(o.differ,s,e),this.downcastDispatcher.convertSelection(i,s,e)})},{priority:"low"}),this.listenTo(this.view.document,"selectionChange",Object(Z.a)(this.model,this.mapper)),this.downcastDispatcher.on("insert:$text",Object(X.e)(),{priority:"lowest"}),this.downcastDispatcher.on("remove",Object(X.f)(),{priority:"low"}),this.downcastDispatcher.on("selection",Object(X.a)(),{priority:"high"}),this.downcastDispatcher.on("selection",Object(X.c)(),{priority:"low"}),this.downcastDispatcher.on("selection",Object(X.b)(),{priority:"low"}),this.view.document.roots.bindTo(this.model.document.roots).using(e=>{if("$graveyard"==e.rootName)return null;const t=new r(this.view.document,e.name);return t.rootName=e.rootName,this.mapper.bindElements(e,t),t})}destroy(){this.view.destroy(),this.stopListening()}}Object(S.a)(Q,E.a)},"./packages/ckeditor5-engine/src/conversion/conversion.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./packages/ckeditor5-engine/src/conversion/upcasthelpers.js"),r=o("./packages/ckeditor5-engine/src/conversion/downcasthelpers.js"),n=o("./packages/ckeditor5-utils/src/toarray.js");class a{constructor(e,t){this._helpers=new Map,this._downcast=Object(n.a)(e),this._createConversionHelpers({name:"downcast",dispatchers:this._downcast,isDowncast:!0}),this._upcast=Object(n.a)(t),this._createConversionHelpers({name:"upcast",dispatchers:this._upcast,isDowncast:!1})}addAlias(e,t){const o=this._downcast.includes(t);if(!this._upcast.includes(t)&&!o)throw new i.a("conversion-add-alias-dispatcher-not-registered",this);this._createConversionHelpers({name:e,dispatchers:[t],isDowncast:o})}for(e){if(!this._helpers.has(e))throw new i.a("conversion-for-unknown-group",this);return this._helpers.get(e)}elementToElement(e){this.for("downcast").elementToElement(e);for(const{model:t,view:o}of c(e))this.for("upcast").elementToElement({model:t,view:o,converterPriority:e.converterPriority})}attributeToElement(e){this.for("downcast").attributeToElement(e);for(const{model:t,view:o}of c(e))this.for("upcast").elementToAttribute({view:o,model:t,converterPriority:e.converterPriority})}attributeToAttribute(e){this.for("downcast").attributeToAttribute(e);for(const{model:t,view:o}of c(e))this.for("upcast").attributeToAttribute({view:o,model:t})}_createConversionHelpers({name:e,dispatchers:t,isDowncast:o}){if(this._helpers.has(e))throw new i.a("conversion-group-exists",this);const n=o?new r.d(t):new s.d(t);this._helpers.set(e,n)}}function*c(e){if(e.model.values)for(const t of e.model.values){const o={key:e.model.key,value:t},i=e.view[t],s=e.upcastAlso?e.upcastAlso[t]:void 0;yield*l(o,i,s)}else yield*l(e.model,e.view,e.upcastAlso)}function*l(e,t,o){if(yield{model:e,view:t},o)for(const t of Object(n.a)(o))yield{model:e,view:t}}},"./packages/ckeditor5-engine/src/conversion/conversionhelpers.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return i}));class i{constructor(e){this._dispatchers=e}add(e){for(const t of this._dispatchers)e(t);return this}}},"./packages/ckeditor5-engine/src/conversion/downcastdispatcher.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return d}));var i=o("./packages/ckeditor5-engine/src/model/textproxy.js");class s{constructor(){this._consumable=new Map,this._textProxyRegistry=new Map}add(e,t){t=r(t),e instanceof i.a&&(e=this._getSymbolForTextProxy(e)),this._consumable.has(e)||this._consumable.set(e,new Map),this._consumable.get(e).set(t,!0)}consume(e,t){return t=r(t),e instanceof i.a&&(e=this._getSymbolForTextProxy(e)),!!this.test(e,t)&&(this._consumable.get(e).set(t,!1),!0)}test(e,t){t=r(t),e instanceof i.a&&(e=this._getSymbolForTextProxy(e));const o=this._consumable.get(e);if(void 0===o)return null;const s=o.get(t);return void 0===s?null:s}revert(e,t){t=r(t),e instanceof i.a&&(e=this._getSymbolForTextProxy(e));const o=this.test(e,t);return!1===o?(this._consumable.get(e).set(t,!0),!0):!0!==o&&null}_getSymbolForTextProxy(e){let t=null;const o=this._textProxyRegistry.get(e.startOffset);if(o){const i=o.get(e.endOffset);i&&(t=i.get(e.parent))}return t||(t=this._addSymbolForTextProxy(e.startOffset,e.endOffset,e.parent)),t}_addSymbolForTextProxy(e,t,o){const i=Symbol("textProxySymbol");let s,r;return s=this._textProxyRegistry.get(e),s||(s=new Map,this._textProxyRegistry.set(e,s)),r=s.get(t),r||(r=new Map,s.set(t,r)),r.set(o,i),i}}function r(e){const t=e.split(":");return"addMarker"==t[0]||"removeMarker"==t[0]?e:t.length>1?t[0]+":"+t[1]:t[0]}var n=o("./packages/ckeditor5-engine/src/model/range.js"),a=o("./packages/ckeditor5-engine/src/model/position.js"),c=o("./packages/ckeditor5-utils/src/emittermixin.js"),l=o("./packages/ckeditor5-utils/src/mix.js");class d{constructor(e){this.conversionApi=Object.assign({dispatcher:this},e),this._reconversionEventsMapping=new Map}convertChanges(e,t,o){for(const t of e.getMarkersToRemove())this.convertMarkerRemove(t.name,t.range,o);const i=this._mapChangesWithAutomaticReconversion(e);for(const e of i)"insert"===e.type?this.convertInsert(n.a._createFromPositionAndShift(e.position,e.length),o):"remove"===e.type?this.convertRemove(e.position,e.length,e.name,o):"reconvert"===e.type?this.reconvertElement(e.element,o):this.convertAttribute(e.range,e.attributeKey,e.attributeOldValue,e.attributeNewValue,o);for(const e of this.conversionApi.mapper.flushUnboundMarkerNames()){const i=t.get(e).getRange();this.convertMarkerRemove(e,i,o),this.convertMarkerAdd(e,i,o)}for(const t of e.getMarkersToAdd())this.convertMarkerAdd(t.name,t.range,o)}convertInsert(e,t){this.conversionApi.writer=t,this.conversionApi.consumable=this._createInsertConsumable(e);for(const t of Array.from(e).map(h))this._convertInsertWithAttributes(t);this._clearConversionApi()}convertRemove(e,t,o,i){this.conversionApi.writer=i,this.fire("remove:"+o,{position:e,length:t},this.conversionApi),this._clearConversionApi()}convertAttribute(e,t,o,i,s){this.conversionApi.writer=s,this.conversionApi.consumable=this._createConsumableForRange(e,"attribute:"+t);for(const s of e){const e={item:s.item,range:n.a._createFromPositionAndShift(s.previousPosition,s.length),attributeKey:t,attributeOldValue:o,attributeNewValue:i};this._testAndFire("attribute:"+t,e)}this._clearConversionApi()}reconvertElement(e,t){const o=n.a._createOn(e);this.conversionApi.writer=t,this.conversionApi.consumable=this._createInsertConsumable(o);const i=this.conversionApi.mapper,s=i.toViewElement(e);t.remove(s),this._convertInsertWithAttributes({item:e,range:o});const r=i.toViewElement(e);for(const o of n.a._createIn(e)){const{item:e}=o,s=p(e,i);s?s.root!==r.root&&t.move(t.createRangeOn(s),i.toViewPosition(a.a._createBefore(e))):this._convertInsertWithAttributes(h(o))}i.unbindViewElement(s),this._clearConversionApi()}convertSelection(e,t,o){const i=Array.from(t.getMarkersAtPosition(e.getFirstPosition()));if(this.conversionApi.writer=o,this.conversionApi.consumable=this._createSelectionConsumable(e,i),this.fire("selection",{selection:e},this.conversionApi),e.isCollapsed){for(const t of i){const o=t.getRange();if(!u(e.getFirstPosition(),t,this.conversionApi.mapper))continue;const i={item:e,markerName:t.name,markerRange:o};this.conversionApi.consumable.test(e,"addMarker:"+t.name)&&this.fire("addMarker:"+t.name,i,this.conversionApi)}for(const t of e.getAttributeKeys()){const o={item:e,range:e.getFirstRange(),attributeKey:t,attributeOldValue:null,attributeNewValue:e.getAttribute(t)};this.conversionApi.consumable.test(e,"attribute:"+o.attributeKey)&&this.fire("attribute:"+o.attributeKey+":$text",o,this.conversionApi)}this._clearConversionApi()}else this._clearConversionApi()}convertMarkerAdd(e,t,o){if("$graveyard"==t.root.rootName)return;this.conversionApi.writer=o;const i="addMarker:"+e,r=new s;if(r.add(t,i),this.conversionApi.consumable=r,this.fire(i,{markerName:e,markerRange:t},this.conversionApi),r.test(t,i)){this.conversionApi.consumable=this._createConsumableForRange(t,i);for(const o of t.getItems()){if(!this.conversionApi.consumable.test(o,i))continue;const s={item:o,range:n.a._createOn(o),markerName:e,markerRange:t};this.fire(i,s,this.conversionApi)}this._clearConversionApi()}else this._clearConversionApi()}convertMarkerRemove(e,t,o){"$graveyard"!=t.root.rootName&&(this.conversionApi.writer=o,this.fire("removeMarker:"+e,{markerName:e,markerRange:t},this.conversionApi),this._clearConversionApi())}_mapReconversionTriggerEvent(e,t){this._reconversionEventsMapping.set(t,e)}_createInsertConsumable(e){const t=new s;for(const o of e){const e=o.item;t.add(e,"insert");for(const o of e.getAttributeKeys())t.add(e,"attribute:"+o)}return t}_createConsumableForRange(e,t){const o=new s;for(const i of e.getItems())o.add(i,t);return o}_createSelectionConsumable(e,t){const o=new s;o.add(e,"selection");for(const i of t)o.add(e,"addMarker:"+i.name);for(const t of e.getAttributeKeys())o.add(e,"attribute:"+t);return o}_testAndFire(e,t){this.conversionApi.consumable.test(t.item,e)&&this.fire(function(e,t){const o=t.item.name||"$text";return`${e}:${o}`}(e,t),t,this.conversionApi)}_clearConversionApi(){delete this.conversionApi.writer,delete this.conversionApi.consumable}_convertInsertWithAttributes(e){this._testAndFire("insert",e);for(const t of e.item.getAttributeKeys())e.attributeKey=t,e.attributeOldValue=null,e.attributeNewValue=e.item.getAttribute(t),this._testAndFire("attribute:"+t,e)}_mapChangesWithAutomaticReconversion(e){const t=new Set,o=[];for(const i of e.getChanges()){const e=i.position||i.range.start,s=e.parent;if(Object(a.d)(e,s)){o.push(i);continue}const r="attribute"===i.type?Object(a.b)(e,s,null):s;if(r.is("$text")){o.push(i);continue}let n;if(n="attribute"===i.type?`attribute:${i.attributeKey}:${r.name}`:`${i.type}:${i.name}`,this._isReconvertTriggerEvent(n,r.name)){if(t.has(r))continue;t.add(r),o.push({type:"reconvert",element:r})}else o.push(i)}return o}_isReconvertTriggerEvent(e,t){return this._reconversionEventsMapping.get(e)===t}}function u(e,t,o){const i=t.getRange(),s=Array.from(e.getAncestors());s.shift(),s.reverse();return!s.some(e=>{if(i.containsItem(e)){return!!o.toViewElement(e).getCustomProperty("addHighlight")}})}function h(e){return{item:e.item,range:n.a._createFromPositionAndShift(e.previousPosition,e.length)}}function p(e,t){if(e.is("textProxy")){const o=t.toViewPosition(a.a._createBefore(e)).parent;return o.is("$text")?o:null}return t.toViewElement(e)}Object(l.a)(d,c.c)},"./packages/ckeditor5-engine/src/conversion/downcasthelpers.js":function(e,t,o){"use strict";o.d(t,"d",(function(){return h})),o.d(t,"e",(function(){return p})),o.d(t,"f",(function(){return g})),o.d(t,"c",(function(){return m})),o.d(t,"b",(function(){return k})),o.d(t,"a",(function(){return b}));var i=o("./packages/ckeditor5-engine/src/model/range.js"),s=o("./packages/ckeditor5-engine/src/model/selection.js"),r=o("./packages/ckeditor5-engine/src/model/element.js"),n=o("./packages/ckeditor5-engine/src/view/attributeelement.js"),a=o("./packages/ckeditor5-engine/src/model/documentselection.js"),c=o("./packages/ckeditor5-engine/src/conversion/conversionhelpers.js"),l=o("./node_modules/lodash-es/cloneDeep.js"),d=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),u=o("./packages/ckeditor5-utils/src/toarray.js");class h extends c.a{elementToElement(e){return this.add(function(e){return(e=Object(l.a)(e)).view=w(e.view,"container"),t=>{var o;if(t.on("insert:"+e.model,(o=e.view,(e,t,i)=>{const s=o(t.item,i);if(!s)return;if(!i.consumable.consume(t.item,"insert"))return;const r=i.mapper.toViewPosition(t.range.start);i.mapper.bindElements(t.item,s),i.writer.insert(r,s)}),{priority:e.converterPriority||"normal"}),e.triggerBy){if(e.triggerBy.attributes)for(const o of e.triggerBy.attributes)t._mapReconversionTriggerEvent(e.model,`attribute:${o}:${e.model}`);if(e.triggerBy.children)for(const o of e.triggerBy.children)t._mapReconversionTriggerEvent(e.model,"insert:"+o),t._mapReconversionTriggerEvent(e.model,"remove:"+o)}}}(e))}attributeToElement(e){return this.add(function(e){e=Object(l.a)(e);let t="attribute:"+(e.model.key?e.model.key:e.model);e.model.name&&(t+=":"+e.model.name);if(e.model.values)for(const t of e.model.values)e.view[t]=w(e.view[t],"attribute");else e.view=w(e.view,"attribute");const o=v(e);return i=>{i.on(t,function(e){return(t,o,i)=>{const r=e(o.attributeOldValue,i),n=e(o.attributeNewValue,i);if(!r&&!n)return;if(!i.consumable.consume(o.item,t.name))return;const c=i.writer,l=c.document.selection;if(o.item instanceof s.a||o.item instanceof a.a)c.wrap(l.getFirstRange(),n);else{let e=i.mapper.toViewRange(o.range);null!==o.attributeOldValue&&r&&(e=c.unwrap(e,r)),null!==o.attributeNewValue&&n&&c.wrap(e,n)}}}(o),{priority:e.converterPriority||"normal"})}}(e))}attributeToAttribute(e){return this.add(function(e){e=Object(l.a)(e);let t="attribute:"+(e.model.key?e.model.key:e.model);e.model.name&&(t+=":"+e.model.name);if(e.model.values)for(const t of e.model.values)e.view[t]=y(e.view[t]);else e.view=y(e.view);const o=v(e);return i=>{var s;i.on(t,(s=o,(e,t,o)=>{const i=s(t.attributeOldValue,o),r=s(t.attributeNewValue,o);if(!i&&!r)return;if(!o.consumable.consume(t.item,e.name))return;const n=o.mapper.toViewElement(t.item),a=o.writer;if(!n)throw new d.a("conversion-attribute-to-attribute-on-text",[t,o]);if(null!==t.attributeOldValue&&i)if("class"==i.key){const e=Object(u.a)(i.value);for(const t of e)a.removeClass(t,n)}else if("style"==i.key){const e=Object.keys(i.value);for(const t of e)a.removeStyle(t,n)}else a.removeAttribute(i.key,n);if(null!==t.attributeNewValue&&r)if("class"==r.key){const e=Object(u.a)(r.value);for(const t of e)a.addClass(t,n)}else if("style"==r.key){const e=Object.keys(r.value);for(const t of e)a.setStyle(t,r.value[t],n)}else a.setAttribute(r.key,r.value,n)}),{priority:e.converterPriority||"normal"})}}(e))}markerToElement(e){return this.add(function(e){return(e=Object(l.a)(e)).view=w(e.view,"ui"),t=>{var o;t.on("addMarker:"+e.model,(o=e.view,(e,t,i)=>{t.isOpening=!0;const s=o(t,i);t.isOpening=!1;const r=o(t,i);if(!s||!r)return;const n=t.markerRange;if(n.isCollapsed&&!i.consumable.consume(n,e.name))return;for(const t of n)if(!i.consumable.consume(t.item,e.name))return;const a=i.mapper,c=i.writer;c.insert(a.toViewPosition(n.start),s),i.mapper.bindElementToMarker(s,t.markerName),n.isCollapsed||(c.insert(a.toViewPosition(n.end),r),i.mapper.bindElementToMarker(r,t.markerName)),e.stop()}),{priority:e.converterPriority||"normal"}),t.on("removeMarker:"+e.model,(e.view,(e,t,o)=>{const i=o.mapper.markerNameToElements(t.markerName);if(i){for(const e of i)o.mapper.unbindElementFromMarkerName(e,t.markerName),o.writer.clear(o.writer.createRangeOn(e),e);o.writer.clearClonedElementsGroup(t.markerName),e.stop()}}),{priority:e.converterPriority||"normal"})}}(e))}markerToHighlight(e){return this.add(function(e){return t=>{var o;t.on("addMarker:"+e.model,(o=e.view,(e,t,i)=>{if(!t.item)return;if(!(t.item instanceof s.a||t.item instanceof a.a||t.item.is("$textProxy")))return;const r=j(o,t,i);if(!r)return;if(!i.consumable.consume(t.item,e.name))return;const n=i.writer,c=f(n,r),l=n.document.selection;if(t.item instanceof s.a||t.item instanceof a.a)n.wrap(l.getFirstRange(),c,l);else{const e=i.mapper.toViewRange(t.range),o=n.wrap(e,c);for(const e of o.getItems())if(e.is("attributeElement")&&e.isSimilar(c)){i.mapper.bindElementToMarker(e,t.markerName);break}}}),{priority:e.converterPriority||"normal"}),t.on("addMarker:"+e.model,function(e){return(t,o,s)=>{if(!o.item)return;if(!(o.item instanceof r.a))return;const n=j(e,o,s);if(!n)return;if(!s.consumable.test(o.item,t.name))return;const a=s.mapper.toViewElement(o.item);if(a&&a.getCustomProperty("addHighlight")){s.consumable.consume(o.item,t.name);for(const e of i.a._createIn(o.item))s.consumable.consume(e.item,t.name);a.getCustomProperty("addHighlight")(a,n,s.writer),s.mapper.bindElementToMarker(a,o.markerName)}}}(e.view),{priority:e.converterPriority||"normal"}),t.on("removeMarker:"+e.model,function(e){return(t,o,i)=>{if(o.markerRange.isCollapsed)return;const s=j(e,o,i);if(!s)return;const r=f(i.writer,s),n=i.mapper.markerNameToElements(o.markerName);if(n){for(const e of n)i.mapper.unbindElementFromMarkerName(e,o.markerName),e.is("attributeElement")?i.writer.unwrap(i.writer.createRangeOn(e),r):e.getCustomProperty("removeHighlight")(e,s.id,i.writer);i.writer.clearClonedElementsGroup(o.markerName),t.stop()}}}(e.view),{priority:e.converterPriority||"normal"})}}(e))}markerToData(e){return this.add(function(e){const t=(e=Object(l.a)(e)).model;e.view||(e.view=o=>({group:t,name:o.substr(e.model.length+1)}));return o=>{var i;o.on("addMarker:"+t,(i=e.view,(e,t,o)=>{const s=i(t.markerName,o);if(!s)return;const r=t.markerRange;o.consumable.consume(r,e.name)&&(_(r,!1,o,t,s),_(r,!0,o,t,s),e.stop())}),{priority:e.converterPriority||"normal"}),o.on("removeMarker:"+t,function(e){return(t,o,i)=>{const s=e(o.markerName,i);if(!s)return;const r=i.mapper.markerNameToElements(o.markerName);if(r){for(const e of r)i.mapper.unbindElementFromMarkerName(e,o.markerName),e.is("containerElement")?(n(`data-${s.group}-start-before`,e),n(`data-${s.group}-start-after`,e),n(`data-${s.group}-end-before`,e),n(`data-${s.group}-end-after`,e)):i.writer.clear(i.writer.createRangeOn(e),e);i.writer.clearClonedElementsGroup(o.markerName),t.stop()}function n(e,t){if(t.hasAttribute(e)){const o=new Set(t.getAttribute(e).split(","));o.delete(s.name),0==o.size?i.writer.removeAttribute(e,t):i.writer.setAttribute(e,Array.from(o).join(","),t)}}}}(e.view),{priority:e.converterPriority||"normal"})}}(e))}}function p(){return(e,t,o)=>{if(!o.consumable.consume(t.item,"insert"))return;const i=o.writer,s=o.mapper.toViewPosition(t.range.start),r=i.createText(t.item.data);i.insert(s,r)}}function g(){return(e,t,o)=>{const i=o.mapper.toViewPosition(t.position),s=t.position.getShiftedBy(t.length),r=o.mapper.toViewPosition(s,{isPhantom:!0}),n=o.writer.createRange(i,r),a=o.writer.remove(n.getTrimmed());for(const e of o.writer.createRangeIn(a).getItems())o.mapper.unbindViewElement(e)}}function f(e,t){const o=e.createAttributeElement("span",t.attributes);return t.classes&&o._addClass(t.classes),"number"==typeof t.priority&&(o._priority=t.priority),o._id=t.id,o}function m(){return(e,t,o)=>{const i=t.selection;if(i.isCollapsed)return;if(!o.consumable.consume(i,"selection"))return;const s=[];for(const e of i.getRanges()){const t=o.mapper.toViewRange(e);s.push(t)}o.writer.setSelection(s,{backward:i.isBackward})}}function k(){return(e,t,o)=>{const i=t.selection;if(!i.isCollapsed)return;if(!o.consumable.consume(i,"selection"))return;const s=o.writer,r=i.getFirstPosition(),n=o.mapper.toViewPosition(r),a=s.breakAttributes(n);s.setSelection(a)}}function b(){return(e,t,o)=>{const i=o.writer,s=i.document.selection;for(const e of s.getRanges())e.isCollapsed&&e.end.parent.isAttached()&&o.writer.mergeAttributes(e.start);i.setSelection(null)}}function _(e,t,o,i,s){const r=t?e.start:e.end,n=r.nodeAfter&&r.nodeAfter.is("element")?r.nodeAfter:null,a=r.nodeBefore&&r.nodeBefore.is("element")?r.nodeBefore:null;if(n||a){let e,r;t&&n||!t&&!a?(e=n,r=!0):(e=a,r=!1);const c=o.mapper.toViewElement(e);if(c)return void function(e,t,o,i,s,r){const n=`data-${r.group}-${t?"start":"end"}-${o?"before":"after"}`,a=e.hasAttribute(n)?e.getAttribute(n).split(","):[];a.unshift(r.name),i.writer.setAttribute(n,a.join(","),e),i.mapper.bindElementToMarker(e,s.markerName)}(c,t,r,o,i,s)}!function(e,t,o,i,s){const r=`${s.group}-${t?"start":"end"}`,n=s.name?{name:s.name}:null,a=o.writer.createUIElement(r,n);o.writer.insert(e,a),o.mapper.bindElementToMarker(a,i.markerName)}(o.mapper.toViewPosition(r),t,o,i,s)}function w(e,t){return"function"==typeof e?e:(o,i)=>function(e,t,o){"string"==typeof e&&(e={name:e});let i;const s=t.writer,r=Object.assign({},e.attributes);if("container"==o)i=s.createContainerElement(e.name,r);else if("attribute"==o){const t={priority:e.priority||n.a.DEFAULT_PRIORITY};i=s.createAttributeElement(e.name,r,t)}else i=s.createUIElement(e.name,r);if(e.styles){const t=Object.keys(e.styles);for(const o of t)s.setStyle(o,e.styles[o],i)}if(e.classes){const t=e.classes;if("string"==typeof t)s.addClass(t,i);else for(const e of t)s.addClass(e,i)}return i}(e,i,t)}function v(e){return e.model.values?(t,o)=>{const i=e.view[t];return i?i(t,o):null}:e.view}function y(e){return"string"==typeof e?t=>({key:e,value:t}):"object"==typeof e?e.value?()=>e:t=>({key:e.key,value:t}):e}function j(e,t,o){const i="function"==typeof e?e(t,o):e;return i?(i.priority||(i.priority=10),i.id||(i.id=t.markerName),i):null}},"./packages/ckeditor5-engine/src/conversion/mapper.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return d}));var i=o("./packages/ckeditor5-engine/src/model/position.js"),s=o("./packages/ckeditor5-engine/src/model/range.js"),r=o("./packages/ckeditor5-engine/src/view/position.js"),n=o("./packages/ckeditor5-engine/src/view/range.js"),a=o("./packages/ckeditor5-engine/src/view/text.js"),c=o("./packages/ckeditor5-utils/src/emittermixin.js"),l=o("./packages/ckeditor5-utils/src/mix.js");class d{constructor(){this._modelToViewMapping=new WeakMap,this._viewToModelMapping=new WeakMap,this._viewToModelLengthCallbacks=new Map,this._markerNameToElements=new Map,this._elementToMarkerNames=new Map,this._unboundMarkerNames=new Set,this.on("modelToViewPosition",(e,t)=>{if(t.viewPosition)return;const o=this._modelToViewMapping.get(t.modelPosition.parent);t.viewPosition=this.findPositionIn(o,t.modelPosition.offset)},{priority:"low"}),this.on("viewToModelPosition",(e,t)=>{if(t.modelPosition)return;const o=this.findMappedViewAncestor(t.viewPosition),s=this._viewToModelMapping.get(o),r=this._toModelOffset(t.viewPosition.parent,t.viewPosition.offset,o);t.modelPosition=i.a._createAt(s,r)},{priority:"low"})}bindElements(e,t){this._modelToViewMapping.set(e,t),this._viewToModelMapping.set(t,e)}unbindViewElement(e){const t=this.toModelElement(e);if(this._viewToModelMapping.delete(e),this._elementToMarkerNames.has(e))for(const t of this._elementToMarkerNames.get(e))this._unboundMarkerNames.add(t);this._modelToViewMapping.get(t)==e&&this._modelToViewMapping.delete(t)}unbindModelElement(e){const t=this.toViewElement(e);this._modelToViewMapping.delete(e),this._viewToModelMapping.get(t)==e&&this._viewToModelMapping.delete(t)}bindElementToMarker(e,t){const o=this._markerNameToElements.get(t)||new Set;o.add(e);const i=this._elementToMarkerNames.get(e)||new Set;i.add(t),this._markerNameToElements.set(t,o),this._elementToMarkerNames.set(e,i)}unbindElementFromMarkerName(e,t){const o=this._markerNameToElements.get(t);o&&(o.delete(e),0==o.size&&this._markerNameToElements.delete(t));const i=this._elementToMarkerNames.get(e);i&&(i.delete(t),0==i.size&&this._elementToMarkerNames.delete(e))}flushUnboundMarkerNames(){const e=Array.from(this._unboundMarkerNames);return this._unboundMarkerNames.clear(),e}clearBindings(){this._modelToViewMapping=new WeakMap,this._viewToModelMapping=new WeakMap,this._markerNameToElements=new Map,this._elementToMarkerNames=new Map,this._unboundMarkerNames=new Set}toModelElement(e){return this._viewToModelMapping.get(e)}toViewElement(e){return this._modelToViewMapping.get(e)}toModelRange(e){return new s.a(this.toModelPosition(e.start),this.toModelPosition(e.end))}toViewRange(e){return new n.a(this.toViewPosition(e.start),this.toViewPosition(e.end))}toModelPosition(e){const t={viewPosition:e,mapper:this};return this.fire("viewToModelPosition",t),t.modelPosition}toViewPosition(e,t={isPhantom:!1}){const o={modelPosition:e,mapper:this,isPhantom:t.isPhantom};return this.fire("modelToViewPosition",o),o.viewPosition}markerNameToElements(e){const t=this._markerNameToElements.get(e);if(!t)return null;const o=new Set;for(const e of t)if(e.is("attributeElement"))for(const t of e.getElementsWithSameId())o.add(t);else o.add(e);return o}registerViewToModelLength(e,t){this._viewToModelLengthCallbacks.set(e,t)}findMappedViewAncestor(e){let t=e.parent;for(;!this._viewToModelMapping.has(t);)t=t.parent;return t}_toModelOffset(e,t,o){if(o!=e){return this._toModelOffset(e.parent,e.index,o)+this._toModelOffset(e,t,e)}if(e.is("$text"))return t;let i=0;for(let o=0;o<t;o++)i+=this.getModelLength(e.getChild(o));return i}getModelLength(e){if(this._viewToModelLengthCallbacks.get(e.name)){return this._viewToModelLengthCallbacks.get(e.name)(e)}if(this._viewToModelMapping.has(e))return 1;if(e.is("$text"))return e.data.length;if(e.is("uiElement"))return 0;{let t=0;for(const o of e.getChildren())t+=this.getModelLength(o);return t}}findPositionIn(e,t){let o,i=0,s=0,n=0;if(e.is("$text"))return new r.a(e,t);for(;s<t;)o=e.getChild(n),i=this.getModelLength(o),s+=i,n++;return s==t?this._moveViewPositionToTextNode(new r.a(e,n)):this.findPositionIn(o,t-(s-i))}_moveViewPositionToTextNode(e){const t=e.nodeBefore,o=e.nodeAfter;return t instanceof a.a?new r.a(t,t.data.length):o instanceof a.a?new r.a(o,0):e}}Object(l.a)(d,c.c)},"./packages/ckeditor5-engine/src/conversion/upcasthelpers.js":function(e,t,o){"use strict";o.d(t,"d",(function(){return c})),o.d(t,"c",(function(){return l})),o.d(t,"b",(function(){return d})),o.d(t,"a",(function(){return u}));var i=o("./packages/ckeditor5-engine/src/view/matcher.js"),s=o("./packages/ckeditor5-engine/src/conversion/conversionhelpers.js"),r=o("./node_modules/lodash-es/cloneDeep.js"),n=o("./packages/ckeditor5-utils/src/priorities.js"),a=o("./packages/ckeditor5-engine/src/model/utils/autoparagraphing.js");class c extends s.a{elementToElement(e){return this.add(h(e))}elementToAttribute(e){return this.add(function(e){f(e=Object(r.a)(e));const t=m(e,!1),o=p(e.view),i=o?"element:"+o:"element";return o=>{o.on(i,t,{priority:e.converterPriority||"low"})}}(e))}attributeToAttribute(e){return this.add(function(e){e=Object(r.a)(e);let t=null;("string"==typeof e.view||e.view.key)&&(t=function(e){"string"==typeof e.view&&(e.view={key:e.view});const t=e.view.key;let o;if("class"==t||"style"==t){o={["class"==t?"classes":"styles"]:e.view.value}}else{const i=void 0===e.view.value?/[\s\S]*/:e.view.value;o={attributes:{[t]:i}}}e.view.name&&(o.name=e.view.name);return e.view=o,t}(e));f(e,t);const o=m(e,!0);return t=>{t.on("element",o,{priority:e.converterPriority||"low"})}}(e))}elementToMarker(e){return this.add(function(e){return function(e){const t=e.model;e.model=(e,o)=>{const i="string"==typeof t?t:t(e,o);return o.writer.createElement("$marker",{"data-name":i})}}(e=Object(r.a)(e)),h(e)}(e))}dataToMarker(e){return this.add(function(e){(e=Object(r.a)(e)).model||(e.model=t=>t?e.view+":"+t:e.view);const t=g(k(e,"start")),o=g(k(e,"end"));return i=>{i.on("element:"+e.view+"-start",t,{priority:e.converterPriority||"normal"}),i.on("element:"+e.view+"-end",o,{priority:e.converterPriority||"normal"});const s=n.a.get("low"),r=n.a.get("highest"),a=n.a.get(e.converterPriority)/r;i.on("element",function(e){return(t,o,i)=>{const s="data-"+e.view;function r(t,s){for(const r of s){const s=e.model(r,i),n=i.writer.createElement("$marker",{"data-name":s});i.writer.insert(n,t),o.modelCursor.isEqual(t)?o.modelCursor=o.modelCursor.getShiftedBy(1):o.modelCursor=o.modelCursor._getTransformedByInsertion(t,1),o.modelRange=o.modelRange._getTransformedByInsertion(t,1)[0]}}(i.consumable.test(o.viewItem,{attributes:s+"-end-after"})||i.consumable.test(o.viewItem,{attributes:s+"-start-after"})||i.consumable.test(o.viewItem,{attributes:s+"-end-before"})||i.consumable.test(o.viewItem,{attributes:s+"-start-before"}))&&(o.modelRange||Object.assign(o,i.convertChildren(o.viewItem,o.modelCursor)),i.consumable.consume(o.viewItem,{attributes:s+"-end-after"})&&r(o.modelRange.end,o.viewItem.getAttribute(s+"-end-after").split(",")),i.consumable.consume(o.viewItem,{attributes:s+"-start-after"})&&r(o.modelRange.end,o.viewItem.getAttribute(s+"-start-after").split(",")),i.consumable.consume(o.viewItem,{attributes:s+"-end-before"})&&r(o.modelRange.start,o.viewItem.getAttribute(s+"-end-before").split(",")),i.consumable.consume(o.viewItem,{attributes:s+"-start-before"})&&r(o.modelRange.start,o.viewItem.getAttribute(s+"-start-before").split(",")))}}(e),{priority:s+a})}}(e))}}function l(){return(e,t,o)=>{if(!t.modelRange&&o.consumable.consume(t.viewItem,{name:!0})){const{modelRange:e,modelCursor:i}=o.convertChildren(t.viewItem,t.modelCursor);t.modelRange=e,t.modelCursor=i}}}function d(){return(e,t,{schema:o,consumable:i,writer:s})=>{let r=t.modelCursor;if(!i.test(t.viewItem))return;if(!o.checkChild(r,"$text")){if(!Object(a.b)(r,"$text",o))return;r=Object(a.c)(r,s)}i.consume(t.viewItem);const n=s.createText(t.viewItem.data);s.insert(n,r),t.modelRange=s.createRange(r,r.getShiftedBy(n.offsetSize)),t.modelCursor=t.modelRange.end}}function u(e,t){return(o,i)=>{const s=i.newSelection,r=[];for(const e of s.getRanges())r.push(t.toModelRange(e));const n=e.createSelection(r,{backward:s.isBackward});n.isEqual(e.document.selection)||e.change(e=>{e.setSelection(n)})}}function h(e){const t=g(e=Object(r.a)(e)),o=p(e.view),i=o?"element:"+o:"element";return o=>{o.on(i,t,{priority:e.converterPriority||"normal"})}}function p(e){return"string"==typeof e?e:"object"==typeof e&&"string"==typeof e.name?e.name:null}function g(e){const t=new i.a(e.view);return(o,i,s)=>{const r=t.match(i.viewItem);if(!r)return;const n=r.match;if(n.name=!0,!s.consumable.test(i.viewItem,n))return;const a=function(e,t,o){return e instanceof Function?e(t,o):o.writer.createElement(e)}(e.model,i.viewItem,s);a&&s.safeInsert(a,i.modelCursor)&&(s.consumable.consume(i.viewItem,n),s.convertChildren(i.viewItem,a),s.updateConversionResult(a,i))}}function f(e,t=null){const o=null===t||(e=>e.getAttribute(t)),i="object"!=typeof e.model?e.model:e.model.key,s="object"!=typeof e.model||void 0===e.model.value?o:e.model.value;e.model={key:i,value:s}}function m(e,t){const o=new i.a(e.view);return(i,s,r)=>{const n=o.match(s.viewItem);if(!n)return;if(!function(e,t){const o="function"==typeof e?e(t):e;if("object"==typeof o&&!p(o))return!1;return!o.classes&&!o.attributes&&!o.styles}(e.view,s.viewItem)?delete n.match.name:n.match.name=!0,!r.consumable.test(s.viewItem,n.match))return;const a=e.model.key,c="function"==typeof e.model.value?e.model.value(s.viewItem,r):e.model.value;if(null===c)return;s.modelRange||Object.assign(s,r.convertChildren(s.viewItem,s.modelCursor));(function(e,t,o,i){let s=!1;for(const r of Array.from(e.getItems({shallow:o})))i.schema.checkAttribute(r,t.key)&&(s=!0,r.hasAttribute(t.key)||i.writer.setAttribute(t.key,t.value,r));return s})(s.modelRange,{key:a,value:c},t,r)&&r.consumable.consume(s.viewItem,n.match)}}function k(e,t){const o={};return o.view=e.view+"-"+t,o.model=(t,o)=>{const i=t.getAttribute("name"),s=e.model(i,o);return o.writer.createElement("$marker",{"data-name":s})},o}},"./packages/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));class i{getHtml(e){const t=document.implementation.createHTMLDocument("").createElement("div");return t.appendChild(e),t.innerHTML}}var s=o("./packages/ckeditor5-engine/src/view/domconverter.js");class r{constructor(e){this.domParser=new DOMParser,this.domConverter=new s.a(e,{renderingMode:"data"}),this.htmlWriter=new i}toData(e){const t=this.domConverter.viewToDom(e,document);return this.htmlWriter.getHtml(t)}toView(e){const t=this._toDom(e);return this.domConverter.domToView(t)}registerRawContentMatcher(e){this.domConverter.registerRawContentMatcher(e)}useFillerType(e){this.domConverter.blockFillerMode="marked"==e?"markedNbsp":"nbsp"}_toDom(e){const t=this.domParser.parseFromString(e,"text/html"),o=t.createDocumentFragment();let i=t.firstChild;for(;!i.isSameNode(t.documentElement);){const e=i;i=i.nextSibling,e.nodeType==Node.COMMENT_NODE&&o.appendChild(e)}const s=t.body.childNodes;for(;s.length>0;)o.appendChild(s[0]);return o}}},"./packages/ckeditor5-engine/src/model/documentfragment.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-engine/src/model/nodelist.js"),s=o("./packages/ckeditor5-engine/src/model/element.js"),r=o("./packages/ckeditor5-engine/src/model/text.js"),n=o("./packages/ckeditor5-engine/src/model/textproxy.js"),a=o("./packages/ckeditor5-utils/src/isiterable.js");class c{constructor(e){this.markers=new Map,this._children=new i.a,e&&this._insertChild(0,e)}[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(e){return"documentFragment"===e||"model:documentFragment"===e}getChild(e){return this._children.getNode(e)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(e){return this._children.getNodeIndex(e)}getChildStartOffset(e){return this._children.getNodeStartOffset(e)}getPath(){return[]}getNodeByPath(e){let t=this;for(const o of e)t=t.getChild(t.offsetToIndex(o));return t}offsetToIndex(e){return this._children.offsetToIndex(e)}toJSON(){const e=[];for(const t of this._children)e.push(t.toJSON());return e}static fromJSON(e){const t=[];for(const o of e)o.name?t.push(s.a.fromJSON(o)):t.push(r.a.fromJSON(o));return new c(t)}_appendChild(e){this._insertChild(this.childCount,e)}_insertChild(e,t){const o=function(e){if("string"==typeof e)return[new r.a(e)];Object(a.a)(e)||(e=[e]);return Array.from(e).map(e=>"string"==typeof e?new r.a(e):e instanceof n.a?new r.a(e.data,e.getAttributes()):e)}(t);for(const e of o)null!==e.parent&&e._remove(),e.parent=this;this._children._insertNodes(e,o)}_removeChildren(e,t=1){const o=this._children._removeNodes(e,t);for(const e of o)e.parent=null;return o}}},"./packages/ckeditor5-engine/src/model/documentselection.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return p}));var i=o("./packages/ckeditor5-utils/src/mix.js"),s=o("./packages/ckeditor5-utils/src/emittermixin.js"),r=o("./packages/ckeditor5-engine/src/model/selection.js"),n=o("./packages/ckeditor5-engine/src/model/liverange.js"),a=o("./packages/ckeditor5-engine/src/model/text.js"),c=o("./packages/ckeditor5-engine/src/model/textproxy.js"),l=o("./packages/ckeditor5-utils/src/tomap.js"),d=o("./packages/ckeditor5-utils/src/collection.js"),u=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),h=o("./packages/ckeditor5-utils/src/uid.js");class p{constructor(e){this._selection=new g(e),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(e){return this._selection.containsEntireContent(e)}destroy(){this._selection.destroy()}getAttributeKeys(){return this._selection.getAttributeKeys()}getAttributes(){return this._selection.getAttributes()}getAttribute(e){return this._selection.getAttribute(e)}hasAttribute(e){return this._selection.hasAttribute(e)}refresh(){this._selection._updateMarkers(),this._selection._updateAttributes(!1)}observeMarkers(e){this._selection.observeMarkers(e)}is(e){return"selection"===e||"model:selection"==e||"documentSelection"==e||"model:documentSelection"==e}_setFocus(e,t){this._selection.setFocus(e,t)}_setTo(e,t,o){this._selection.setTo(e,t,o)}_setAttribute(e,t){this._selection.setAttribute(e,t)}_removeAttribute(e){this._selection.removeAttribute(e)}_getStoredAttributes(){return this._selection._getStoredAttributes()}_overrideGravity(){return this._selection.overrideGravity()}_restoreGravity(e){this._selection.restoreGravity(e)}static _getStoreAttributeKey(e){return"selection:"+e}static _isStoreAttributeKey(e){return e.startsWith("selection:")}}Object(i.a)(p,s.c);class g extends r.a{constructor(e){super(),this.markers=new d.a({idProperty:"name"}),this._model=e.model,this._document=e,this._attributePriority=new Map,this._selectionRestorePosition=null,this._hasChangedRange=!1,this._overriddenGravityRegister=new Set,this._observedMarkers=new Set,this.listenTo(this._model,"applyOperation",(e,t)=>{const o=t[0];o.isDocumentOperation&&"marker"!=o.type&&"rename"!=o.type&&"noop"!=o.type&&(0==this._ranges.length&&this._selectionRestorePosition&&this._fixGraveyardSelection(this._selectionRestorePosition),this._selectionRestorePosition=null,this._hasChangedRange&&(this._hasChangedRange=!1,this.fire("change:range",{directChange:!1})))},{priority:"lowest"}),this.on("change:range",()=>{for(const e of this.getRanges())if(!this._document._validateSelectionRange(e))throw new u.a("document-selection-wrong-position",this,{range:e})}),this.listenTo(this._model.markers,"update",(e,t,o,i)=>{this._updateMarker(t,i)}),this.listenTo(this._document,"change",(e,t)=>{!function(e,t){const o=e.document.differ;for(const i of o.getChanges()){if("insert"!=i.type)continue;const o=i.position.parent;i.length===o.maxOffset&&e.enqueueChange(t,e=>{const t=Array.from(o.getAttributeKeys()).filter(e=>e.startsWith("selection:"));for(const i of t)e.removeAttribute(i,o)})}}(this._model,t)})}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 e=0;e<this._ranges.length;e++)this._ranges[e].detach();this.stopListening()}*getRanges(){this._ranges.length?yield*super.getRanges():yield this._document._getDefaultRange()}getFirstRange(){return super.getFirstRange()||this._document._getDefaultRange()}getLastRange(){return super.getLastRange()||this._document._getDefaultRange()}setTo(e,t,o){super.setTo(e,t,o),this._updateAttributes(!0),this._updateMarkers()}setFocus(e,t){super.setFocus(e,t),this._updateAttributes(!0),this._updateMarkers()}setAttribute(e,t){if(this._setAttribute(e,t)){const t=[e];this.fire("change:attribute",{attributeKeys:t,directChange:!0})}}removeAttribute(e){if(this._removeAttribute(e)){const t=[e];this.fire("change:attribute",{attributeKeys:t,directChange:!0})}}overrideGravity(){const e=Object(h.a)();return this._overriddenGravityRegister.add(e),1===this._overriddenGravityRegister.size&&this._updateAttributes(!0),e}restoreGravity(e){if(!this._overriddenGravityRegister.has(e))throw new u.a("document-selection-gravity-wrong-restore",this,{uid:e});this._overriddenGravityRegister.delete(e),this.isGravityOverridden||this._updateAttributes(!0)}observeMarkers(e){this._observedMarkers.add(e),this._updateMarkers()}_popRange(){this._ranges.pop().detach()}_pushRange(e){const t=this._prepareRange(e);t&&this._ranges.push(t)}_prepareRange(e){if(this._checkRange(e),e.root==this._document.graveyard)return;const t=n.a.fromRange(e);return t.on("change:range",(e,o,i)=>{if(this._hasChangedRange=!0,t.root==this._document.graveyard){this._selectionRestorePosition=i.deletionPosition;const e=this._ranges.indexOf(t);this._ranges.splice(e,1),t.detach()}}),t}_updateMarkers(){if(!this._observedMarkers.size)return;const e=[];let t=!1;for(const t of this._model.markers){const o=t.name.split(":",1)[0];if(!this._observedMarkers.has(o))continue;const i=t.getRange();for(const o of this.getRanges())i.containsRange(o,!o.isCollapsed)&&e.push(t)}const o=Array.from(this.markers);for(const o of e)this.markers.has(o)||(this.markers.add(o),t=!0);for(const o of Array.from(this.markers))e.includes(o)||(this.markers.remove(o),t=!0);t&&this.fire("change:marker",{oldMarkers:o,directChange:!1})}_updateMarker(e,t){const o=e.name.split(":",1)[0];if(!this._observedMarkers.has(o))return;let i=!1;const s=Array.from(this.markers),r=this.markers.has(e);if(t){let o=!1;for(const e of this.getRanges())if(t.containsRange(e,!e.isCollapsed)){o=!0;break}o&&!r?(this.markers.add(e),i=!0):!o&&r&&(this.markers.remove(e),i=!0)}else r&&(this.markers.remove(e),i=!0);i&&this.fire("change:marker",{oldMarkers:s,directChange:!1})}_updateAttributes(e){const t=Object(l.a)(this._getSurroundingAttributes()),o=Object(l.a)(this.getAttributes());if(e)this._attributePriority=new Map,this._attrs=new Map;else for(const[e,t]of this._attributePriority)"low"==t&&(this._attrs.delete(e),this._attributePriority.delete(e));this._setAttributesTo(t);const i=[];for(const[e,t]of this.getAttributes())o.has(e)&&o.get(e)===t||i.push(e);for(const[e]of o)this.hasAttribute(e)||i.push(e);i.length>0&&this.fire("change:attribute",{attributeKeys:i,directChange:!1})}_setAttribute(e,t,o=!0){const i=o?"normal":"low";if("low"==i&&"normal"==this._attributePriority.get(e))return!1;return super.getAttribute(e)!==t&&(this._attrs.set(e,t),this._attributePriority.set(e,i),!0)}_removeAttribute(e,t=!0){const o=t?"normal":"low";return("low"!=o||"normal"!=this._attributePriority.get(e))&&(this._attributePriority.set(e,o),!!super.hasAttribute(e)&&(this._attrs.delete(e),!0))}_setAttributesTo(e){const t=new Set;for(const[t,o]of this.getAttributes())e.get(t)!==o&&this._removeAttribute(t,!1);for(const[o,i]of e){this._setAttribute(o,i,!1)&&t.add(o)}return t}*_getStoredAttributes(){const e=this.getFirstPosition().parent;if(this.isCollapsed&&e.isEmpty)for(const t of e.getAttributeKeys())if(t.startsWith("selection:")){const o=t.substr("selection:".length);yield[o,e.getAttribute(t)]}}_getSurroundingAttributes(){const e=this.getFirstPosition(),t=this._model.schema;let o=null;if(this.isCollapsed){const i=e.textNode?e.textNode:e.nodeBefore,s=e.textNode?e.textNode:e.nodeAfter;if(this.isGravityOverridden||(o=f(i)),o||(o=f(s)),!this.isGravityOverridden&&!o){let e=i;for(;e&&!t.isInline(e)&&!o;)e=e.previousSibling,o=f(e)}if(!o){let e=s;for(;e&&!t.isInline(e)&&!o;)e=e.nextSibling,o=f(e)}o||(o=this._getStoredAttributes())}else{const e=this.getFirstRange();for(const i of e){if(i.item.is("element")&&t.isObject(i.item))break;if("text"==i.type){o=i.item.getAttributes();break}}}return o}_fixGraveyardSelection(e){const t=this._model.schema.getNearestSelectionRange(e);t&&this._pushRange(t)}}function f(e){return e instanceof c.a||e instanceof a.a?e.getAttributes():null}},"./packages/ckeditor5-engine/src/model/element.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-engine/src/model/node.js"),s=o("./packages/ckeditor5-engine/src/model/nodelist.js"),r=o("./packages/ckeditor5-engine/src/model/text.js"),n=o("./packages/ckeditor5-engine/src/model/textproxy.js"),a=o("./packages/ckeditor5-utils/src/isiterable.js");class c extends i.a{constructor(e,t,o){super(t),this.name=e,this._children=new s.a,o&&this._insertChild(0,o)}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}is(e,t=null){return t?t===this.name&&("element"===e||"model:element"===e):"element"===e||"model:element"===e||"node"===e||"model:node"===e}getChild(e){return this._children.getNode(e)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(e){return this._children.getNodeIndex(e)}getChildStartOffset(e){return this._children.getNodeStartOffset(e)}offsetToIndex(e){return this._children.offsetToIndex(e)}getNodeByPath(e){let t=this;for(const o of e)t=t.getChild(t.offsetToIndex(o));return t}findAncestor(e,t={includeSelf:!1}){let o=t.includeSelf?this:this.parent;for(;o;){if(o.name===e)return o;o=o.parent}return null}toJSON(){const e=super.toJSON();if(e.name=this.name,this._children.length>0){e.children=[];for(const t of this._children)e.children.push(t.toJSON())}return e}_clone(e=!1){const t=e?Array.from(this._children).map(e=>e._clone(!0)):null;return new c(this.name,this.getAttributes(),t)}_appendChild(e){this._insertChild(this.childCount,e)}_insertChild(e,t){const o=function(e){if("string"==typeof e)return[new r.a(e)];Object(a.a)(e)||(e=[e]);return Array.from(e).map(e=>"string"==typeof e?new r.a(e):e instanceof n.a?new r.a(e.data,e.getAttributes()):e)}(t);for(const e of o)null!==e.parent&&e._remove(),e.parent=this;this._children._insertNodes(e,o)}_removeChildren(e,t=1){const o=this._children._removeNodes(e,t);for(const e of o)e.parent=null;return o}static fromJSON(e){let t=null;if(e.children){t=[];for(const o of e.children)o.name?t.push(c.fromJSON(o)):t.push(r.a.fromJSON(o))}return new c(e.name,e.attributes,t)}}},"./packages/ckeditor5-engine/src/model/liveposition.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-engine/src/model/position.js"),s=o("./packages/ckeditor5-utils/src/emittermixin.js"),r=o("./packages/ckeditor5-utils/src/mix.js"),n=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class a extends i.a{constructor(e,t,o="toNone"){if(super(e,t,o),!this.root.is("rootElement"))throw new n.a("model-liveposition-root-not-rootelement",e);c.call(this)}detach(){this.stopListening()}is(e){return"livePosition"===e||"model:livePosition"===e||"position"==e||"model:position"===e}toPosition(){return new i.a(this.root,this.path.slice(),this.stickiness)}static fromPosition(e,t){return new this(e.root,e.path.slice(),t||e.stickiness)}}function c(){this.listenTo(this.root.document.model,"applyOperation",(e,t)=>{const o=t[0];o.isDocumentOperation&&l.call(this,o)},{priority:"low"})}function l(e){const t=this.getTransformedByOperation(e);if(!this.isEqual(t)){const e=this.toPosition();this.path=t.path,this.root=t.root,this.fire("change",e)}}Object(r.a)(a,s.c)},"./packages/ckeditor5-engine/src/model/liverange.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return n}));var i=o("./packages/ckeditor5-engine/src/model/range.js"),s=o("./packages/ckeditor5-utils/src/emittermixin.js"),r=o("./packages/ckeditor5-utils/src/mix.js");class n extends i.a{constructor(e,t){super(e,t),a.call(this)}detach(){this.stopListening()}is(e){return"liveRange"===e||"model:liveRange"===e||"range"==e||"model:range"===e}toRange(){return new i.a(this.start,this.end)}static fromRange(e){return new n(e.start,e.end)}}function a(){this.listenTo(this.root.document.model,"applyOperation",(e,t)=>{const o=t[0];o.isDocumentOperation&&c.call(this,o)},{priority:"low"})}function c(e){const t=this.getTransformedByOperation(e),o=i.a._createFromRanges(t),s=!o.isEqual(this),r=function(e,t){switch(t.type){case"insert":return e.containsPosition(t.position);case"move":case"remove":case"reinsert":case"merge":return e.containsPosition(t.sourcePosition)||e.start.isEqual(t.sourcePosition)||e.containsPosition(t.targetPosition);case"split":return e.containsPosition(t.splitPosition)||e.containsPosition(t.insertionPosition)}return!1}(this,e);let n=null;if(s){"$graveyard"==o.root.rootName&&(n="remove"==e.type?e.sourcePosition:e.deletionPosition);const t=this.toRange();this.start=o.start,this.end=o.end,this.fire("change:range",t,{deletionPosition:n})}else r&&this.fire("change:content",this.toRange(),{deletionPosition:n})}Object(r.a)(n,s.c)},"./packages/ckeditor5-engine/src/model/model.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return pe}));class i{constructor(e="default"){this.operations=[],this.type=e}get baseVersion(){for(const e of this.operations)if(null!==e.baseVersion)return e.baseVersion;return null}addOperation(e){return e.batch=this,this.operations.push(e),e}}var s=o("./packages/ckeditor5-engine/src/model/operation/attributeoperation.js"),r=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),n=o("./packages/ckeditor5-engine/src/model/range.js"),a=o("./packages/ckeditor5-engine/src/model/operation/utils.js"),c=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class l extends r.a{constructor(e,t){super(null),this.sourcePosition=e.clone(),this.howMany=t}get type(){return"detach"}toJSON(){const e=super.toJSON();return e.sourcePosition=this.sourcePosition.toJSON(),e}_validate(){if(this.sourcePosition.root.document)throw new c.a("detach-operation-on-document-node",this)}_execute(){Object(a.d)(n.a._createFromPositionAndShift(this.sourcePosition,this.howMany))}static get className(){return"DetachOperation"}}var d=o("./packages/ckeditor5-engine/src/model/operation/insertoperation.js"),u=o("./packages/ckeditor5-engine/src/model/operation/markeroperation.js"),h=o("./packages/ckeditor5-engine/src/model/operation/moveoperation.js"),p=o("./packages/ckeditor5-engine/src/model/operation/renameoperation.js"),g=o("./packages/ckeditor5-engine/src/model/operation/rootattributeoperation.js"),f=o("./packages/ckeditor5-engine/src/model/operation/splitoperation.js"),m=o("./packages/ckeditor5-engine/src/model/operation/mergeoperation.js"),k=o("./packages/ckeditor5-engine/src/model/documentfragment.js"),b=o("./packages/ckeditor5-engine/src/model/text.js"),_=o("./packages/ckeditor5-engine/src/model/element.js");class w extends _.a{constructor(e,t,o="main"){super(t),this._document=e,this.rootName=o}get document(){return this._document}is(e,t){return t?t===this.name&&("rootElement"===e||"model:rootElement"===e||"element"===e||"model:element"===e):"rootElement"===e||"model:rootElement"===e||"element"===e||"model:element"===e||"node"===e||"model:node"===e}toJSON(){return this.rootName}}var v=o("./packages/ckeditor5-engine/src/model/position.js"),y=o("./packages/ckeditor5-engine/src/model/documentselection.js"),j=o("./packages/ckeditor5-utils/src/tomap.js");class x{constructor(e,t){this.model=e,this.batch=t}createText(e,t){return new b.a(e,t)}createElement(e,t){return new _.a(e,t)}createDocumentFragment(){return new k.a}cloneElement(e,t=!0){return e._clone(t)}insert(e,t,o=0){if(this._assertWriterUsedCorrectly(),e instanceof b.a&&""==e.data)return;const i=v.a._createAt(t,o);if(e.parent){if(C(e.root,i.root))return void this.move(n.a._createOn(e),i);if(e.root.document)throw new c.a("model-writer-insert-forbidden-move",this);this.remove(e)}const s=i.root.document?i.root.document.version:null,r=new d.a(i,e,s);if(e instanceof b.a&&(r.shouldReceiveAttributes=!0),this.batch.addOperation(r),this.model.applyOperation(r),e instanceof k.a)for(const[t,o]of e.markers){const e=v.a._createAt(o.root,0),s={range:new n.a(o.start._getCombined(e,i),o.end._getCombined(e,i)),usingOperation:!0,affectsData:!0};this.model.markers.has(t)?this.updateMarker(t,s):this.addMarker(t,s)}}insertText(e,t,o,i){t instanceof k.a||t instanceof _.a||t instanceof v.a?this.insert(this.createText(e),t,o):this.insert(this.createText(e,t),o,i)}insertElement(e,t,o,i){t instanceof k.a||t instanceof _.a||t instanceof v.a?this.insert(this.createElement(e),t,o):this.insert(this.createElement(e,t),o,i)}append(e,t){this.insert(e,t,"end")}appendText(e,t,o){t instanceof k.a||t instanceof _.a?this.insert(this.createText(e),t,"end"):this.insert(this.createText(e,t),o,"end")}appendElement(e,t,o){t instanceof k.a||t instanceof _.a?this.insert(this.createElement(e),t,"end"):this.insert(this.createElement(e,t),o,"end")}setAttribute(e,t,o){if(this._assertWriterUsedCorrectly(),o instanceof n.a){const i=o.getMinimalFlatRanges();for(const o of i)P(this,e,t,o)}else O(this,e,t,o)}setAttributes(e,t){for(const[o,i]of Object(j.a)(e))this.setAttribute(o,i,t)}removeAttribute(e,t){if(this._assertWriterUsedCorrectly(),t instanceof n.a){const o=t.getMinimalFlatRanges();for(const t of o)P(this,e,null,t)}else O(this,e,null,t)}clearAttributes(e){this._assertWriterUsedCorrectly();const t=e=>{for(const t of e.getAttributeKeys())this.removeAttribute(t,e)};if(e instanceof n.a)for(const o of e.getItems())t(o);else t(e)}move(e,t,o){if(this._assertWriterUsedCorrectly(),!(e instanceof n.a))throw new c.a("writer-move-invalid-range",this);if(!e.isFlat)throw new c.a("writer-move-range-not-flat",this);const i=v.a._createAt(t,o);if(i.isEqual(e.start))return;if(this._addOperationForAffectedMarkers("move",e),!C(e.root,i.root))throw new c.a("writer-move-different-document",this);const s=e.root.document?e.root.document.version:null,r=new h.a(e.start,e.end.offset-e.start.offset,i,s);this.batch.addOperation(r),this.model.applyOperation(r)}remove(e){this._assertWriterUsedCorrectly();const t=(e instanceof n.a?e:n.a._createOn(e)).getMinimalFlatRanges().reverse();for(const e of t)this._addOperationForAffectedMarkers("move",e),T(e.start,e.end.offset-e.start.offset,this.batch,this.model)}merge(e){this._assertWriterUsedCorrectly();const t=e.nodeBefore,o=e.nodeAfter;if(this._addOperationForAffectedMarkers("merge",e),!(t instanceof _.a))throw new c.a("writer-merge-no-element-before",this);if(!(o instanceof _.a))throw new c.a("writer-merge-no-element-after",this);e.root.document?this._merge(e):this._mergeDetached(e)}createPositionFromPath(e,t,o){return this.model.createPositionFromPath(e,t,o)}createPositionAt(e,t){return this.model.createPositionAt(e,t)}createPositionAfter(e){return this.model.createPositionAfter(e)}createPositionBefore(e){return this.model.createPositionBefore(e)}createRange(e,t){return this.model.createRange(e,t)}createRangeIn(e){return this.model.createRangeIn(e)}createRangeOn(e){return this.model.createRangeOn(e)}createSelection(e,t,o){return this.model.createSelection(e,t,o)}_mergeDetached(e){const t=e.nodeBefore,o=e.nodeAfter;this.move(n.a._createIn(o),v.a._createAt(t,"end")),this.remove(o)}_merge(e){const t=v.a._createAt(e.nodeBefore,"end"),o=v.a._createAt(e.nodeAfter,0),i=e.root.document.graveyard,s=new v.a(i,[0]),r=e.root.document.version,n=new m.a(o,e.nodeAfter.maxOffset,t,s,r);this.batch.addOperation(n),this.model.applyOperation(n)}rename(e,t){if(this._assertWriterUsedCorrectly(),!(e instanceof _.a))throw new c.a("writer-rename-not-element-instance",this);const o=e.root.document?e.root.document.version:null,i=new p.a(v.a._createBefore(e),e.name,t,o);this.batch.addOperation(i),this.model.applyOperation(i)}split(e,t){this._assertWriterUsedCorrectly();let o,i,s=e.parent;if(!s.parent)throw new c.a("writer-split-element-no-parent",this);if(t||(t=s.parent),!e.parent.getAncestors({includeSelf:!0}).includes(t))throw new c.a("writer-split-invalid-limit-element",this);do{const t=s.root.document?s.root.document.version:null,r=s.maxOffset-e.offset,n=f.a.getInsertionPosition(e),a=new f.a(e,r,n,null,t);this.batch.addOperation(a),this.model.applyOperation(a),o||i||(o=s,i=e.parent.nextSibling),s=(e=this.createPositionAfter(e.parent)).parent}while(s!==t);return{position:e,range:new n.a(v.a._createAt(o,"end"),v.a._createAt(i,0))}}wrap(e,t){if(this._assertWriterUsedCorrectly(),!e.isFlat)throw new c.a("writer-wrap-range-not-flat",this);const o=t instanceof _.a?t:new _.a(t);if(o.childCount>0)throw new c.a("writer-wrap-element-not-empty",this);if(null!==o.parent)throw new c.a("writer-wrap-element-attached",this);this.insert(o,e.start);const i=new n.a(e.start.getShiftedBy(1),e.end.getShiftedBy(1));this.move(i,v.a._createAt(o,0))}unwrap(e){if(this._assertWriterUsedCorrectly(),null===e.parent)throw new c.a("writer-unwrap-element-no-parent",this);this.move(n.a._createIn(e),this.createPositionAfter(e)),this.remove(e)}addMarker(e,t){if(this._assertWriterUsedCorrectly(),!t||"boolean"!=typeof t.usingOperation)throw new c.a("writer-addmarker-no-usingoperation",this);const o=t.usingOperation,i=t.range,s=void 0!==t.affectsData&&t.affectsData;if(this.model.markers.has(e))throw new c.a("writer-addmarker-marker-exists",this);if(!i)throw new c.a("writer-addmarker-no-range",this);return o?(A(this,e,null,i,s),this.model.markers.get(e)):this.model.markers._set(e,i,o,s)}updateMarker(e,t){this._assertWriterUsedCorrectly();const o="string"==typeof e?e:e.name,i=this.model.markers.get(o);if(!i)throw new c.a("writer-updatemarker-marker-not-exists",this);if(!t)return void this.model.markers._refresh(i);const s="boolean"==typeof t.usingOperation,r="boolean"==typeof t.affectsData,n=r?t.affectsData:i.affectsData;if(!s&&!t.range&&!r)throw new c.a("writer-updatemarker-wrong-options",this);const a=i.getRange(),l=t.range?t.range:a;s&&t.usingOperation!==i.managedUsingOperations?t.usingOperation?A(this,o,null,l,n):(A(this,o,a,null,n),this.model.markers._set(o,l,void 0,n)):i.managedUsingOperations?A(this,o,a,l,n):this.model.markers._set(o,l,void 0,n)}removeMarker(e){this._assertWriterUsedCorrectly();const t="string"==typeof e?e:e.name;if(!this.model.markers.has(t))throw new c.a("writer-removemarker-no-marker",this);const o=this.model.markers.get(t);if(!o.managedUsingOperations)return void this.model.markers._remove(t);A(this,t,o.getRange(),null,o.affectsData)}setSelection(e,t,o){this._assertWriterUsedCorrectly(),this.model.document.selection._setTo(e,t,o)}setSelectionFocus(e,t){this._assertWriterUsedCorrectly(),this.model.document.selection._setFocus(e,t)}setSelectionAttribute(e,t){if(this._assertWriterUsedCorrectly(),"string"==typeof e)this._setSelectionAttribute(e,t);else for(const[t,o]of Object(j.a)(e))this._setSelectionAttribute(t,o)}removeSelectionAttribute(e){if(this._assertWriterUsedCorrectly(),"string"==typeof e)this._removeSelectionAttribute(e);else for(const t of e)this._removeSelectionAttribute(t)}overrideSelectionGravity(){return this.model.document.selection._overrideGravity()}restoreSelectionGravity(e){this.model.document.selection._restoreGravity(e)}_setSelectionAttribute(e,t){const o=this.model.document.selection;if(o.isCollapsed&&o.anchor.parent.isEmpty){const i=y.a._getStoreAttributeKey(e);this.setAttribute(i,t,o.anchor.parent)}o._setAttribute(e,t)}_removeSelectionAttribute(e){const t=this.model.document.selection;if(t.isCollapsed&&t.anchor.parent.isEmpty){const o=y.a._getStoreAttributeKey(e);this.removeAttribute(o,t.anchor.parent)}t._removeAttribute(e)}_assertWriterUsedCorrectly(){if(this.model._currentWriter!==this)throw new c.a("writer-incorrect-use",this)}_addOperationForAffectedMarkers(e,t){for(const o of this.model.markers){if(!o.managedUsingOperations)continue;const i=o.getRange();let s=!1;if("move"===e)s=t.containsPosition(i.start)||t.start.isEqual(i.start)||t.containsPosition(i.end)||t.end.isEqual(i.end);else{const e=t.nodeBefore,o=t.nodeAfter,r=i.start.parent==e&&i.start.isAtEnd,n=i.end.parent==o&&0==i.end.offset,a=i.end.nodeAfter==o,c=i.start.nodeAfter==o;s=r||n||a||c}s&&this.updateMarker(o.name,{range:i})}}}function P(e,t,o,i){const r=e.model,a=r.document;let c,l,d,u=i.start;for(const e of i.getWalker({shallow:!0}))d=e.item.getAttribute(t),c&&l!=d&&(l!=o&&h(),u=c),c=e.nextPosition,l=d;function h(){const i=new n.a(u,c),d=i.root.document?a.version:null,h=new s.a(i,t,l,o,d);e.batch.addOperation(h),r.applyOperation(h)}c instanceof v.a&&c!=u&&l!=o&&h()}function O(e,t,o,i){const r=e.model,a=r.document,c=i.getAttribute(t);let l,d;if(c!=o){if(i.root===i){const e=i.document?a.version:null;d=new g.a(i,t,c,o,e)}else{l=new n.a(v.a._createBefore(i),e.createPositionAfter(i));const r=l.root.document?a.version:null;d=new s.a(l,t,c,o,r)}e.batch.addOperation(d),r.applyOperation(d)}}function A(e,t,o,i,s){const r=e.model,n=r.document,a=new u.a(t,o,i,r.markers,s,n.version);e.batch.addOperation(a),r.applyOperation(a)}function T(e,t,o,i){let s;if(e.root.document){const o=i.document,r=new v.a(o.graveyard,[0]);s=new h.a(e,t,r,o.version)}else s=new l(e,t);o.addOperation(s),i.applyOperation(s)}function C(e,t){return e===t||e instanceof w&&t instanceof w}var E=o("./packages/ckeditor5-engine/src/model/schema.js");class S{constructor(e){this._markerCollection=e,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(e){if(this._isInInsertedElement(e.parent))return;this._markRemove(e.parent,e.startOffset,e.offsetSize),this._markInsert(e.parent,e.startOffset,e.offsetSize);const t=n.a._createOn(e);for(const e of this._markerCollection.getMarkersIntersectingRange(t)){const t=e.getRange();this.bufferMarkerChange(e.name,t,t,e.affectsData)}this._cachedChanges=null}bufferOperation(e){switch(e.type){case"insert":if(this._isInInsertedElement(e.position.parent))return;this._markInsert(e.position.parent,e.position.offset,e.nodes.maxOffset);break;case"addAttribute":case"removeAttribute":case"changeAttribute":for(const t of e.range.getItems({shallow:!0}))this._isInInsertedElement(t.parent)||this._markAttribute(t);break;case"remove":case"move":case"reinsert":{if(e.sourcePosition.isEqual(e.targetPosition)||e.sourcePosition.getShiftedBy(e.howMany).isEqual(e.targetPosition))return;const t=this._isInInsertedElement(e.sourcePosition.parent),o=this._isInInsertedElement(e.targetPosition.parent);t||this._markRemove(e.sourcePosition.parent,e.sourcePosition.offset,e.howMany),o||this._markInsert(e.targetPosition.parent,e.getMovedRangeStart().offset,e.howMany);break}case"rename":{if(this._isInInsertedElement(e.position.parent))return;this._markRemove(e.position.parent,e.position.offset,1),this._markInsert(e.position.parent,e.position.offset,1);const t=n.a._createFromPositionAndShift(e.position,1);for(const e of this._markerCollection.getMarkersIntersectingRange(t)){const t=e.getRange();this.bufferMarkerChange(e.name,t,t,e.affectsData)}break}case"split":{const t=e.splitPosition.parent;this._isInInsertedElement(t)||this._markRemove(t,e.splitPosition.offset,e.howMany),this._isInInsertedElement(e.insertionPosition.parent)||this._markInsert(e.insertionPosition.parent,e.insertionPosition.offset,1),e.graveyardPosition&&this._markRemove(e.graveyardPosition.parent,e.graveyardPosition.offset,1);break}case"merge":{const t=e.sourcePosition.parent;this._isInInsertedElement(t.parent)||this._markRemove(t.parent,t.startOffset,1);const o=e.graveyardPosition.parent;this._markInsert(o,e.graveyardPosition.offset,1);const i=e.targetPosition.parent;this._isInInsertedElement(i)||this._markInsert(i,e.targetPosition.offset,t.maxOffset);break}}this._cachedChanges=null}bufferMarkerChange(e,t,o,i){const s=this._changedMarkers.get(e);s?(s.newRange=o,s.affectsData=i,null==s.oldRange&&null==s.newRange&&this._changedMarkers.delete(e)):this._changedMarkers.set(e,{oldRange:t,newRange:o,affectsData:i})}getMarkersToRemove(){const e=[];for(const[t,o]of this._changedMarkers)null!=o.oldRange&&e.push({name:t,range:o.oldRange});return e}getMarkersToAdd(){const e=[];for(const[t,o]of this._changedMarkers)null!=o.newRange&&e.push({name:t,range:o.newRange});return e}getChangedMarkers(){return Array.from(this._changedMarkers).map(e=>({name:e[0],data:{oldRange:e[1].oldRange,newRange:e[1].newRange}}))}hasDataChanges(){for(const[,e]of this._changedMarkers)if(e.affectsData)return!0;return this._changesInElement.size>0}getChanges(e={includeChangesInGraveyard:!1}){if(this._cachedChanges)return e.includeChangesInGraveyard?this._cachedChangesWithGraveyard.slice():this._cachedChanges.slice();let t=[];for(const e of this._changesInElement.keys()){const o=this._changesInElement.get(e).sort((e,t)=>e.offset===t.offset?e.type!=t.type?"remove"==e.type?-1:1:0:e.offset<t.offset?-1:1),i=this._elementSnapshots.get(e),s=R(e.getChildren()),r=M(i.length,o);let a=0,c=0;for(const o of r)if("i"===o)t.push(this._getInsertDiff(e,a,s[a].name)),a++;else if("r"===o)t.push(this._getRemoveDiff(e,a,i[c].name)),c++;else if("a"===o){const o=s[a].attributes,r=i[c].attributes;let l;if("$text"==s[a].name)l=new n.a(v.a._createAt(e,a),v.a._createAt(e,a+1));else{const t=e.offsetToIndex(a);l=new n.a(v.a._createAt(e,a),v.a._createAt(e.getChild(t),0))}t.push(...this._getAttributesDiff(l,r,o)),a++,c++}else a++,c++}t.sort((e,t)=>e.position.root!=t.position.root?e.position.root.rootName<t.position.root.rootName?-1:1:e.position.isEqual(t.position)?e.changeCount-t.changeCount:e.position.isBefore(t.position)?-1:1);for(let e=1,o=0;e<t.length;e++){const i=t[o],s=t[e],r="remove"==i.type&&"remove"==s.type&&"$text"==i.name&&"$text"==s.name&&i.position.isEqual(s.position),n="insert"==i.type&&"insert"==s.type&&"$text"==i.name&&"$text"==s.name&&i.position.parent==s.position.parent&&i.position.offset+i.length==s.position.offset,a="attribute"==i.type&&"attribute"==s.type&&i.position.parent==s.position.parent&&i.range.isFlat&&s.range.isFlat&&i.position.offset+i.length==s.position.offset&&i.attributeKey==s.attributeKey&&i.attributeOldValue==s.attributeOldValue&&i.attributeNewValue==s.attributeNewValue;r||n||a?(i.length++,a&&(i.range.end=i.range.end.getShiftedBy(1)),t[e]=null):o=e}t=t.filter(e=>e);for(const e of t)delete e.changeCount,"attribute"==e.type&&(delete e.position,delete e.length);return this._changeCount=0,this._cachedChangesWithGraveyard=t.slice(),this._cachedChanges=t.filter(N),e.includeChangesInGraveyard?this._cachedChangesWithGraveyard:this._cachedChanges}reset(){this._changesInElement.clear(),this._elementSnapshots.clear(),this._changedMarkers.clear(),this._cachedChanges=null}_markInsert(e,t,o){const i={type:"insert",offset:t,howMany:o,count:this._changeCount++};this._markChange(e,i)}_markRemove(e,t,o){const i={type:"remove",offset:t,howMany:o,count:this._changeCount++};this._markChange(e,i),this._removeAllNestedChanges(e,t,o)}_markAttribute(e){const t={type:"attribute",offset:e.startOffset,howMany:e.offsetSize,count:this._changeCount++};this._markChange(e.parent,t)}_markChange(e,t){this._makeSnapshot(e);const o=this._getChangesForElement(e);this._handleChange(t,o),o.push(t);for(let e=0;e<o.length;e++)o[e].howMany<1&&(o.splice(e,1),e--)}_getChangesForElement(e){let t;return this._changesInElement.has(e)?t=this._changesInElement.get(e):(t=[],this._changesInElement.set(e,t)),t}_makeSnapshot(e){this._elementSnapshots.has(e)||this._elementSnapshots.set(e,R(e.getChildren()))}_handleChange(e,t){e.nodesToHandle=e.howMany;for(const o of t){const i=e.offset+e.howMany,s=o.offset+o.howMany;if("insert"==e.type&&("insert"==o.type&&(e.offset<=o.offset?o.offset+=e.howMany:e.offset<s&&(o.howMany+=e.nodesToHandle,e.nodesToHandle=0)),"remove"==o.type&&e.offset<o.offset&&(o.offset+=e.howMany),"attribute"==o.type))if(e.offset<=o.offset)o.offset+=e.howMany;else if(e.offset<s){const s=o.howMany;o.howMany=e.offset-o.offset,t.unshift({type:"attribute",offset:i,howMany:s-o.howMany,count:this._changeCount++})}if("remove"==e.type){if("insert"==o.type)if(i<=o.offset)o.offset-=e.howMany;else if(i<=s)if(e.offset<o.offset){const t=i-o.offset;o.offset=e.offset,o.howMany-=t,e.nodesToHandle-=t}else o.howMany-=e.nodesToHandle,e.nodesToHandle=0;else if(e.offset<=o.offset)e.nodesToHandle-=o.howMany,o.howMany=0;else if(e.offset<s){const t=s-e.offset;o.howMany-=t,e.nodesToHandle-=t}if("remove"==o.type&&(i<=o.offset?o.offset-=e.howMany:e.offset<o.offset&&(e.nodesToHandle+=o.howMany,o.howMany=0)),"attribute"==o.type)if(i<=o.offset)o.offset-=e.howMany;else if(e.offset<o.offset){const t=i-o.offset;o.offset=e.offset,o.howMany-=t}else if(e.offset<s)if(i<=s){const i=o.howMany;o.howMany=e.offset-o.offset;const s=i-o.howMany-e.nodesToHandle;t.unshift({type:"attribute",offset:e.offset,howMany:s,count:this._changeCount++})}else o.howMany-=s-e.offset}if("attribute"==e.type){if("insert"==o.type)if(e.offset<o.offset&&i>o.offset){if(i>s){const e={type:"attribute",offset:s,howMany:i-s,count:this._changeCount++};this._handleChange(e,t),t.push(e)}e.nodesToHandle=o.offset-e.offset,e.howMany=e.nodesToHandle}else e.offset>=o.offset&&e.offset<s&&(i>s?(e.nodesToHandle=i-s,e.offset=s):e.nodesToHandle=0);if("remove"==o.type&&e.offset<o.offset&&i>o.offset){const s={type:"attribute",offset:o.offset,howMany:i-o.offset,count:this._changeCount++};this._handleChange(s,t),t.push(s),e.nodesToHandle=o.offset-e.offset,e.howMany=e.nodesToHandle}"attribute"==o.type&&(e.offset>=o.offset&&i<=s?(e.nodesToHandle=0,e.howMany=0,e.offset=0):e.offset<=o.offset&&i>=s&&(o.howMany=0))}}e.howMany=e.nodesToHandle,delete e.nodesToHandle}_getInsertDiff(e,t,o){return{type:"insert",position:v.a._createAt(e,t),name:o,length:1,changeCount:this._changeCount++}}_getRemoveDiff(e,t,o){return{type:"remove",position:v.a._createAt(e,t),name:o,length:1,changeCount:this._changeCount++}}_getAttributesDiff(e,t,o){const i=[];o=new Map(o);for(const[s,r]of t){const t=o.has(s)?o.get(s):null;t!==r&&i.push({type:"attribute",position:e.start,range:e.clone(),length:1,attributeKey:s,attributeOldValue:r,attributeNewValue:t,changeCount:this._changeCount++}),o.delete(s)}for(const[t,s]of o)i.push({type:"attribute",position:e.start,range:e.clone(),length:1,attributeKey:t,attributeOldValue:null,attributeNewValue:s,changeCount:this._changeCount++});return i}_isInInsertedElement(e){const t=e.parent;if(!t)return!1;const o=this._changesInElement.get(t),i=e.startOffset;if(o)for(const e of o)if("insert"==e.type&&i>=e.offset&&i<e.offset+e.howMany)return!0;return this._isInInsertedElement(t)}_removeAllNestedChanges(e,t,o){const i=new n.a(v.a._createAt(e,t),v.a._createAt(e,t+o));for(const e of i.getItems({shallow:!0}))e.is("element")&&(this._elementSnapshots.delete(e),this._changesInElement.delete(e),this._removeAllNestedChanges(e,0,e.maxOffset))}}function R(e){const t=[];for(const o of e)if(o.is("$text"))for(let e=0;e<o.data.length;e++)t.push({name:"$text",attributes:new Map(o.getAttributes())});else t.push({name:o.name,attributes:new Map(o.getAttributes())});return t}function M(e,t){const o=[];let i=0,s=0;for(const e of t){if(e.offset>i){for(let t=0;t<e.offset-i;t++)o.push("e");s+=e.offset-i}if("insert"==e.type){for(let t=0;t<e.howMany;t++)o.push("i");i=e.offset+e.howMany}else if("remove"==e.type){for(let t=0;t<e.howMany;t++)o.push("r");i=e.offset,s+=e.howMany}else o.push(..."a".repeat(e.howMany).split("")),i=e.offset+e.howMany,s+=e.howMany}if(s<e)for(let t=0;t<e-s-i;t++)o.push("e");return o}function N(e){const t=e.position&&"$graveyard"==e.position.root.rootName,o=e.range&&"$graveyard"==e.range.root.rootName;return!t&&!o}class I{constructor(){this._operations=[],this._undoPairs=new Map,this._undoneOperations=new Set}addOperation(e){this._operations.includes(e)||this._operations.push(e)}getOperations(e=Number.NEGATIVE_INFINITY,t=Number.POSITIVE_INFINITY){const o=[];for(const i of this._operations)i.baseVersion>=e&&i.baseVersion<t&&o.push(i);return o}getOperation(e){for(const t of this._operations)if(t.baseVersion==e)return t}setOperationAsUndone(e,t){this._undoPairs.set(t,e),this._undoneOperations.add(e)}isUndoingOperation(e){return this._undoPairs.has(e)}isUndoneOperation(e){return this._undoneOperations.has(e)}getUndoneOperation(e){return this._undoPairs.get(e)}}var z=o("./packages/ckeditor5-utils/src/collection.js"),V=o("./packages/ckeditor5-utils/src/emittermixin.js"),D=o("./packages/ckeditor5-utils/src/mix.js");function B(e,t){return!!(o=e.charAt(t-1))&&1==o.length&&/[\ud800-\udbff]/.test(o)&&function(e){return!!e&&1==e.length&&/[\udc00-\udfff]/.test(e)}(e.charAt(t));var o}function F(e,t){return!!(o=e.charAt(t))&&1==o.length&&/[\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]/.test(o);var o}var L=o("./node_modules/lodash-es/clone.js");class W{constructor(e){this.model=e,this.version=0,this.history=new I(this),this.selection=new y.a(this),this.roots=new z.a({idProperty:"rootName"}),this.differ=new S(e.markers),this._postFixers=new Set,this._hasSelectionChangedFromTheLastChangeBlock=!1,this.createRoot("$root","$graveyard"),this.listenTo(e,"applyOperation",(e,t)=>{const o=t[0];if(o.isDocumentOperation&&o.baseVersion!==this.version)throw new c.a("model-document-applyoperation-wrong-version",this,{operation:o})},{priority:"highest"}),this.listenTo(e,"applyOperation",(e,t)=>{const o=t[0];o.isDocumentOperation&&this.differ.bufferOperation(o)},{priority:"high"}),this.listenTo(e,"applyOperation",(e,t)=>{const o=t[0];o.isDocumentOperation&&(this.version++,this.history.addOperation(o))},{priority:"low"}),this.listenTo(this.selection,"change",()=>{this._hasSelectionChangedFromTheLastChangeBlock=!0}),this.listenTo(e.markers,"update",(e,t,o,i)=>{this.differ.bufferMarkerChange(t.name,o,i,t.affectsData),null===o&&t.on("change",(e,o)=>{this.differ.bufferMarkerChange(t.name,o,t.getRange(),t.affectsData)})})}get graveyard(){return this.getRoot("$graveyard")}createRoot(e="$root",t="main"){if(this.roots.get(t))throw new c.a("model-document-createroot-name-exists",this,{name:t});const o=new w(this,e,t);return this.roots.add(o),o}destroy(){this.selection.destroy(),this.stopListening()}getRoot(e="main"){return this.roots.get(e)}getRootNames(){return Array.from(this.roots,e=>e.rootName).filter(e=>"$graveyard"!=e)}registerPostFixer(e){this._postFixers.add(e)}toJSON(){const e=Object(L.a)(this);return e.selection="[engine.model.DocumentSelection]",e.model="[engine.model.Model]",e}_handleChangeBlock(e){this._hasDocumentChangedFromTheLastChangeBlock()&&(this._callPostFixers(e),this.selection.refresh(),this.differ.hasDataChanges()?this.fire("change:data",e.batch):this.fire("change",e.batch),this.selection.refresh(),this.differ.reset()),this._hasSelectionChangedFromTheLastChangeBlock=!1}_hasDocumentChangedFromTheLastChangeBlock(){return!this.differ.isEmpty||this._hasSelectionChangedFromTheLastChangeBlock}_getDefaultRoot(){for(const e of this.roots)if(e!==this.graveyard)return e;return this.graveyard}_getDefaultRange(){const e=this._getDefaultRoot(),t=this.model,o=t.schema,i=t.createPositionFromPath(e,[0]);return o.getNearestSelectionRange(i)||t.createRange(i)}_validateSelectionRange(e){return H(e.start)&&H(e.end)}_callPostFixers(e){let t=!1;do{for(const o of this._postFixers)if(this.selection.refresh(),t=o(e),t)break}while(t)}}function H(e){const t=e.textNode;if(t){const o=t.data,i=e.offset-t.startOffset;return!B(o,i)&&!F(o,i)}return!0}Object(D.a)(W,V.c);var q=o("./packages/ckeditor5-engine/src/model/liverange.js");class ${constructor(){this._markers=new Map}[Symbol.iterator](){return this._markers.values()}has(e){const t=e instanceof U?e.name:e;return this._markers.has(t)}get(e){return this._markers.get(e)||null}_set(e,t,o=!1,i=!1){const s=e instanceof U?e.name:e;if(s.includes(","))throw new c.a("markercollection-incorrect-marker-name",this);const r=this._markers.get(s);if(r){const e=r.getRange();let n=!1;return e.isEqual(t)||(r._attachLiveRange(q.a.fromRange(t)),n=!0),o!=r.managedUsingOperations&&(r._managedUsingOperations=o,n=!0),"boolean"==typeof i&&i!=r.affectsData&&(r._affectsData=i,n=!0),n&&this.fire("update:"+s,r,e,t),r}const n=q.a.fromRange(t),a=new U(s,n,o,i);return this._markers.set(s,a),this.fire("update:"+s,a,null,t),a}_remove(e){const t=e instanceof U?e.name:e,o=this._markers.get(t);return!!o&&(this._markers.delete(t),this.fire("update:"+t,o,o.getRange(),null),this._destroyMarker(o),!0)}_refresh(e){const t=e instanceof U?e.name:e,o=this._markers.get(t);if(!o)throw new c.a("markercollection-refresh-marker-not-exists",this);const i=o.getRange();this.fire("update:"+t,o,i,i,o.managedUsingOperations,o.affectsData)}*getMarkersAtPosition(e){for(const t of this)t.getRange().containsPosition(e)&&(yield t)}*getMarkersIntersectingRange(e){for(const t of this)null!==t.getRange().getIntersection(e)&&(yield t)}destroy(){for(const e of this._markers.values())this._destroyMarker(e);this._markers=null,this.stopListening()}*getMarkersGroup(e){for(const t of this._markers.values())t.name.startsWith(e+":")&&(yield t)}_destroyMarker(e){e.stopListening(),e._detachLiveRange()}}Object(D.a)($,V.c);class U{constructor(e,t,o,i){this.name=e,this._liveRange=this._attachLiveRange(t),this._managedUsingOperations=o,this._affectsData=i}get managedUsingOperations(){if(!this._liveRange)throw new c.a("marker-destroyed",this);return this._managedUsingOperations}get affectsData(){if(!this._liveRange)throw new c.a("marker-destroyed",this);return this._affectsData}getStart(){if(!this._liveRange)throw new c.a("marker-destroyed",this);return this._liveRange.start.clone()}getEnd(){if(!this._liveRange)throw new c.a("marker-destroyed",this);return this._liveRange.end.clone()}getRange(){if(!this._liveRange)throw new c.a("marker-destroyed",this);return this._liveRange.toRange()}is(e){return"marker"===e||"model:marker"===e}_attachLiveRange(e){return this._liveRange&&this._detachLiveRange(),e.delegate("change:range").to(this),e.delegate("change:content").to(this),this._liveRange=e,e}_detachLiveRange(){this._liveRange.stopDelegating("change:range",this),this._liveRange.stopDelegating("change:content",this),this._liveRange.detach(),this._liveRange=null}}Object(D.a)(U,V.c);var K=o("./packages/ckeditor5-utils/src/observablemixin.js"),G=o("./packages/ckeditor5-engine/src/model/selection.js"),J=o("./packages/ckeditor5-engine/src/model/operation/operationfactory.js"),Y=o("./packages/ckeditor5-engine/src/model/liveposition.js");class X{constructor(e,t,o){this.model=e,this.writer=t,this.position=o,this.canMergeWith=new Set([this.position.parent]),this.schema=e.schema,this._documentFragment=t.createDocumentFragment(),this._documentFragmentPosition=t.createPositionAt(this._documentFragment,0),this._firstNode=null,this._lastNode=null,this._lastAutoParagraph=null,this._filterAttributesOf=[],this._affectedStart=null,this._affectedEnd=null}handleNodes(e){for(const t of Array.from(e))this._handleNode(t);this._insertPartialFragment(),this._lastAutoParagraph&&this._updateLastNodeFromAutoParagraph(this._lastAutoParagraph),this._mergeOnRight(),this.schema.removeDisallowedAttributes(this._filterAttributesOf,this.writer),this._filterAttributesOf=[]}_updateLastNodeFromAutoParagraph(e){const t=this.writer.createPositionAfter(this._lastNode),o=this.writer.createPositionAfter(e);if(o.isAfter(t)){if(this._lastNode=e,this.position.parent!=e||!this.position.isAtEnd)throw new c.a("insertcontent-invalid-insertion-position",this);this.position=o,this._setAffectedBoundaries(this.position)}}getSelectionRange(){return this.nodeToSelect?n.a._createOn(this.nodeToSelect):this.model.schema.getNearestSelectionRange(this.position)}getAffectedRange(){return this._affectedStart?new n.a(this._affectedStart,this._affectedEnd):null}destroy(){this._affectedStart&&this._affectedStart.detach(),this._affectedEnd&&this._affectedEnd.detach()}_handleNode(e){if(this.schema.isObject(e))return void this._handleObject(e);let t=this._checkAndAutoParagraphToAllowedPosition(e);t||(t=this._checkAndSplitToAllowedPosition(e),t)?(this._appendToFragment(e),this._firstNode||(this._firstNode=e),this._lastNode=e):this._handleDisallowedNode(e)}_insertPartialFragment(){if(this._documentFragment.isEmpty)return;const e=Y.a.fromPosition(this.position,"toNext");this._setAffectedBoundaries(this.position),this._documentFragment.getChild(0)==this._firstNode&&(this.writer.insert(this._firstNode,this.position),this._mergeOnLeft(),this.position=e.toPosition()),this._documentFragment.isEmpty||this.writer.insert(this._documentFragment,this.position),this._documentFragmentPosition=this.writer.createPositionAt(this._documentFragment,0),this.position=e.toPosition(),e.detach()}_handleObject(e){this._checkAndSplitToAllowedPosition(e)?this._appendToFragment(e):this._tryAutoparagraphing(e)}_handleDisallowedNode(e){e.is("element")?this.handleNodes(e.getChildren()):this._tryAutoparagraphing(e)}_appendToFragment(e){if(!this.schema.checkChild(this.position,e))throw new c.a("insertcontent-wrong-position",this,{node:e,position:this.position});this.writer.insert(e,this._documentFragmentPosition),this._documentFragmentPosition=this._documentFragmentPosition.getShiftedBy(e.offsetSize),this.schema.isObject(e)&&!this.schema.checkChild(this.position,"$text")?this.nodeToSelect=e:this.nodeToSelect=null,this._filterAttributesOf.push(e)}_setAffectedBoundaries(e){this._affectedStart||(this._affectedStart=Y.a.fromPosition(e,"toPrevious")),this._affectedEnd&&!this._affectedEnd.isBefore(e)||(this._affectedEnd&&this._affectedEnd.detach(),this._affectedEnd=Y.a.fromPosition(e,"toNext"))}_mergeOnLeft(){const e=this._firstNode;if(!(e instanceof _.a))return;if(!this._canMergeLeft(e))return;const t=Y.a._createBefore(e);t.stickiness="toNext";const o=Y.a.fromPosition(this.position,"toNext");this._affectedStart.isEqual(t)&&(this._affectedStart.detach(),this._affectedStart=Y.a._createAt(t.nodeBefore,"end","toPrevious")),this._firstNode===this._lastNode&&(this._firstNode=t.nodeBefore,this._lastNode=t.nodeBefore),this.writer.merge(t),t.isEqual(this._affectedEnd)&&this._firstNode===this._lastNode&&(this._affectedEnd.detach(),this._affectedEnd=Y.a._createAt(t.nodeBefore,"end","toNext")),this.position=o.toPosition(),o.detach(),this._filterAttributesOf.push(this.position.parent),t.detach()}_mergeOnRight(){const e=this._lastNode;if(!(e instanceof _.a))return;if(!this._canMergeRight(e))return;const t=Y.a._createAfter(e);if(t.stickiness="toNext",!this.position.isEqual(t))throw new c.a("insertcontent-invalid-insertion-position",this);this.position=v.a._createAt(t.nodeBefore,"end");const o=Y.a.fromPosition(this.position,"toPrevious");this._affectedEnd.isEqual(t)&&(this._affectedEnd.detach(),this._affectedEnd=Y.a._createAt(t.nodeBefore,"end","toNext")),this._firstNode===this._lastNode&&(this._firstNode=t.nodeBefore,this._lastNode=t.nodeBefore),this.writer.merge(t),t.getShiftedBy(-1).isEqual(this._affectedStart)&&this._firstNode===this._lastNode&&(this._affectedStart.detach(),this._affectedStart=Y.a._createAt(t.nodeBefore,0,"toPrevious")),this.position=o.toPosition(),o.detach(),this._filterAttributesOf.push(this.position.parent),t.detach()}_canMergeLeft(e){const t=e.previousSibling;return t instanceof _.a&&this.canMergeWith.has(t)&&this.model.schema.checkMerge(t,e)}_canMergeRight(e){const t=e.nextSibling;return t instanceof _.a&&this.canMergeWith.has(t)&&this.model.schema.checkMerge(e,t)}_tryAutoparagraphing(e){const t=this.writer.createElement("paragraph");this._getAllowedIn(this.position.parent,t)&&this.schema.checkChild(t,e)&&(t._appendChild(e),this._handleNode(t))}_checkAndAutoParagraphToAllowedPosition(e){if(this.schema.checkChild(this.position.parent,e))return!0;if(!this.schema.checkChild(this.position.parent,"paragraph")||!this.schema.checkChild("paragraph",e))return!1;this._insertPartialFragment();const t=this.writer.createElement("paragraph");return this.writer.insert(t,this.position),this._setAffectedBoundaries(this.position),this._lastAutoParagraph=t,this.position=this.writer.createPositionAt(t,0),!0}_checkAndSplitToAllowedPosition(e){const t=this._getAllowedIn(this.position.parent,e);if(!t)return!1;for(t!=this.position.parent&&this._insertPartialFragment();t!=this.position.parent;)if(this.position.isAtStart){const e=this.position.parent;this.position=this.writer.createPositionBefore(e),e.isEmpty&&e.parent===t&&this.writer.remove(e)}else if(this.position.isAtEnd)this.position=this.writer.createPositionAfter(this.position.parent);else{const e=this.writer.createPositionAfter(this.position.parent);this._setAffectedBoundaries(this.position),this.writer.split(this.position),this.position=e,this.canMergeWith.add(this.position.nodeAfter)}return!0}_getAllowedIn(e,t){return this.schema.checkChild(e,t)?e:this.schema.isLimit(e)?null:this._getAllowedIn(e.parent,t)}}function Z(e,t,o={}){if(t.isCollapsed)return;const i=t.getFirstRange();if("$graveyard"==i.root.rootName)return;const s=e.schema;e.change(e=>{if(!o.doNotResetEntireContent&&function(e,t){const o=e.getLimitElement(t);if(!t.containsEntireContent(o))return!1;const i=t.getFirstRange();if(i.start.parent==i.end.parent)return!1;return e.checkChild(o,"paragraph")}(s,t))return void function(e,t){const o=e.model.schema.getLimitElement(t);e.remove(e.createRangeIn(o)),ee(e,e.createPositionAt(o,0),t)}(e,t);const[r,n]=function(e){const t=e.root.document.model,o=e.start;let i=e.end;if(t.hasContent(e,{ignoreMarkers:!0})){const o=function(e){const t=e.parent,o=t.root.document.model.schema,i=t.getAncestors({parentFirst:!0,includeSelf:!0});for(const e of i){if(o.isLimit(e))return null;if(o.isBlock(e))return e}}(i);if(o&&i.isTouching(t.createPositionAt(o,0))){const o=t.createSelection(e);t.modifySelection(o,{direction:"backward"});const s=o.getLastPosition(),r=t.createRange(s,i);t.hasContent(r,{ignoreMarkers:!0})||(i=s)}}return[Y.a.fromPosition(o,"toPrevious"),Y.a.fromPosition(i,"toNext")]}(i);r.isTouching(n)||e.remove(e.createRange(r,n)),o.leaveUnmerged||(!function(e,t,o){const i=e.model;if(!Q(e.model.schema,t,o))return;const[s,r]=function(e,t){const o=e.getAncestors(),i=t.getAncestors();let s=0;for(;o[s]&&o[s]==i[s];)s++;return[o[s],i[s]]}(t,o);if(!s||!r)return;!i.hasContent(s,{ignoreMarkers:!0})&&i.hasContent(r,{ignoreMarkers:!0})?function e(t,o,i,s){const r=o.parent,n=i.parent;if(r==s||n==s)return;o=t.createPositionAfter(r),(i=t.createPositionBefore(n)).isEqual(o)||t.insert(r,i);for(;o.parent.isEmpty;){const e=o.parent;o=t.createPositionBefore(e),t.remove(e)}if(i=t.createPositionBefore(n),function(e,t){const o=t.nodeBefore,i=t.nodeAfter;o.name!=i.name&&e.rename(o,i.name);e.clearAttributes(o),e.setAttributes(Object.fromEntries(i.getAttributes()),o),e.merge(t)}(t,i),!Q(t.model.schema,o,i))return;e(t,o,i,s)}(e,t,o,s.parent):function e(t,o,i,s){const r=o.parent,n=i.parent;if(r==s||n==s)return;o=t.createPositionAfter(r),(i=t.createPositionBefore(n)).isEqual(o)||t.insert(n,o);t.merge(o);for(;i.parent.isEmpty;){const e=i.parent;i=t.createPositionBefore(e),t.remove(e)}if(!Q(t.model.schema,o,i))return;e(t,o,i,s)}(e,t,o,s.parent)}(e,r,n),s.removeDisallowedAttributes(r.parent.getChildren(),e)),te(e,t,r),!o.doNotAutoparagraph&&function(e,t){const o=e.checkChild(t,"$text"),i=e.checkChild(t,"paragraph");return!o&&i}(s,r)&&ee(e,r,t),r.detach(),n.detach()})}function Q(e,t,o){const i=t.parent,s=o.parent;return i!=s&&(!e.isLimit(i)&&!e.isLimit(s)&&function(e,t,o){const i=new n.a(e,t);for(const e of i.getWalker())if(o.isLimit(e.item))return!1;return!0}(t,o,e))}function ee(e,t,o){const i=e.createElement("paragraph");e.insert(i,t),te(e,o,e.createPositionAt(i,0))}function te(e,t,o){t instanceof y.a?e.setSelection(o):t.setTo(o)}var oe=o("./packages/ckeditor5-engine/src/model/treewalker.js");function ie(e,t){const{isForward:o,walker:i,unit:s,schema:r}=e,{type:n,item:a,nextPosition:c}=t;if("text"==n)return"word"===e.unit?function(e,t){let o=e.position.textNode;if(o){let i=e.position.offset-o.startOffset;for(;!re(o.data,i,t)&&!ne(o,i,t);){e.next();const s=t?e.position.nodeAfter:e.position.nodeBefore;if(s&&s.is("$text")){const i=s.data.charAt(t?0:s.data.length-1);' ,.?!:;"-()'.includes(i)||(e.next(),o=e.position.textNode)}i=e.position.offset-o.startOffset}}return e.position}(i,o):function(e,t){const o=e.position.textNode;if(o){const i=o.data;let s=e.position.offset-o.startOffset;for(;B(i,s)||"character"==t&&F(i,s);)e.next(),s=e.position.offset-o.startOffset}return e.position}(i,s);if(n==(o?"elementStart":"elementEnd")){if(r.isSelectable(a))return v.a._createAt(a,o?"after":"before");if(r.checkChild(c,"$text"))return c}else{if(r.isLimit(a))return void i.skip(()=>!0);if(r.checkChild(c,"$text"))return c}}function se(e,t){const o=e.root,i=v.a._createAt(o,t?"end":0);return t?new n.a(e,i):new n.a(i,e)}function re(e,t,o){const i=t+(o?0:-1);return' ,.?!:;"-()'.includes(e.charAt(i))}function ne(e,t,o){return t===(o?e.endOffset:0)}function ae(e,t){const o=[];Array.from(e.getItems({direction:"backward"})).map(e=>t.createRangeOn(e)).filter(t=>(t.start.isAfter(e.start)||t.start.isEqual(e.start))&&(t.end.isBefore(e.end)||t.end.isEqual(e.end))).forEach(e=>{o.push(e.start.parent),t.remove(e)}),o.forEach(e=>{let o=e;for(;o.parent&&o.isEmpty;){const e=t.createRangeOn(o);o=o.parent,t.remove(e)}})}function ce(e){e.document.registerPostFixer(t=>function(e,t){const o=t.document.selection,i=t.schema,s=[];let r=!1;for(const e of o.getRanges()){const t=le(e,i);t&&!t.isEqual(e)?(s.push(t),r=!0):s.push(e)}r&&e.setSelection(function(e){const t=[];t.push(e.shift());for(const o of e){const e=t.pop();if(o.isEqual(e))t.push(e);else if(o.isIntersecting(e)){const i=e.start.isAfter(o.start)?o.start:e.start,s=e.end.isAfter(o.end)?e.end:o.end,r=new n.a(i,s);t.push(r)}else t.push(e),t.push(o)}return t}(s),{backward:o.isBackward})}(t,e))}function le(e,t){return e.isCollapsed?function(e,t){const o=e.start,i=t.getNearestSelectionRange(o);if(!i){const e=o.getAncestors().reverse().find(e=>t.isObject(e));return e?n.a._createOn(e):null}if(!i.isCollapsed)return i;const s=i.start;if(o.isEqual(s))return null;return new n.a(s)}(e,t):function(e,t){const{start:o,end:i}=e,s=t.checkChild(o,"$text"),r=t.checkChild(i,"$text"),a=t.getLimitElement(o),c=t.getLimitElement(i);if(a===c){if(s&&r)return null;if(function(e,t,o){const i=e.nodeAfter&&!o.isLimit(e.nodeAfter)||o.checkChild(e,"$text"),s=t.nodeBefore&&!o.isLimit(t.nodeBefore)||o.checkChild(t,"$text");return i||s}(o,i,t)){const e=o.nodeAfter&&t.isSelectable(o.nodeAfter)?null:t.getNearestSelectionRange(o,"forward"),s=i.nodeBefore&&t.isSelectable(i.nodeBefore)?null:t.getNearestSelectionRange(i,"backward"),r=e?e.start:o,a=s?s.end:i;return new n.a(r,a)}}const l=a&&!a.is("rootElement"),d=c&&!c.is("rootElement");if(l||d){const e=o.nodeAfter&&i.nodeBefore&&o.nodeAfter.parent===i.nodeBefore.parent,s=l&&(!e||!ue(o.nodeAfter,t)),r=d&&(!e||!ue(i.nodeBefore,t));let u=o,h=i;return s&&(u=v.a._createBefore(de(a,t))),r&&(h=v.a._createAfter(de(c,t))),new n.a(u,h)}return null}(e,t)}function de(e,t){let o=e,i=o;for(;t.isLimit(i)&&i.parent;)o=i,i=i.parent;return o}function ue(e,t){return e&&t.isSelectable(e)}var he=o("./packages/ckeditor5-engine/src/model/utils/autoparagraphing.js");class pe{constructor(){this.markers=new $,this.document=new W(this),this.schema=new E.b,this._pendingChanges=[],this._currentWriter=null,["insertContent","deleteContent","modifySelection","getSelectedContent","applyOperation"].forEach(e=>this.decorate(e)),this.on("applyOperation",(e,t)=>{t[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,isContent:!0}),this.schema.register("$clipboardHolder",{allowContentOf:"$root",allowChildren:"$text",isLimit:!0}),this.schema.register("$documentFragment",{allowContentOf:"$root",allowChildren:"$text",isLimit:!0}),this.schema.register("$marker"),this.schema.addChildCheck((e,t)=>{if("$marker"===t.name)return!0}),ce(this),this.document.registerPostFixer(he.a)}change(e){try{return 0===this._pendingChanges.length?(this._pendingChanges.push({batch:new i,callback:e}),this._runPendingChanges()[0]):e(this._currentWriter)}catch(e){c.a.rethrowUnexpectedError(e,this)}}enqueueChange(e,t){try{"string"==typeof e?e=new i(e):"function"==typeof e&&(t=e,e=new i),this._pendingChanges.push({batch:e,callback:t}),1==this._pendingChanges.length&&this._runPendingChanges()}catch(e){c.a.rethrowUnexpectedError(e,this)}}applyOperation(e){e._execute()}insertContent(e,t,o){return function(e,t,o,i){return e.change(s=>{let r;r=o?o instanceof G.a||o instanceof y.a?o:s.createSelection(o,i):e.document.selection,r.isCollapsed||e.deleteContent(r,{doNotAutoparagraph:!0});const n=new X(e,s,r.anchor);let a;a=t.is("documentFragment")?t.getChildren():[t],n.handleNodes(a);const c=n.getSelectionRange();c&&(r instanceof y.a?s.setSelection(c):r.setTo(c));const l=n.getAffectedRange()||e.createRange(r.anchor);return n.destroy(),l})}(this,e,t,o)}deleteContent(e,t){Z(this,e,t)}modifySelection(e,t){!function(e,t,o={}){const i=e.schema,s="backward"!=o.direction,r=o.unit?o.unit:"character",n=t.focus,a=new oe.a({boundaries:se(n,s),singleCharacters:!0,direction:s?"forward":"backward"}),c={walker:a,schema:i,isForward:s,unit:r};let l;for(;l=a.next();){if(l.done)return;const o=ie(c,l.value);if(o)return void(t instanceof y.a?e.change(e=>{e.setSelectionFocus(o)}):t.setFocus(o))}}(this,e,t)}getSelectedContent(e){return function(e,t){return e.change(e=>{const o=e.createDocumentFragment(),i=t.getFirstRange();if(!i||i.isCollapsed)return o;const s=i.start.root,r=i.start.getCommonPath(i.end),n=s.getNodeByPath(r);let a;a=i.start.parent==i.end.parent?i:e.createRange(e.createPositionAt(n,i.start.path[r.length]),e.createPositionAt(n,i.end.path[r.length]+1));const c=a.end.offset-a.start.offset;for(const t of a.getItems({shallow:!0}))t.is("$textProxy")?e.appendText(t.data,t.getAttributes(),o):e.append(e.cloneElement(t,!0),o);if(a!=i){const t=i._getTransformedByMove(a.start,e.createPositionAt(o,0),c)[0],s=e.createRange(e.createPositionAt(o,0),t.start);ae(e.createRange(t.end,e.createPositionAt(o,"end")),e),ae(s,e)}return o})}(this,e)}hasContent(e,t={}){const o=e instanceof _.a?n.a._createIn(e):e;if(o.isCollapsed)return!1;const{ignoreWhitespaces:i=!1,ignoreMarkers:s=!1}=t;if(!s)for(const e of this.markers.getMarkersIntersectingRange(o))if(e.affectsData)return!0;for(const e of o.getItems())if(this.schema.isContent(e)){if(!e.is("$textProxy"))return!0;if(!i)return!0;if(-1!==e.data.search(/\S/))return!0}return!1}createPositionFromPath(e,t,o){return new v.a(e,t,o)}createPositionAt(e,t){return v.a._createAt(e,t)}createPositionAfter(e){return v.a._createAfter(e)}createPositionBefore(e){return v.a._createBefore(e)}createRange(e,t){return new n.a(e,t)}createRangeIn(e){return n.a._createIn(e)}createRangeOn(e){return n.a._createOn(e)}createSelection(e,t,o){return new G.a(e,t,o)}createBatch(e){return new i(e)}createOperationFromJSON(e){return J.a.fromJSON(e,this.document)}destroy(){this.document.destroy(),this.stopListening()}_runPendingChanges(){const e=[];for(this.fire("_beforeChanges");this._pendingChanges.length;){const t=this._pendingChanges[0].batch;this._currentWriter=new x(this,t);const o=this._pendingChanges[0].callback(this._currentWriter);e.push(o),this.document._handleChangeBlock(this._currentWriter),this._pendingChanges.shift(),this._currentWriter=null}return this.fire("_afterChanges"),e}}Object(D.a)(pe,K.a)},"./packages/ckeditor5-engine/src/model/node.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return n}));var i=o("./packages/ckeditor5-utils/src/tomap.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),r=o("./packages/ckeditor5-utils/src/comparearrays.js");o("./packages/ckeditor5-utils/src/version.js");class n{constructor(e){this.parent=null,this._attrs=Object(i.a)(e)}get index(){let e;if(!this.parent)return null;if(null===(e=this.parent.getChildIndex(this)))throw new s.a("model-node-not-found-in-parent",this);return e}get startOffset(){let e;if(!this.parent)return null;if(null===(e=this.parent.getChildStartOffset(this)))throw new s.a("model-node-not-found-in-parent",this);return e}get offsetSize(){return 1}get endOffset(){return this.parent?this.startOffset+this.offsetSize:null}get nextSibling(){const e=this.index;return null!==e&&this.parent.getChild(e+1)||null}get previousSibling(){const e=this.index;return null!==e&&this.parent.getChild(e-1)||null}get root(){let e=this;for(;e.parent;)e=e.parent;return e}isAttached(){return this.root.is("rootElement")}getPath(){const e=[];let t=this;for(;t.parent;)e.unshift(t.startOffset),t=t.parent;return e}getAncestors(e={includeSelf:!1,parentFirst:!1}){const t=[];let o=e.includeSelf?this:this.parent;for(;o;)t[e.parentFirst?"push":"unshift"](o),o=o.parent;return t}getCommonAncestor(e,t={}){const o=this.getAncestors(t),i=e.getAncestors(t);let s=0;for(;o[s]==i[s]&&o[s];)s++;return 0===s?null:o[s-1]}isBefore(e){if(this==e)return!1;if(this.root!==e.root)return!1;const t=this.getPath(),o=e.getPath(),i=Object(r.a)(t,o);switch(i){case"prefix":return!0;case"extension":return!1;default:return t[i]<o[i]}}isAfter(e){return this!=e&&(this.root===e.root&&!this.isBefore(e))}hasAttribute(e){return this._attrs.has(e)}getAttribute(e){return this._attrs.get(e)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}toJSON(){const e={};return this._attrs.size&&(e.attributes=Array.from(this._attrs).reduce((e,t)=>(e[t[0]]=t[1],e),{})),e}is(e){return"node"===e||"model:node"===e}_clone(){return new n(this._attrs)}_remove(){this.parent._removeChildren(this.index)}_setAttribute(e,t){this._attrs.set(e,t)}_setAttributesTo(e){this._attrs=Object(i.a)(e)}_removeAttribute(e){return this._attrs.delete(e)}_clearAttributes(){this._attrs.clear()}}},"./packages/ckeditor5-engine/src/model/nodelist.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-engine/src/model/node.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class r{constructor(e){this._nodes=[],e&&this._insertNodes(0,e)}[Symbol.iterator](){return this._nodes[Symbol.iterator]()}get length(){return this._nodes.length}get maxOffset(){return this._nodes.reduce((e,t)=>e+t.offsetSize,0)}getNode(e){return this._nodes[e]||null}getNodeIndex(e){const t=this._nodes.indexOf(e);return-1==t?null:t}getNodeStartOffset(e){const t=this.getNodeIndex(e);return null===t?null:this._nodes.slice(0,t).reduce((e,t)=>e+t.offsetSize,0)}indexToOffset(e){if(e==this._nodes.length)return this.maxOffset;const t=this._nodes[e];if(!t)throw new s.a("model-nodelist-index-out-of-bounds",this);return this.getNodeStartOffset(t)}offsetToIndex(e){let t=0;for(const o of this._nodes){if(e>=t&&e<t+o.offsetSize)return this.getNodeIndex(o);t+=o.offsetSize}if(t!=e)throw new s.a("model-nodelist-offset-out-of-bounds",this,{offset:e,nodeList:this});return this.length}_insertNodes(e,t){for(const e of t)if(!(e instanceof i.a))throw new s.a("model-nodelist-insertnodes-not-node",this);this._nodes.splice(e,0,...t)}_removeNodes(e,t=1){return this._nodes.splice(e,t)}toJSON(){return this._nodes.map(e=>e.toJSON())}}},"./packages/ckeditor5-engine/src/model/operation/attributeoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return l}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),s=o("./packages/ckeditor5-engine/src/model/range.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-engine/src/model/operation/utils.js"),a=o("./node_modules/lodash-es/_baseIsEqual.js");var c=function(e,t){return Object(a.a)(e,t)};class l extends i.a{constructor(e,t,o,i,s){super(s),this.range=e.clone(),this.key=t,this.oldValue=void 0===o?null:o,this.newValue=void 0===i?null:i}get type(){return null===this.oldValue?"addAttribute":null===this.newValue?"removeAttribute":"changeAttribute"}clone(){return new l(this.range,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new l(this.range,this.key,this.newValue,this.oldValue,this.baseVersion+1)}toJSON(){const e=super.toJSON();return e.range=this.range.toJSON(),e}_validate(){if(!this.range.isFlat)throw new r.a("attribute-operation-range-not-flat",this);for(const e of this.range.getItems({shallow:!0})){if(null!==this.oldValue&&!c(e.getAttribute(this.key),this.oldValue))throw new r.a("attribute-operation-wrong-old-value",this,{item:e,key:this.key,value:this.oldValue});if(null===this.oldValue&&null!==this.newValue&&e.hasAttribute(this.key))throw new r.a("attribute-operation-attribute-exists",this,{node:e,key:this.key})}}_execute(){c(this.oldValue,this.newValue)||Object(n.e)(this.range,this.key,this.newValue)}static get className(){return"AttributeOperation"}static fromJSON(e,t){return new l(s.a.fromJSON(e.range,t),e.key,e.oldValue,e.newValue,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/insertoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return u}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),s=o("./packages/ckeditor5-engine/src/model/position.js"),r=o("./packages/ckeditor5-engine/src/model/nodelist.js"),n=o("./packages/ckeditor5-engine/src/model/operation/moveoperation.js"),a=o("./packages/ckeditor5-engine/src/model/operation/utils.js"),c=o("./packages/ckeditor5-engine/src/model/text.js"),l=o("./packages/ckeditor5-engine/src/model/element.js"),d=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class u extends i.a{constructor(e,t,o){super(o),this.position=e.clone(),this.position.stickiness="toNone",this.nodes=new r.a(Object(a.c)(t)),this.shouldReceiveAttributes=!1}get type(){return"insert"}get howMany(){return this.nodes.maxOffset}clone(){const e=new r.a([...this.nodes].map(e=>e._clone(!0))),t=new u(this.position,e,this.baseVersion);return t.shouldReceiveAttributes=this.shouldReceiveAttributes,t}getReversed(){const e=this.position.root.document.graveyard,t=new s.a(e,[0]);return new n.a(this.position,this.nodes.maxOffset,t,this.baseVersion+1)}_validate(){const e=this.position.parent;if(!e||e.maxOffset<this.position.offset)throw new d.a("insert-operation-position-invalid",this)}_execute(){const e=this.nodes;this.nodes=new r.a([...e].map(e=>e._clone(!0))),Object(a.a)(this.position,e)}toJSON(){const e=super.toJSON();return e.position=this.position.toJSON(),e.nodes=this.nodes.toJSON(),e}static get className(){return"InsertOperation"}static fromJSON(e,t){const o=[];for(const t of e.nodes)t.name?o.push(l.a.fromJSON(t)):o.push(c.a.fromJSON(t));const i=new u(s.a.fromJSON(e.position,t),o,e.baseVersion);return i.shouldReceiveAttributes=e.shouldReceiveAttributes,i}}},"./packages/ckeditor5-engine/src/model/operation/markeroperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),s=o("./packages/ckeditor5-engine/src/model/range.js");class r extends i.a{constructor(e,t,o,i,s,r){super(r),this.name=e,this.oldRange=t?t.clone():null,this.newRange=o?o.clone():null,this.affectsData=s,this._markers=i}get type(){return"marker"}clone(){return new r(this.name,this.oldRange,this.newRange,this._markers,this.affectsData,this.baseVersion)}getReversed(){return new r(this.name,this.newRange,this.oldRange,this._markers,this.affectsData,this.baseVersion+1)}_execute(){const e=this.newRange?"_set":"_remove";this._markers[e](this.name,this.newRange,!0,this.affectsData)}toJSON(){const e=super.toJSON();return this.oldRange&&(e.oldRange=this.oldRange.toJSON()),this.newRange&&(e.newRange=this.newRange.toJSON()),delete e._markers,e}static get className(){return"MarkerOperation"}static fromJSON(e,t){return new r(e.name,e.oldRange?s.a.fromJSON(e.oldRange,t):null,e.newRange?s.a.fromJSON(e.newRange,t):null,t.model.markers,e.affectsData,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/mergeoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return l}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),s=o("./packages/ckeditor5-engine/src/model/operation/splitoperation.js"),r=o("./packages/ckeditor5-engine/src/model/position.js"),n=o("./packages/ckeditor5-engine/src/model/range.js"),a=o("./packages/ckeditor5-engine/src/model/operation/utils.js"),c=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class l extends i.a{constructor(e,t,o,i,s){super(s),this.sourcePosition=e.clone(),this.sourcePosition.stickiness="toPrevious",this.howMany=t,this.targetPosition=o.clone(),this.targetPosition.stickiness="toNext",this.graveyardPosition=i.clone()}get type(){return"merge"}get deletionPosition(){return new r.a(this.sourcePosition.root,this.sourcePosition.path.slice(0,-1))}get movedRange(){const e=this.sourcePosition.getShiftedBy(Number.POSITIVE_INFINITY);return new n.a(this.sourcePosition,e)}clone(){return new this.constructor(this.sourcePosition,this.howMany,this.targetPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const e=this.targetPosition._getTransformedByMergeOperation(this),t=this.sourcePosition.path.slice(0,-1),o=new r.a(this.sourcePosition.root,t)._getTransformedByMergeOperation(this);return new s.a(e,this.howMany,o,this.graveyardPosition,this.baseVersion+1)}_validate(){const e=this.sourcePosition.parent,t=this.targetPosition.parent;if(!e.parent)throw new c.a("merge-operation-source-position-invalid",this);if(!t.parent)throw new c.a("merge-operation-target-position-invalid",this);if(this.howMany!=e.maxOffset)throw new c.a("merge-operation-how-many-invalid",this)}_execute(){const e=this.sourcePosition.parent,t=n.a._createIn(e);Object(a.b)(t,this.targetPosition),Object(a.b)(n.a._createOn(e),this.graveyardPosition)}toJSON(){const e=super.toJSON();return e.sourcePosition=e.sourcePosition.toJSON(),e.targetPosition=e.targetPosition.toJSON(),e.graveyardPosition=e.graveyardPosition.toJSON(),e}static get className(){return"MergeOperation"}static fromJSON(e,t){const o=r.a.fromJSON(e.sourcePosition,t),i=r.a.fromJSON(e.targetPosition,t),s=r.a.fromJSON(e.graveyardPosition,t);return new this(o,e.howMany,i,s,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/moveoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return l}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),s=o("./packages/ckeditor5-engine/src/model/position.js"),r=o("./packages/ckeditor5-engine/src/model/range.js"),n=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),a=o("./packages/ckeditor5-utils/src/comparearrays.js"),c=o("./packages/ckeditor5-engine/src/model/operation/utils.js");class l extends i.a{constructor(e,t,o,i){super(i),this.sourcePosition=e.clone(),this.sourcePosition.stickiness="toNext",this.howMany=t,this.targetPosition=o.clone(),this.targetPosition.stickiness="toNone"}get type(){return"$graveyard"==this.targetPosition.root.rootName?"remove":"$graveyard"==this.sourcePosition.root.rootName?"reinsert":"move"}clone(){return new this.constructor(this.sourcePosition,this.howMany,this.targetPosition,this.baseVersion)}getMovedRangeStart(){return this.targetPosition._getTransformedByDeletion(this.sourcePosition,this.howMany)}getReversed(){const e=this.sourcePosition._getTransformedByInsertion(this.targetPosition,this.howMany);return new this.constructor(this.getMovedRangeStart(),this.howMany,e,this.baseVersion+1)}_validate(){const e=this.sourcePosition.parent,t=this.targetPosition.parent,o=this.sourcePosition.offset,i=this.targetPosition.offset;if(o+this.howMany>e.maxOffset)throw new n.a("move-operation-nodes-do-not-exist",this);if(e===t&&o<i&&i<o+this.howMany)throw new n.a("move-operation-range-into-itself",this);if(this.sourcePosition.root==this.targetPosition.root&&"prefix"==Object(a.a)(this.sourcePosition.getParentPath(),this.targetPosition.getParentPath())){const e=this.sourcePosition.path.length-1;if(this.targetPosition.path[e]>=o&&this.targetPosition.path[e]<o+this.howMany)throw new n.a("move-operation-node-into-itself",this)}}_execute(){Object(c.b)(r.a._createFromPositionAndShift(this.sourcePosition,this.howMany),this.targetPosition)}toJSON(){const e=super.toJSON();return e.sourcePosition=this.sourcePosition.toJSON(),e.targetPosition=this.targetPosition.toJSON(),e}static get className(){return"MoveOperation"}static fromJSON(e,t){const o=s.a.fromJSON(e.sourcePosition,t),i=s.a.fromJSON(e.targetPosition,t);return new this(o,e.howMany,i,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/nooperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js");class s extends i.a{get type(){return"noop"}clone(){return new s(this.baseVersion)}getReversed(){return new s(this.baseVersion+1)}_execute(){}static get className(){return"NoOperation"}}},"./packages/ckeditor5-engine/src/model/operation/operation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return i}));class i{constructor(e){this.baseVersion=e,this.isDocumentOperation=null!==this.baseVersion,this.batch=null}_validate(){}toJSON(){const e=Object.assign({},this);return e.__className=this.constructor.className,delete e.batch,delete e.isDocumentOperation,e}static get className(){return"Operation"}static fromJSON(e){return new this(e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/operationfactory.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return g}));var i=o("./packages/ckeditor5-engine/src/model/operation/attributeoperation.js"),s=o("./packages/ckeditor5-engine/src/model/operation/insertoperation.js"),r=o("./packages/ckeditor5-engine/src/model/operation/markeroperation.js"),n=o("./packages/ckeditor5-engine/src/model/operation/moveoperation.js"),a=o("./packages/ckeditor5-engine/src/model/operation/nooperation.js"),c=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),l=o("./packages/ckeditor5-engine/src/model/operation/renameoperation.js"),d=o("./packages/ckeditor5-engine/src/model/operation/rootattributeoperation.js"),u=o("./packages/ckeditor5-engine/src/model/operation/splitoperation.js"),h=o("./packages/ckeditor5-engine/src/model/operation/mergeoperation.js");const p={};p[i.a.className]=i.a,p[s.a.className]=s.a,p[r.a.className]=r.a,p[n.a.className]=n.a,p[a.a.className]=a.a,p[c.a.className]=c.a,p[l.a.className]=l.a,p[d.a.className]=d.a,p[u.a.className]=u.a,p[h.a.className]=h.a;class g{static fromJSON(e,t){return p[e.__className].fromJSON(e,t)}}},"./packages/ckeditor5-engine/src/model/operation/renameoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),s=o("./packages/ckeditor5-engine/src/model/element.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-engine/src/model/position.js");class a extends i.a{constructor(e,t,o,i){super(i),this.position=e,this.position.stickiness="toNext",this.oldName=t,this.newName=o}get type(){return"rename"}clone(){return new a(this.position.clone(),this.oldName,this.newName,this.baseVersion)}getReversed(){return new a(this.position.clone(),this.newName,this.oldName,this.baseVersion+1)}_validate(){const e=this.position.nodeAfter;if(!(e instanceof s.a))throw new r.a("rename-operation-wrong-position",this);if(e.name!==this.oldName)throw new r.a("rename-operation-wrong-name",this)}_execute(){this.position.nodeAfter.name=this.newName}toJSON(){const e=super.toJSON();return e.position=this.position.toJSON(),e}static get className(){return"RenameOperation"}static fromJSON(e,t){return new a(n.a.fromJSON(e.position,t),e.oldName,e.newName,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/rootattributeoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class r extends i.a{constructor(e,t,o,i,s){super(s),this.root=e,this.key=t,this.oldValue=o,this.newValue=i}get type(){return null===this.oldValue?"addRootAttribute":null===this.newValue?"removeRootAttribute":"changeRootAttribute"}clone(){return new r(this.root,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new r(this.root,this.key,this.newValue,this.oldValue,this.baseVersion+1)}_validate(){if(this.root!=this.root.root||this.root.is("documentFragment"))throw new s.a("rootattribute-operation-not-a-root",this,{root:this.root,key:this.key});if(null!==this.oldValue&&this.root.getAttribute(this.key)!==this.oldValue)throw new s.a("rootattribute-operation-wrong-old-value",this,{root:this.root,key:this.key});if(null===this.oldValue&&null!==this.newValue&&this.root.hasAttribute(this.key))throw new s.a("rootattribute-operation-attribute-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 e=super.toJSON();return e.root=this.root.toJSON(),e}static get className(){return"RootAttributeOperation"}static fromJSON(e,t){if(!t.getRoot(e.root))throw new s.a("rootattribute-operation-fromjson-no-root",this,{rootName:e.root});return new r(t.getRoot(e.root),e.key,e.oldValue,e.newValue,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/splitoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return l}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),s=o("./packages/ckeditor5-engine/src/model/operation/mergeoperation.js"),r=o("./packages/ckeditor5-engine/src/model/position.js"),n=o("./packages/ckeditor5-engine/src/model/range.js"),a=o("./packages/ckeditor5-engine/src/model/operation/utils.js"),c=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class l extends i.a{constructor(e,t,o,i,s){super(s),this.splitPosition=e.clone(),this.splitPosition.stickiness="toNext",this.howMany=t,this.insertionPosition=o,this.graveyardPosition=i?i.clone():null,this.graveyardPosition&&(this.graveyardPosition.stickiness="toNext")}get type(){return"split"}get moveTargetPosition(){const e=this.insertionPosition.path.slice();return e.push(0),new r.a(this.insertionPosition.root,e)}get movedRange(){const e=this.splitPosition.getShiftedBy(Number.POSITIVE_INFINITY);return new n.a(this.splitPosition,e)}clone(){return new this.constructor(this.splitPosition,this.howMany,this.insertionPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const e=this.splitPosition.root.document.graveyard,t=new r.a(e,[0]);return new s.a(this.moveTargetPosition,this.howMany,this.splitPosition,t,this.baseVersion+1)}_validate(){const e=this.splitPosition.parent,t=this.splitPosition.offset;if(!e||e.maxOffset<t)throw new c.a("split-operation-position-invalid",this);if(!e.parent)throw new c.a("split-operation-split-in-root",this);if(this.howMany!=e.maxOffset-this.splitPosition.offset)throw new c.a("split-operation-how-many-invalid",this);if(this.graveyardPosition&&!this.graveyardPosition.nodeAfter)throw new c.a("split-operation-graveyard-position-invalid",this)}_execute(){const e=this.splitPosition.parent;if(this.graveyardPosition)Object(a.b)(n.a._createFromPositionAndShift(this.graveyardPosition,1),this.insertionPosition);else{const t=e._clone();Object(a.a)(this.insertionPosition,t)}const t=new n.a(r.a._createAt(e,this.splitPosition.offset),r.a._createAt(e,e.maxOffset));Object(a.b)(t,this.moveTargetPosition)}toJSON(){const e=super.toJSON();return e.splitPosition=this.splitPosition.toJSON(),e.insertionPosition=this.insertionPosition.toJSON(),this.graveyardPosition&&(e.graveyardPosition=this.graveyardPosition.toJSON()),e}static get className(){return"SplitOperation"}static getInsertionPosition(e){const t=e.path.slice(0,-1);return t[t.length-1]++,new r.a(e.root,t,"toPrevious")}static fromJSON(e,t){const o=r.a.fromJSON(e.splitPosition,t),i=r.a.fromJSON(e.insertionPosition,t),s=e.graveyardPosition?r.a.fromJSON(e.graveyardPosition,t):null;return new this(o,e.howMany,i,s,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/transform.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return _}));var i=o("./packages/ckeditor5-engine/src/model/operation/insertoperation.js"),s=o("./packages/ckeditor5-engine/src/model/operation/attributeoperation.js"),r=o("./packages/ckeditor5-engine/src/model/operation/renameoperation.js"),n=o("./packages/ckeditor5-engine/src/model/operation/markeroperation.js"),a=o("./packages/ckeditor5-engine/src/model/operation/moveoperation.js"),c=o("./packages/ckeditor5-engine/src/model/operation/rootattributeoperation.js"),l=o("./packages/ckeditor5-engine/src/model/operation/mergeoperation.js"),d=o("./packages/ckeditor5-engine/src/model/operation/splitoperation.js"),u=o("./packages/ckeditor5-engine/src/model/operation/nooperation.js"),h=o("./packages/ckeditor5-engine/src/model/range.js"),p=o("./packages/ckeditor5-engine/src/model/position.js"),g=o("./packages/ckeditor5-utils/src/comparearrays.js");const f=new Map;function m(e,t,o){let i=f.get(e);i||(i=new Map,f.set(e,i)),i.set(t,o)}function k(e){return[e]}function b(e,t,o={}){const i=function(e,t){const o=f.get(e);return o&&o.has(t)?o.get(t):k}(e.constructor,t.constructor);try{return i(e=e.clone(),t,o)}catch(e){throw e}}function _(e,t,o){e=e.slice(),t=t.slice();const i=new w(o.document,o.useRelations,o.forceWeakRemove);i.setOriginalOperations(e),i.setOriginalOperations(t);const s=i.originalOperations;if(0==e.length||0==t.length)return{operationsA:e,operationsB:t,originalOperations:s};const r=new WeakMap;for(const t of e)r.set(t,0);const n={nextBaseVersionA:e[e.length-1].baseVersion+1,nextBaseVersionB:t[t.length-1].baseVersion+1,originalOperationsACount:e.length,originalOperationsBCount:t.length};let a=0;for(;a<e.length;){const o=e[a],s=r.get(o);if(s==t.length){a++;continue}const n=t[s],c=b(o,n,i.getContext(o,n,!0)),l=b(n,o,i.getContext(n,o,!1));i.updateRelation(o,n),i.setOriginalOperations(c,o),i.setOriginalOperations(l,n);for(const e of c)r.set(e,s+l.length);e.splice(a,1,...c),t.splice(s,1,...l)}if(o.padWithNoOps){const o=e.length-n.originalOperationsACount,i=t.length-n.originalOperationsBCount;y(e,i-o),y(t,o-i)}return v(e,n.nextBaseVersionB),v(t,n.nextBaseVersionA),{operationsA:e,operationsB:t,originalOperations:s}}class w{constructor(e,t,o=!1){this.originalOperations=new Map,this._history=e.history,this._useRelations=t,this._forceWeakRemove=!!o,this._relations=new Map}setOriginalOperations(e,t=null){const o=t?this.originalOperations.get(t):null;for(const t of e)this.originalOperations.set(t,o||t)}updateRelation(e,t){switch(e.constructor){case a.a:switch(t.constructor){case l.a:e.targetPosition.isEqual(t.sourcePosition)||t.movedRange.containsPosition(e.targetPosition)?this._setRelation(e,t,"insertAtSource"):e.targetPosition.isEqual(t.deletionPosition)?this._setRelation(e,t,"insertBetween"):e.targetPosition.isAfter(t.sourcePosition)&&this._setRelation(e,t,"moveTargetAfter");break;case a.a:e.targetPosition.isEqual(t.sourcePosition)||e.targetPosition.isBefore(t.sourcePosition)?this._setRelation(e,t,"insertBefore"):this._setRelation(e,t,"insertAfter")}break;case d.a:switch(t.constructor){case l.a:e.splitPosition.isBefore(t.sourcePosition)&&this._setRelation(e,t,"splitBefore");break;case a.a:if(e.splitPosition.isEqual(t.sourcePosition)||e.splitPosition.isBefore(t.sourcePosition))this._setRelation(e,t,"splitBefore");else{const o=h.a._createFromPositionAndShift(t.sourcePosition,t.howMany);if(e.splitPosition.hasSameParentAs(t.sourcePosition)&&o.containsPosition(e.splitPosition)){const i=o.end.offset-e.splitPosition.offset,s=e.splitPosition.offset-o.start.offset;this._setRelation(e,t,{howMany:i,offset:s})}}}break;case l.a:switch(t.constructor){case l.a:e.targetPosition.isEqual(t.sourcePosition)||this._setRelation(e,t,"mergeTargetNotMoved"),e.sourcePosition.isEqual(t.targetPosition)&&this._setRelation(e,t,"mergeSourceNotMoved"),e.sourcePosition.isEqual(t.sourcePosition)&&this._setRelation(e,t,"mergeSameElement");break;case d.a:e.sourcePosition.isEqual(t.splitPosition)&&this._setRelation(e,t,"splitAtSource")}break;case n.a:{const o=e.newRange;if(!o)return;switch(t.constructor){case a.a:{const i=h.a._createFromPositionAndShift(t.sourcePosition,t.howMany),s=i.containsPosition(o.start)||i.start.isEqual(o.start),r=i.containsPosition(o.end)||i.end.isEqual(o.end);!s&&!r||i.containsRange(o)||this._setRelation(e,t,{side:s?"left":"right",path:s?o.start.path.slice():o.end.path.slice()});break}case l.a:{const i=o.start.isEqual(t.targetPosition),s=o.start.isEqual(t.deletionPosition),r=o.end.isEqual(t.deletionPosition),n=o.end.isEqual(t.sourcePosition);(i||s||r||n)&&this._setRelation(e,t,{wasInLeftElement:i,wasStartBeforeMergedElement:s,wasEndBeforeMergedElement:r,wasInRightElement:n});break}}break}}}getContext(e,t,o){return{aIsStrong:o,aWasUndone:this._wasUndone(e),bWasUndone:this._wasUndone(t),abRelation:this._useRelations?this._getRelation(e,t):null,baRelation:this._useRelations?this._getRelation(t,e):null,forceWeakRemove:this._forceWeakRemove}}_wasUndone(e){const t=this.originalOperations.get(e);return t.wasUndone||this._history.isUndoneOperation(t)}_getRelation(e,t){const o=this.originalOperations.get(t),i=this._history.getUndoneOperation(o);if(!i)return null;const s=this.originalOperations.get(e),r=this._relations.get(s);return r&&r.get(i)||null}_setRelation(e,t,o){const i=this.originalOperations.get(e),s=this.originalOperations.get(t);let r=this._relations.get(i);r||(r=new Map,this._relations.set(i,r)),r.set(s,o)}}function v(e,t){for(const o of e)o.baseVersion=t++}function y(e,t){for(let o=0;o<t;o++)e.push(new u.a(0))}function j(e,t,o){const i=e.nodes.getNode(0).getAttribute(t);if(i==o)return null;const r=new h.a(e.position,e.position.getShiftedBy(e.howMany));return new s.a(r,t,i,o,0)}function x(e,t){return null===e.targetPosition._getTransformedByDeletion(t.sourcePosition,t.howMany)}function P(e,t){const o=[];for(let i=0;i<e.length;i++){const s=e[i],r=new a.a(s.start,s.end.offset-s.start.offset,t,0);o.push(r);for(let t=i+1;t<e.length;t++)e[t]=e[t]._getTransformedByMove(r.sourcePosition,r.targetPosition,r.howMany)[0];t=t._getTransformedByMove(r.sourcePosition,r.targetPosition,r.howMany)}return o}m(s.a,s.a,(e,t,o)=>{if(e.key===t.key&&e.range.start.hasSameParentAs(t.range.start)){const i=e.range.getDifference(t.range).map(t=>new s.a(t,e.key,e.oldValue,e.newValue,0)),r=e.range.getIntersection(t.range);return r&&o.aIsStrong&&i.push(new s.a(r,t.key,t.newValue,e.newValue,0)),0==i.length?[new u.a(0)]:i}return[e]}),m(s.a,i.a,(e,t)=>{if(e.range.start.hasSameParentAs(t.position)&&e.range.containsPosition(t.position)){const o=e.range._getTransformedByInsertion(t.position,t.howMany,!t.shouldReceiveAttributes).map(t=>new s.a(t,e.key,e.oldValue,e.newValue,e.baseVersion));if(t.shouldReceiveAttributes){const i=j(t,e.key,e.oldValue);i&&o.unshift(i)}return o}return e.range=e.range._getTransformedByInsertion(t.position,t.howMany,!1)[0],[e]}),m(s.a,l.a,(e,t)=>{const o=[];e.range.start.hasSameParentAs(t.deletionPosition)&&(e.range.containsPosition(t.deletionPosition)||e.range.start.isEqual(t.deletionPosition))&&o.push(h.a._createFromPositionAndShift(t.graveyardPosition,1));const i=e.range._getTransformedByMergeOperation(t);return i.isCollapsed||o.push(i),o.map(t=>new s.a(t,e.key,e.oldValue,e.newValue,e.baseVersion))}),m(s.a,a.a,(e,t)=>function(e,t){const o=h.a._createFromPositionAndShift(t.sourcePosition,t.howMany);let i=null,s=[];o.containsRange(e,!0)?i=e:e.start.hasSameParentAs(o.start)?(s=e.getDifference(o),i=e.getIntersection(o)):s=[e];const r=[];for(let e of s){e=e._getTransformedByDeletion(t.sourcePosition,t.howMany);const o=t.getMovedRangeStart(),i=e.start.hasSameParentAs(o);e=e._getTransformedByInsertion(o,t.howMany,i),r.push(...e)}i&&r.push(i._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany,!1)[0]);return r}(e.range,t).map(t=>new s.a(t,e.key,e.oldValue,e.newValue,e.baseVersion))),m(s.a,d.a,(e,t)=>{if(e.range.end.isEqual(t.insertionPosition))return t.graveyardPosition||e.range.end.offset++,[e];if(e.range.start.hasSameParentAs(t.splitPosition)&&e.range.containsPosition(t.splitPosition)){const o=e.clone();return o.range=new h.a(t.moveTargetPosition.clone(),e.range.end._getCombined(t.splitPosition,t.moveTargetPosition)),e.range.end=t.splitPosition.clone(),e.range.end.stickiness="toPrevious",[e,o]}return e.range=e.range._getTransformedBySplitOperation(t),[e]}),m(i.a,s.a,(e,t)=>{const o=[e];if(e.shouldReceiveAttributes&&e.position.hasSameParentAs(t.range.start)&&t.range.containsPosition(e.position)){const i=j(e,t.key,t.newValue);i&&o.push(i)}return o}),m(i.a,i.a,(e,t,o)=>(e.position.isEqual(t.position)&&o.aIsStrong||(e.position=e.position._getTransformedByInsertOperation(t)),[e])),m(i.a,a.a,(e,t)=>(e.position=e.position._getTransformedByMoveOperation(t),[e])),m(i.a,d.a,(e,t)=>(e.position=e.position._getTransformedBySplitOperation(t),[e])),m(i.a,l.a,(e,t)=>(e.position=e.position._getTransformedByMergeOperation(t),[e])),m(n.a,i.a,(e,t)=>(e.oldRange&&(e.oldRange=e.oldRange._getTransformedByInsertOperation(t)[0]),e.newRange&&(e.newRange=e.newRange._getTransformedByInsertOperation(t)[0]),[e])),m(n.a,n.a,(e,t,o)=>{if(e.name==t.name){if(!o.aIsStrong)return[new u.a(0)];e.oldRange=t.newRange?t.newRange.clone():null}return[e]}),m(n.a,l.a,(e,t)=>(e.oldRange&&(e.oldRange=e.oldRange._getTransformedByMergeOperation(t)),e.newRange&&(e.newRange=e.newRange._getTransformedByMergeOperation(t)),[e])),m(n.a,a.a,(e,t,o)=>{if(e.oldRange&&(e.oldRange=h.a._createFromRanges(e.oldRange._getTransformedByMoveOperation(t))),e.newRange){if(o.abRelation){const i=h.a._createFromRanges(e.newRange._getTransformedByMoveOperation(t));if("left"==o.abRelation.side&&t.targetPosition.isEqual(e.newRange.start))return e.newRange.start.path=o.abRelation.path,e.newRange.end=i.end,[e];if("right"==o.abRelation.side&&t.targetPosition.isEqual(e.newRange.end))return e.newRange.start=i.start,e.newRange.end.path=o.abRelation.path,[e]}e.newRange=h.a._createFromRanges(e.newRange._getTransformedByMoveOperation(t))}return[e]}),m(n.a,d.a,(e,t,o)=>{if(e.oldRange&&(e.oldRange=e.oldRange._getTransformedBySplitOperation(t)),e.newRange){if(o.abRelation){const i=e.newRange._getTransformedBySplitOperation(t);return e.newRange.start.isEqual(t.splitPosition)&&o.abRelation.wasStartBeforeMergedElement?e.newRange.start=p.a._createAt(t.insertionPosition):e.newRange.start.isEqual(t.splitPosition)&&!o.abRelation.wasInLeftElement&&(e.newRange.start=p.a._createAt(t.moveTargetPosition)),e.newRange.end.isEqual(t.splitPosition)&&o.abRelation.wasInRightElement?e.newRange.end=p.a._createAt(t.moveTargetPosition):e.newRange.end.isEqual(t.splitPosition)&&o.abRelation.wasEndBeforeMergedElement?e.newRange.end=p.a._createAt(t.insertionPosition):e.newRange.end=i.end,[e]}e.newRange=e.newRange._getTransformedBySplitOperation(t)}return[e]}),m(l.a,i.a,(e,t)=>(e.sourcePosition.hasSameParentAs(t.position)&&(e.howMany+=t.howMany),e.sourcePosition=e.sourcePosition._getTransformedByInsertOperation(t),e.targetPosition=e.targetPosition._getTransformedByInsertOperation(t),[e])),m(l.a,l.a,(e,t,o)=>{if(e.sourcePosition.isEqual(t.sourcePosition)&&e.targetPosition.isEqual(t.targetPosition)){if(o.bWasUndone){const o=t.graveyardPosition.path.slice();return o.push(0),e.sourcePosition=new p.a(t.graveyardPosition.root,o),e.howMany=0,[e]}return[new u.a(0)]}if(e.sourcePosition.isEqual(t.sourcePosition)&&!e.targetPosition.isEqual(t.targetPosition)&&!o.bWasUndone&&"splitAtSource"!=o.abRelation){const i="$graveyard"==e.targetPosition.root.rootName,s="$graveyard"==t.targetPosition.root.rootName,r=i&&!s;if(s&&!i||!r&&o.aIsStrong){const o=t.targetPosition._getTransformedByMergeOperation(t),i=e.targetPosition._getTransformedByMergeOperation(t);return[new a.a(o,e.howMany,i,0)]}return[new u.a(0)]}return e.sourcePosition.hasSameParentAs(t.targetPosition)&&(e.howMany+=t.howMany),e.sourcePosition=e.sourcePosition._getTransformedByMergeOperation(t),e.targetPosition=e.targetPosition._getTransformedByMergeOperation(t),e.graveyardPosition.isEqual(t.graveyardPosition)&&o.aIsStrong||(e.graveyardPosition=e.graveyardPosition._getTransformedByMergeOperation(t)),[e]}),m(l.a,a.a,(e,t,o)=>{const i=h.a._createFromPositionAndShift(t.sourcePosition,t.howMany);return"remove"==t.type&&!o.bWasUndone&&!o.forceWeakRemove&&e.deletionPosition.hasSameParentAs(t.sourcePosition)&&i.containsPosition(e.sourcePosition)?[new u.a(0)]:(e.sourcePosition.hasSameParentAs(t.targetPosition)&&(e.howMany+=t.howMany),e.sourcePosition.hasSameParentAs(t.sourcePosition)&&(e.howMany-=t.howMany),e.sourcePosition=e.sourcePosition._getTransformedByMoveOperation(t),e.targetPosition=e.targetPosition._getTransformedByMoveOperation(t),e.graveyardPosition.isEqual(t.targetPosition)||(e.graveyardPosition=e.graveyardPosition._getTransformedByMoveOperation(t)),[e])}),m(l.a,d.a,(e,t,o)=>{if(t.graveyardPosition&&(e.graveyardPosition=e.graveyardPosition._getTransformedByDeletion(t.graveyardPosition,1),e.deletionPosition.isEqual(t.graveyardPosition)&&(e.howMany=t.howMany)),e.targetPosition.isEqual(t.splitPosition)){const i=0!=t.howMany,s=t.graveyardPosition&&e.deletionPosition.isEqual(t.graveyardPosition);if(i||s||"mergeTargetNotMoved"==o.abRelation)return e.sourcePosition=e.sourcePosition._getTransformedBySplitOperation(t),[e]}if(e.sourcePosition.isEqual(t.splitPosition)){if("mergeSourceNotMoved"==o.abRelation)return e.howMany=0,e.targetPosition=e.targetPosition._getTransformedBySplitOperation(t),[e];if("mergeSameElement"==o.abRelation||e.sourcePosition.offset>0)return e.sourcePosition=t.moveTargetPosition.clone(),e.targetPosition=e.targetPosition._getTransformedBySplitOperation(t),[e]}return e.sourcePosition.hasSameParentAs(t.splitPosition)&&(e.howMany=t.splitPosition.offset),e.sourcePosition=e.sourcePosition._getTransformedBySplitOperation(t),e.targetPosition=e.targetPosition._getTransformedBySplitOperation(t),[e]}),m(a.a,i.a,(e,t)=>{const o=h.a._createFromPositionAndShift(e.sourcePosition,e.howMany)._getTransformedByInsertOperation(t,!1)[0];return e.sourcePosition=o.start,e.howMany=o.end.offset-o.start.offset,e.targetPosition.isEqual(t.position)||(e.targetPosition=e.targetPosition._getTransformedByInsertOperation(t)),[e]}),m(a.a,a.a,(e,t,o)=>{const i=h.a._createFromPositionAndShift(e.sourcePosition,e.howMany),s=h.a._createFromPositionAndShift(t.sourcePosition,t.howMany);let r,n=o.aIsStrong,a=!o.aIsStrong;if("insertBefore"==o.abRelation||"insertAfter"==o.baRelation?a=!0:"insertAfter"!=o.abRelation&&"insertBefore"!=o.baRelation||(a=!1),r=e.targetPosition.isEqual(t.targetPosition)&&a?e.targetPosition._getTransformedByDeletion(t.sourcePosition,t.howMany):e.targetPosition._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany),x(e,t)&&x(t,e))return[t.getReversed()];if(i.containsPosition(t.targetPosition)&&i.containsRange(s,!0))return i.start=i.start._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany),i.end=i.end._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany),P([i],r);if(s.containsPosition(e.targetPosition)&&s.containsRange(i,!0))return i.start=i.start._getCombined(t.sourcePosition,t.getMovedRangeStart()),i.end=i.end._getCombined(t.sourcePosition,t.getMovedRangeStart()),P([i],r);const c=Object(g.a)(e.sourcePosition.getParentPath(),t.sourcePosition.getParentPath());if("prefix"==c||"extension"==c)return i.start=i.start._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany),i.end=i.end._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany),P([i],r);"remove"!=e.type||"remove"==t.type||o.aWasUndone||o.forceWeakRemove?"remove"==e.type||"remove"!=t.type||o.bWasUndone||o.forceWeakRemove||(n=!1):n=!0;const l=[],d=i.getDifference(s);for(const e of d){e.start=e.start._getTransformedByDeletion(t.sourcePosition,t.howMany),e.end=e.end._getTransformedByDeletion(t.sourcePosition,t.howMany);const o="same"==Object(g.a)(e.start.getParentPath(),t.getMovedRangeStart().getParentPath()),i=e._getTransformedByInsertion(t.getMovedRangeStart(),t.howMany,o);l.push(...i)}const p=i.getIntersection(s);return null!==p&&n&&(p.start=p.start._getCombined(t.sourcePosition,t.getMovedRangeStart()),p.end=p.end._getCombined(t.sourcePosition,t.getMovedRangeStart()),0===l.length?l.push(p):1==l.length?s.start.isBefore(i.start)||s.start.isEqual(i.start)?l.unshift(p):l.push(p):l.splice(1,0,p)),0===l.length?[new u.a(e.baseVersion)]:P(l,r)}),m(a.a,d.a,(e,t,o)=>{let i=e.targetPosition.clone();e.targetPosition.isEqual(t.insertionPosition)&&t.graveyardPosition&&"moveTargetAfter"!=o.abRelation||(i=e.targetPosition._getTransformedBySplitOperation(t));const s=h.a._createFromPositionAndShift(e.sourcePosition,e.howMany);if(s.end.isEqual(t.insertionPosition))return t.graveyardPosition||e.howMany++,e.targetPosition=i,[e];if(s.start.hasSameParentAs(t.splitPosition)&&s.containsPosition(t.splitPosition)){let e=new h.a(t.splitPosition,s.end);e=e._getTransformedBySplitOperation(t);return P([new h.a(s.start,t.splitPosition),e],i)}e.targetPosition.isEqual(t.splitPosition)&&"insertAtSource"==o.abRelation&&(i=t.moveTargetPosition),e.targetPosition.isEqual(t.insertionPosition)&&"insertBetween"==o.abRelation&&(i=e.targetPosition);const r=[s._getTransformedBySplitOperation(t)];if(t.graveyardPosition){const i=s.start.isEqual(t.graveyardPosition)||s.containsPosition(t.graveyardPosition);e.howMany>1&&i&&!o.aWasUndone&&r.push(h.a._createFromPositionAndShift(t.insertionPosition,1))}return P(r,i)}),m(a.a,l.a,(e,t,o)=>{const i=h.a._createFromPositionAndShift(e.sourcePosition,e.howMany);if(t.deletionPosition.hasSameParentAs(e.sourcePosition)&&i.containsPosition(t.sourcePosition))if("remove"!=e.type||o.forceWeakRemove){if(1==e.howMany)return o.bWasUndone?(e.sourcePosition=t.graveyardPosition.clone(),e.targetPosition=e.targetPosition._getTransformedByMergeOperation(t),[e]):[new u.a(0)]}else if(!o.aWasUndone){const o=[];let i=t.graveyardPosition.clone(),s=t.targetPosition._getTransformedByMergeOperation(t);e.howMany>1&&(o.push(new a.a(e.sourcePosition,e.howMany-1,e.targetPosition,0)),i=i._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany-1),s=s._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany-1));const r=t.deletionPosition._getCombined(e.sourcePosition,e.targetPosition),n=new a.a(i,1,r,0),c=n.getMovedRangeStart().path.slice();c.push(0);const l=new p.a(n.targetPosition.root,c);s=s._getTransformedByMove(i,r,1);const d=new a.a(s,t.howMany,l,0);return o.push(n),o.push(d),o}const s=h.a._createFromPositionAndShift(e.sourcePosition,e.howMany)._getTransformedByMergeOperation(t);return e.sourcePosition=s.start,e.howMany=s.end.offset-s.start.offset,e.targetPosition=e.targetPosition._getTransformedByMergeOperation(t),[e]}),m(r.a,i.a,(e,t)=>(e.position=e.position._getTransformedByInsertOperation(t),[e])),m(r.a,l.a,(e,t)=>e.position.isEqual(t.deletionPosition)?(e.position=t.graveyardPosition.clone(),e.position.stickiness="toNext",[e]):(e.position=e.position._getTransformedByMergeOperation(t),[e])),m(r.a,a.a,(e,t)=>(e.position=e.position._getTransformedByMoveOperation(t),[e])),m(r.a,r.a,(e,t,o)=>{if(e.position.isEqual(t.position)){if(!o.aIsStrong)return[new u.a(0)];e.oldName=t.newName}return[e]}),m(r.a,d.a,(e,t)=>{const o=e.position.path,i=t.splitPosition.getParentPath();if("same"==Object(g.a)(o,i)&&!t.graveyardPosition){const t=new r.a(e.position.getShiftedBy(1),e.oldName,e.newName,0);return[e,t]}return e.position=e.position._getTransformedBySplitOperation(t),[e]}),m(c.a,c.a,(e,t,o)=>{if(e.root===t.root&&e.key===t.key){if(!o.aIsStrong||e.newValue===t.newValue)return[new u.a(0)];e.oldValue=t.newValue}return[e]}),m(d.a,i.a,(e,t)=>(e.splitPosition.hasSameParentAs(t.position)&&e.splitPosition.offset<t.position.offset&&(e.howMany+=t.howMany),e.splitPosition=e.splitPosition._getTransformedByInsertOperation(t),e.insertionPosition=e.insertionPosition._getTransformedByInsertOperation(t),[e])),m(d.a,l.a,(e,t,o)=>{if(!e.graveyardPosition&&!o.bWasUndone&&e.splitPosition.hasSameParentAs(t.sourcePosition)){const o=t.graveyardPosition.path.slice();o.push(0);const i=new p.a(t.graveyardPosition.root,o),s=d.a.getInsertionPosition(new p.a(t.graveyardPosition.root,o)),r=new d.a(i,0,s,null,0);return e.splitPosition=e.splitPosition._getTransformedByMergeOperation(t),e.insertionPosition=d.a.getInsertionPosition(e.splitPosition),e.graveyardPosition=r.insertionPosition.clone(),e.graveyardPosition.stickiness="toNext",[r,e]}return e.splitPosition.hasSameParentAs(t.deletionPosition)&&!e.splitPosition.isAfter(t.deletionPosition)&&e.howMany--,e.splitPosition.hasSameParentAs(t.targetPosition)&&(e.howMany+=t.howMany),e.splitPosition=e.splitPosition._getTransformedByMergeOperation(t),e.insertionPosition=d.a.getInsertionPosition(e.splitPosition),e.graveyardPosition&&(e.graveyardPosition=e.graveyardPosition._getTransformedByMergeOperation(t)),[e]}),m(d.a,a.a,(e,t,o)=>{const i=h.a._createFromPositionAndShift(t.sourcePosition,t.howMany);if(e.graveyardPosition){const s=i.start.isEqual(e.graveyardPosition)||i.containsPosition(e.graveyardPosition);if(!o.bWasUndone&&s){const o=e.splitPosition._getTransformedByMoveOperation(t),i=e.graveyardPosition._getTransformedByMoveOperation(t),s=i.path.slice();s.push(0);const r=new p.a(i.root,s);return[new a.a(o,e.howMany,r,0)]}e.graveyardPosition=e.graveyardPosition._getTransformedByMoveOperation(t)}const s=e.splitPosition.isEqual(t.targetPosition);if(s&&("insertAtSource"==o.baRelation||"splitBefore"==o.abRelation))return e.howMany+=t.howMany,e.splitPosition=e.splitPosition._getTransformedByDeletion(t.sourcePosition,t.howMany),e.insertionPosition=d.a.getInsertionPosition(e.splitPosition),[e];if(s&&o.abRelation&&o.abRelation.howMany){const{howMany:t,offset:i}=o.abRelation;return e.howMany+=t,e.splitPosition=e.splitPosition.getShiftedBy(i),[e]}if(e.splitPosition.hasSameParentAs(t.sourcePosition)&&i.containsPosition(e.splitPosition)){const o=t.howMany-(e.splitPosition.offset-t.sourcePosition.offset);return e.howMany-=o,e.splitPosition.hasSameParentAs(t.targetPosition)&&e.splitPosition.offset<t.targetPosition.offset&&(e.howMany+=t.howMany),e.splitPosition=t.sourcePosition.clone(),e.insertionPosition=d.a.getInsertionPosition(e.splitPosition),[e]}return t.sourcePosition.isEqual(t.targetPosition)||(e.splitPosition.hasSameParentAs(t.sourcePosition)&&e.splitPosition.offset<=t.sourcePosition.offset&&(e.howMany-=t.howMany),e.splitPosition.hasSameParentAs(t.targetPosition)&&e.splitPosition.offset<t.targetPosition.offset&&(e.howMany+=t.howMany)),e.splitPosition.stickiness="toNone",e.splitPosition=e.splitPosition._getTransformedByMoveOperation(t),e.splitPosition.stickiness="toNext",e.graveyardPosition?e.insertionPosition=e.insertionPosition._getTransformedByMoveOperation(t):e.insertionPosition=d.a.getInsertionPosition(e.splitPosition),[e]}),m(d.a,d.a,(e,t,o)=>{if(e.splitPosition.isEqual(t.splitPosition)){if(!e.graveyardPosition&&!t.graveyardPosition)return[new u.a(0)];if(e.graveyardPosition&&t.graveyardPosition&&e.graveyardPosition.isEqual(t.graveyardPosition))return[new u.a(0)];if("splitBefore"==o.abRelation)return e.howMany=0,e.graveyardPosition=e.graveyardPosition._getTransformedBySplitOperation(t),[e]}if(e.graveyardPosition&&t.graveyardPosition&&e.graveyardPosition.isEqual(t.graveyardPosition)){const i="$graveyard"==e.splitPosition.root.rootName,s="$graveyard"==t.splitPosition.root.rootName,r=i&&!s;if(s&&!i||!r&&o.aIsStrong){const o=[];return t.howMany&&o.push(new a.a(t.moveTargetPosition,t.howMany,t.splitPosition,0)),e.howMany&&o.push(new a.a(e.splitPosition,e.howMany,e.moveTargetPosition,0)),o}return[new u.a(0)]}if(e.graveyardPosition&&(e.graveyardPosition=e.graveyardPosition._getTransformedBySplitOperation(t)),e.splitPosition.isEqual(t.insertionPosition)&&"splitBefore"==o.abRelation)return e.howMany++,[e];if(t.splitPosition.isEqual(e.insertionPosition)&&"splitBefore"==o.baRelation){const o=t.insertionPosition.path.slice();o.push(0);const i=new p.a(t.insertionPosition.root,o);return[e,new a.a(e.insertionPosition,1,i,0)]}return e.splitPosition.hasSameParentAs(t.splitPosition)&&e.splitPosition.offset<t.splitPosition.offset&&(e.howMany-=t.howMany),e.splitPosition=e.splitPosition._getTransformedBySplitOperation(t),e.insertionPosition=d.a.getInsertionPosition(e.splitPosition),[e]})},"./packages/ckeditor5-engine/src/model/operation/utils.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return d})),o.d(t,"d",(function(){return u})),o.d(t,"b",(function(){return h})),o.d(t,"e",(function(){return p})),o.d(t,"c",(function(){return g}));var i=o("./packages/ckeditor5-engine/src/model/node.js"),s=o("./packages/ckeditor5-engine/src/model/text.js"),r=o("./packages/ckeditor5-engine/src/model/textproxy.js"),n=o("./packages/ckeditor5-engine/src/model/range.js"),a=o("./packages/ckeditor5-engine/src/model/documentfragment.js"),c=o("./packages/ckeditor5-engine/src/model/nodelist.js"),l=o("./packages/ckeditor5-utils/src/ckeditorerror.js");function d(e,t){const o=(t=g(t)).reduce((e,t)=>e+t.offsetSize,0),i=e.parent;m(e);const s=e.index;return i._insertChild(s,t),f(i,s+t.length),f(i,s),new n.a(e,e.getShiftedBy(o))}function u(e){if(!e.isFlat)throw new l.a("operation-utils-remove-range-not-flat",this);const t=e.start.parent;m(e.start),m(e.end);const o=t._removeChildren(e.start.index,e.end.index-e.start.index);return f(t,e.start.index),o}function h(e,t){if(!e.isFlat)throw new l.a("operation-utils-move-range-not-flat",this);const o=u(e);return d(t=t._getTransformedByDeletion(e.start,e.end.offset-e.start.offset),o)}function p(e,t,o){m(e.start),m(e.end);for(const i of e.getItems({shallow:!0})){const e=i.is("$textProxy")?i.textNode:i;null!==o?e._setAttribute(t,o):e._removeAttribute(t),f(e.parent,e.index)}f(e.end.parent,e.end.index)}function g(e){const t=[];e instanceof Array||(e=[e]);for(let o=0;o<e.length;o++)if("string"==typeof e[o])t.push(new s.a(e[o]));else if(e[o]instanceof r.a)t.push(new s.a(e[o].data,e[o].getAttributes()));else if(e[o]instanceof a.a||e[o]instanceof c.a)for(const i of e[o])t.push(i);else e[o]instanceof i.a&&t.push(e[o]);for(let e=1;e<t.length;e++){const o=t[e],i=t[e-1];o instanceof s.a&&i instanceof s.a&&k(o,i)&&(t.splice(e-1,2,new s.a(i.data+o.data,i.getAttributes())),e--)}return t}function f(e,t){const o=e.getChild(t-1),i=e.getChild(t);if(o&&i&&o.is("$text")&&i.is("$text")&&k(o,i)){const r=new s.a(o.data+i.data,o.getAttributes());e._removeChildren(t-1,2),e._insertChild(t-1,r)}}function m(e){const t=e.textNode,o=e.parent;if(t){const i=e.offset-t.startOffset,r=t.index;o._removeChildren(r,1);const n=new s.a(t.data.substr(0,i),t.getAttributes()),a=new s.a(t.data.substr(i),t.getAttributes());o._insertChild(r,[n,a])}}function k(e,t){const o=e.getAttributes(),i=t.getAttributes();for(const e of o){if(e[1]!==t.getAttribute(e[0]))return!1;i.next()}return i.next().done}},"./packages/ckeditor5-engine/src/model/position.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return n})),o.d(t,"d",(function(){return a})),o.d(t,"b",(function(){return c})),o.d(t,"c",(function(){return l}));var i=o("./packages/ckeditor5-engine/src/model/treewalker.js"),s=o("./packages/ckeditor5-utils/src/comparearrays.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js");o("./packages/ckeditor5-utils/src/version.js");class n{constructor(e,t,o="toNone"){if(!e.is("element")&&!e.is("documentFragment"))throw new r.a("model-position-root-invalid",e);if(!(t instanceof Array)||0===t.length)throw new r.a("model-position-path-incorrect-format",e,{path:t});e.is("rootElement")?t=t.slice():(t=[...e.getPath(),...t],e=e.root),this.root=e,this.path=t,this.stickiness=o}get offset(){return this.path[this.path.length-1]}set offset(e){this.path[this.path.length-1]=e}get parent(){let e=this.root;for(let t=0;t<this.path.length-1;t++)if(e=e.getChild(e.offsetToIndex(this.path[t])),!e)throw new r.a("model-position-path-incorrect",this,{position:this});if(e.is("$text"))throw new r.a("model-position-path-incorrect",this,{position:this});return e}get index(){return this.parent.offsetToIndex(this.offset)}get textNode(){return a(this,this.parent)}get nodeAfter(){const e=this.parent;return c(this,e,a(this,e))}get nodeBefore(){const e=this.parent;return l(this,e,a(this,e))}get isAtStart(){return 0===this.offset}get isAtEnd(){return this.offset==this.parent.maxOffset}compareWith(e){if(this.root!=e.root)return"different";const t=Object(s.a)(this.path,e.path);switch(t){case"same":return"same";case"prefix":return"before";case"extension":return"after";default:return this.path[t]<e.path[t]?"before":"after"}}getLastMatchingPosition(e,t={}){t.startPosition=this;const o=new i.a(t);return o.skip(e),o.position}getParentPath(){return this.path.slice(0,-1)}getAncestors(){const e=this.parent;return e.is("documentFragment")?[e]:e.getAncestors({includeSelf:!0})}findAncestor(e){const t=this.parent;return t.is("element")?t.findAncestor(e,{includeSelf:!0}):null}getCommonPath(e){if(this.root!=e.root)return[];const t=Object(s.a)(this.path,e.path),o="string"==typeof t?Math.min(this.path.length,e.path.length):t;return this.path.slice(0,o)}getCommonAncestor(e){const t=this.getAncestors(),o=e.getAncestors();let i=0;for(;t[i]==o[i]&&t[i];)i++;return 0===i?null:t[i-1]}getShiftedBy(e){const t=this.clone(),o=t.offset+e;return t.offset=o<0?0:o,t}isAfter(e){return"after"==this.compareWith(e)}isBefore(e){return"before"==this.compareWith(e)}isEqual(e){return"same"==this.compareWith(e)}isTouching(e){let t=null,o=null;switch(this.compareWith(e)){case"same":return!0;case"before":t=n._createAt(this),o=n._createAt(e);break;case"after":t=n._createAt(e),o=n._createAt(this);break;default:return!1}let i=t.parent;for(;t.path.length+o.path.length;){if(t.isEqual(o))return!0;if(t.path.length>o.path.length){if(t.offset!==i.maxOffset)return!1;t.path=t.path.slice(0,-1),i=i.parent,t.offset++}else{if(0!==o.offset)return!1;o.path=o.path.slice(0,-1)}}}is(e){return"position"===e||"model:position"===e}hasSameParentAs(e){if(this.root!==e.root)return!1;const t=this.getParentPath(),o=e.getParentPath();return"same"==Object(s.a)(t,o)}getTransformedByOperation(e){let t;switch(e.type){case"insert":t=this._getTransformedByInsertOperation(e);break;case"move":case"remove":case"reinsert":t=this._getTransformedByMoveOperation(e);break;case"split":t=this._getTransformedBySplitOperation(e);break;case"merge":t=this._getTransformedByMergeOperation(e);break;default:t=n._createAt(this)}return t}_getTransformedByInsertOperation(e){return this._getTransformedByInsertion(e.position,e.howMany)}_getTransformedByMoveOperation(e){return this._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany)}_getTransformedBySplitOperation(e){const t=e.movedRange;return t.containsPosition(this)||t.start.isEqual(this)&&"toNext"==this.stickiness?this._getCombined(e.splitPosition,e.moveTargetPosition):e.graveyardPosition?this._getTransformedByMove(e.graveyardPosition,e.insertionPosition,1):this._getTransformedByInsertion(e.insertionPosition,1)}_getTransformedByMergeOperation(e){const t=e.movedRange;let o;return t.containsPosition(this)||t.start.isEqual(this)?(o=this._getCombined(e.sourcePosition,e.targetPosition),e.sourcePosition.isBefore(e.targetPosition)&&(o=o._getTransformedByDeletion(e.deletionPosition,1))):o=this.isEqual(e.deletionPosition)?n._createAt(e.deletionPosition):this._getTransformedByMove(e.deletionPosition,e.graveyardPosition,1),o}_getTransformedByDeletion(e,t){const o=n._createAt(this);if(this.root!=e.root)return o;if("same"==Object(s.a)(e.getParentPath(),this.getParentPath())){if(e.offset<this.offset){if(e.offset+t>this.offset)return null;o.offset-=t}}else if("prefix"==Object(s.a)(e.getParentPath(),this.getParentPath())){const i=e.path.length-1;if(e.offset<=this.path[i]){if(e.offset+t>this.path[i])return null;o.path[i]-=t}}return o}_getTransformedByInsertion(e,t){const o=n._createAt(this);if(this.root!=e.root)return o;if("same"==Object(s.a)(e.getParentPath(),this.getParentPath()))(e.offset<this.offset||e.offset==this.offset&&"toPrevious"!=this.stickiness)&&(o.offset+=t);else if("prefix"==Object(s.a)(e.getParentPath(),this.getParentPath())){const i=e.path.length-1;e.offset<=this.path[i]&&(o.path[i]+=t)}return o}_getTransformedByMove(e,t,o){if(t=t._getTransformedByDeletion(e,o),e.isEqual(t))return n._createAt(this);const i=this._getTransformedByDeletion(e,o);return null===i||e.isEqual(this)&&"toNext"==this.stickiness||e.getShiftedBy(o).isEqual(this)&&"toPrevious"==this.stickiness?this._getCombined(e,t):i._getTransformedByInsertion(t,o)}_getCombined(e,t){const o=e.path.length-1,i=n._createAt(t);return i.stickiness=this.stickiness,i.offset=i.offset+this.path[o]-e.offset,i.path=[...i.path,...this.path.slice(o+1)],i}toJSON(){return{root:this.root.toJSON(),path:Array.from(this.path),stickiness:this.stickiness}}clone(){return new this.constructor(this.root,this.path,this.stickiness)}static _createAt(e,t,o="toNone"){if(e instanceof n)return new n(e.root,e.path,e.stickiness);{const i=e;if("end"==t)t=i.maxOffset;else{if("before"==t)return this._createBefore(i,o);if("after"==t)return this._createAfter(i,o);if(0!==t&&!t)throw new r.a("model-createpositionat-offset-required",[this,e])}if(!i.is("element")&&!i.is("documentFragment"))throw new r.a("model-position-parent-incorrect",[this,e]);const s=i.getPath();return s.push(t),new this(i.root,s,o)}}static _createAfter(e,t){if(!e.parent)throw new r.a("model-position-after-root",[this,e],{root:e});return this._createAt(e.parent,e.endOffset,t)}static _createBefore(e,t){if(!e.parent)throw new r.a("model-position-before-root",e,{root:e});return this._createAt(e.parent,e.startOffset,t)}static fromJSON(e,t){if("$graveyard"===e.root){const o=new n(t.graveyard,e.path);return o.stickiness=e.stickiness,o}if(!t.getRoot(e.root))throw new r.a("model-position-fromjson-no-root",t,{rootName:e.root});return new n(t.getRoot(e.root),e.path,e.stickiness)}}function a(e,t){const o=t.getChild(t.offsetToIndex(e.offset));return o&&o.is("$text")&&o.startOffset<e.offset?o:null}function c(e,t,o){return null!==o?null:t.getChild(t.offsetToIndex(e.offset))}function l(e,t,o){return null!==o?null:t.getChild(t.offsetToIndex(e.offset)-1)}},"./packages/ckeditor5-engine/src/model/range.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-engine/src/model/position.js"),s=o("./packages/ckeditor5-engine/src/model/treewalker.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-utils/src/comparearrays.js");class a{constructor(e,t=null){this.start=i.a._createAt(e),this.end=t?i.a._createAt(t):i.a._createAt(e),this.start.stickiness=this.isCollapsed?"toNone":"toNext",this.end.stickiness=this.isCollapsed?"toNone":"toPrevious"}*[Symbol.iterator](){yield*new s.a({boundaries:this,ignoreElementEnd:!0})}get isCollapsed(){return this.start.isEqual(this.end)}get isFlat(){const e=this.start.getParentPath(),t=this.end.getParentPath();return"same"==Object(n.a)(e,t)}get root(){return this.start.root}containsPosition(e){return e.isAfter(this.start)&&e.isBefore(this.end)}containsRange(e,t=!1){e.isCollapsed&&(t=!1);const o=this.containsPosition(e.start)||t&&this.start.isEqual(e.start),i=this.containsPosition(e.end)||t&&this.end.isEqual(e.end);return o&&i}containsItem(e){const t=i.a._createBefore(e);return this.containsPosition(t)||this.start.isEqual(t)}is(e){return"range"===e||"model:range"===e}isEqual(e){return this.start.isEqual(e.start)&&this.end.isEqual(e.end)}isIntersecting(e){return this.start.isBefore(e.end)&&this.end.isAfter(e.start)}getDifference(e){const t=[];return this.isIntersecting(e)?(this.containsPosition(e.start)&&t.push(new a(this.start,e.start)),this.containsPosition(e.end)&&t.push(new a(e.end,this.end))):t.push(new a(this.start,this.end)),t}getIntersection(e){if(this.isIntersecting(e)){let t=this.start,o=this.end;return this.containsPosition(e.start)&&(t=e.start),this.containsPosition(e.end)&&(o=e.end),new a(t,o)}return null}getJoined(e,t=!1){let o=this.isIntersecting(e);if(o||(o=this.start.isBefore(e.start)?t?this.end.isTouching(e.start):this.end.isEqual(e.start):t?e.end.isTouching(this.start):e.end.isEqual(this.start)),!o)return null;let i=this.start,s=this.end;return e.start.isBefore(i)&&(i=e.start),e.end.isAfter(s)&&(s=e.end),new a(i,s)}getMinimalFlatRanges(){const e=[],t=this.start.getCommonPath(this.end).length,o=i.a._createAt(this.start);let s=o.parent;for(;o.path.length>t+1;){const t=s.maxOffset-o.offset;0!==t&&e.push(new a(o,o.getShiftedBy(t))),o.path=o.path.slice(0,-1),o.offset++,s=s.parent}for(;o.path.length<=this.end.path.length;){const t=this.end.path[o.path.length-1],i=t-o.offset;0!==i&&e.push(new a(o,o.getShiftedBy(i))),o.offset=t,o.path.push(0)}return e}getWalker(e={}){return e.boundaries=this,new s.a(e)}*getItems(e={}){e.boundaries=this,e.ignoreElementEnd=!0;const t=new s.a(e);for(const e of t)yield e.item}*getPositions(e={}){e.boundaries=this;const t=new s.a(e);yield t.position;for(const e of t)yield e.nextPosition}getTransformedByOperation(e){switch(e.type){case"insert":return this._getTransformedByInsertOperation(e);case"move":case"remove":case"reinsert":return this._getTransformedByMoveOperation(e);case"split":return[this._getTransformedBySplitOperation(e)];case"merge":return[this._getTransformedByMergeOperation(e)]}return[new a(this.start,this.end)]}getTransformedByOperations(e){const t=[new a(this.start,this.end)];for(const o of e)for(let e=0;e<t.length;e++){const i=t[e].getTransformedByOperation(o);t.splice(e,1,...i),e+=i.length-1}for(let e=0;e<t.length;e++){const o=t[e];for(let i=e+1;i<t.length;i++){const e=t[i];(o.containsRange(e)||e.containsRange(o)||o.isEqual(e))&&t.splice(i,1)}}return t}getCommonAncestor(){return this.start.getCommonAncestor(this.end)}getContainedElement(){if(this.isCollapsed)return null;const e=this.start.nodeAfter,t=this.end.nodeBefore;return e&&e.is("element")&&e===t?e:null}toJSON(){return{start:this.start.toJSON(),end:this.end.toJSON()}}clone(){return new this.constructor(this.start,this.end)}_getTransformedByInsertOperation(e,t=!1){return this._getTransformedByInsertion(e.position,e.howMany,t)}_getTransformedByMoveOperation(e,t=!1){const o=e.sourcePosition,i=e.howMany,s=e.targetPosition;return this._getTransformedByMove(o,s,i,t)}_getTransformedBySplitOperation(e){const t=this.start._getTransformedBySplitOperation(e);let o=this.end._getTransformedBySplitOperation(e);return this.end.isEqual(e.insertionPosition)&&(o=this.end.getShiftedBy(1)),t.root!=o.root&&(o=this.end.getShiftedBy(-1)),new a(t,o)}_getTransformedByMergeOperation(e){if(this.start.isEqual(e.targetPosition)&&this.end.isEqual(e.deletionPosition))return new a(this.start);let t=this.start._getTransformedByMergeOperation(e),o=this.end._getTransformedByMergeOperation(e);return t.root!=o.root&&(o=this.end.getShiftedBy(-1)),t.isAfter(o)?(e.sourcePosition.isBefore(e.targetPosition)?(t=i.a._createAt(o),t.offset=0):(e.deletionPosition.isEqual(t)||(o=e.deletionPosition),t=e.targetPosition),new a(t,o)):new a(t,o)}_getTransformedByInsertion(e,t,o=!1){if(o&&this.containsPosition(e))return[new a(this.start,e),new a(e.getShiftedBy(t),this.end._getTransformedByInsertion(e,t))];{const o=new a(this.start,this.end);return o.start=o.start._getTransformedByInsertion(e,t),o.end=o.end._getTransformedByInsertion(e,t),[o]}}_getTransformedByMove(e,t,o,i=!1){if(this.isCollapsed){const i=this.start._getTransformedByMove(e,t,o);return[new a(i)]}const s=a._createFromPositionAndShift(e,o),r=t._getTransformedByDeletion(e,o);if(this.containsPosition(t)&&!i&&(s.containsPosition(this.start)||s.containsPosition(this.end))){const i=this.start._getTransformedByMove(e,t,o),s=this.end._getTransformedByMove(e,t,o);return[new a(i,s)]}let n;const c=this.getDifference(s);let l=null;const d=this.getIntersection(s);if(1==c.length?l=new a(c[0].start._getTransformedByDeletion(e,o),c[0].end._getTransformedByDeletion(e,o)):2==c.length&&(l=new a(this.start,this.end._getTransformedByDeletion(e,o))),n=l?l._getTransformedByInsertion(r,o,null!==d||i):[],d){const e=new a(d.start._getCombined(s.start,r),d.end._getCombined(s.start,r));2==n.length?n.splice(1,0,e):n.push(e)}return n}_getTransformedByDeletion(e,t){let o=this.start._getTransformedByDeletion(e,t),i=this.end._getTransformedByDeletion(e,t);return null==o&&null==i?null:(null==o&&(o=e),null==i&&(i=e),new a(o,i))}static _createFromPositionAndShift(e,t){const o=e,i=e.getShiftedBy(t);return t>0?new this(o,i):new this(i,o)}static _createIn(e){return new this(i.a._createAt(e,0),i.a._createAt(e,e.maxOffset))}static _createOn(e){return this._createFromPositionAndShift(i.a._createBefore(e),e.offsetSize)}static _createFromRanges(e){if(0===e.length)throw new r.a("range-create-from-ranges-empty-array",null);if(1==e.length)return e[0].clone();const t=e[0];e.sort((e,t)=>e.start.isAfter(t.start)?1:-1);const o=e.indexOf(t),s=new this(t.start,t.end);if(o>0)for(let t=o-1;e[t].end.isEqual(s.start);t++)s.start=i.a._createAt(e[t].start);for(let t=o+1;t<e.length&&e[t].start.isEqual(s.end);t++)s.end=i.a._createAt(e[t].end);return s}static fromJSON(e,t){return new this(i.a.fromJSON(e.start,t),i.a.fromJSON(e.end,t))}}},"./packages/ckeditor5-engine/src/model/schema.js":function(e,t,o){"use strict";o.d(t,"b",(function(){return u})),o.d(t,"a",(function(){return h}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./packages/ckeditor5-utils/src/observablemixin.js"),r=o("./packages/ckeditor5-utils/src/mix.js"),n=o("./packages/ckeditor5-engine/src/model/range.js"),a=o("./packages/ckeditor5-engine/src/model/position.js"),c=o("./packages/ckeditor5-engine/src/model/element.js"),l=o("./packages/ckeditor5-engine/src/model/text.js"),d=o("./packages/ckeditor5-engine/src/model/treewalker.js");class u{constructor(){this._sourceDefinitions={},this._attributeProperties={},this.decorate("checkChild"),this.decorate("checkAttribute"),this.on("checkAttribute",(e,t)=>{t[0]=new h(t[0])},{priority:"highest"}),this.on("checkChild",(e,t)=>{t[0]=new h(t[0]),t[1]=this.getDefinition(t[1])},{priority:"highest"})}register(e,t){if(this._sourceDefinitions[e])throw new i.a("schema-cannot-register-item-twice",this,{itemName:e});this._sourceDefinitions[e]=[Object.assign({},t)],this._clearCache()}extend(e,t){if(!this._sourceDefinitions[e])throw new i.a("schema-cannot-extend-missing-item",this,{itemName:e});this._sourceDefinitions[e].push(Object.assign({},t)),this._clearCache()}getDefinitions(){return this._compiledDefinitions||this._compile(),this._compiledDefinitions}getDefinition(e){let t;return t="string"==typeof e?e:e.is&&(e.is("$text")||e.is("$textProxy"))?"$text":e.name,this.getDefinitions()[t]}isRegistered(e){return!!this.getDefinition(e)}isBlock(e){const t=this.getDefinition(e);return!(!t||!t.isBlock)}isLimit(e){const t=this.getDefinition(e);return!!t&&!(!t.isLimit&&!t.isObject)}isObject(e){const t=this.getDefinition(e);return!!t&&!!(t.isObject||t.isLimit&&t.isSelectable&&t.isContent)}isInline(e){const t=this.getDefinition(e);return!(!t||!t.isInline)}isSelectable(e){const t=this.getDefinition(e);return!!t&&!(!t.isSelectable&&!t.isObject)}isContent(e){const t=this.getDefinition(e);return!!t&&!(!t.isContent&&!t.isObject)}checkChild(e,t){return!!t&&this._checkContextMatch(t,e)}checkAttribute(e,t){const o=this.getDefinition(e.last);return!!o&&o.allowAttributes.includes(t)}checkMerge(e,t=null){if(e instanceof a.a){const t=e.nodeBefore,o=e.nodeAfter;if(!(t instanceof c.a))throw new i.a("schema-check-merge-no-element-before",this);if(!(o instanceof c.a))throw new i.a("schema-check-merge-no-element-after",this);return this.checkMerge(t,o)}for(const o of t.getChildren())if(!this.checkChild(e,o))return!1;return!0}addChildCheck(e){this.on("checkChild",(t,[o,i])=>{if(!i)return;const s=e(o,i);"boolean"==typeof s&&(t.stop(),t.return=s)},{priority:"high"})}addAttributeCheck(e){this.on("checkAttribute",(t,[o,i])=>{const s=e(o,i);"boolean"==typeof s&&(t.stop(),t.return=s)},{priority:"high"})}setAttributeProperties(e,t){this._attributeProperties[e]=Object.assign(this.getAttributeProperties(e),t)}getAttributeProperties(e){return this._attributeProperties[e]||{}}getLimitElement(e){let t;if(e instanceof a.a)t=e.parent;else{t=(e instanceof n.a?[e]:Array.from(e.getRanges())).reduce((e,t)=>{const o=t.getCommonAncestor();return e?e.getCommonAncestor(o,{includeSelf:!0}):o},null)}for(;!this.isLimit(t)&&t.parent;)t=t.parent;return t}checkAttributeInSelection(e,t){if(e.isCollapsed){const o=[...e.getFirstPosition().getAncestors(),new l.a("",e.getAttributes())];return this.checkAttribute(o,t)}{const o=e.getRanges();for(const e of o)for(const o of e)if(this.checkAttribute(o.item,t))return!0}return!1}*getValidRanges(e,t){e=function*(e){for(const t of e)yield*t.getMinimalFlatRanges()}(e);for(const o of e)yield*this._getValidRangesForRange(o,t)}getNearestSelectionRange(e,t="both"){if(this.checkChild(e,"$text"))return new n.a(e);let o,i;const s=e.getAncestors().reverse().find(e=>this.isLimit(e))||e.root;"both"!=t&&"backward"!=t||(o=new d.a({boundaries:n.a._createIn(s),startPosition:e,direction:"backward"})),"both"!=t&&"forward"!=t||(i=new d.a({boundaries:n.a._createIn(s),startPosition:e}));for(const e of function*(e,t){let o=!1;for(;!o;){if(o=!0,e){const t=e.next();t.done||(o=!1,yield{walker:e,value:t.value})}if(t){const e=t.next();e.done||(o=!1,yield{walker:t,value:e.value})}}}(o,i)){const t=e.walker==o?"elementEnd":"elementStart",i=e.value;if(i.type==t&&this.isObject(i.item))return n.a._createOn(i.item);if(this.checkChild(i.nextPosition,"$text"))return new n.a(i.nextPosition)}return null}findAllowedParent(e,t){let o=e.parent;for(;o;){if(this.checkChild(o,t))return o;if(this.isLimit(o))return null;o=o.parent}return null}removeDisallowedAttributes(e,t){for(const o of e)if(o.is("$text"))P(this,o,t);else{const e=n.a._createIn(o).getPositions();for(const o of e){P(this,o.nodeBefore||o.parent,t)}}}createContext(e){return new h(e)}_clearCache(){this._compiledDefinitions=null}_compile(){const e={},t=this._sourceDefinitions,o=Object.keys(t);for(const i of o)e[i]=p(t[i],i);for(const t of o)g(e,t);for(const t of o)f(e,t);for(const t of o)m(e,t);for(const t of o)k(e,t),b(e,t);for(const t of o)_(e,t),w(e,t),v(e,t);this._compiledDefinitions=e}_checkContextMatch(e,t,o=t.length-1){const i=t.getItem(o);if(e.allowIn.includes(i.name)){if(0==o)return!0;{const e=this.getDefinition(i);return this._checkContextMatch(e,t,o-1)}}return!1}*_getValidRangesForRange(e,t){let o=e.start,i=e.start;for(const s of e.getItems({shallow:!0}))s.is("element")&&(yield*this._getValidRangesForRange(n.a._createIn(s),t)),this.checkAttribute(s,t)||(o.isEqual(i)||(yield new n.a(o,i)),o=a.a._createAfter(s)),i=a.a._createAfter(s);o.isEqual(i)||(yield new n.a(o,i))}}Object(r.a)(u,s.a);class h{constructor(e){if(e instanceof h)return e;"string"==typeof e?e=[e]:Array.isArray(e)||(e=e.getAncestors({includeSelf:!0})),this._items=e.map(x)}get length(){return this._items.length}get last(){return this._items[this._items.length-1]}[Symbol.iterator](){return this._items[Symbol.iterator]()}push(e){const t=new h([e]);return t._items=[...this._items,...t._items],t}getItem(e){return this._items[e]}*getNames(){yield*this._items.map(e=>e.name)}endsWith(e){return Array.from(this.getNames()).join(" ").endsWith(e)}startsWith(e){return Array.from(this.getNames()).join(" ").startsWith(e)}}function p(e,t){const o={name:t,allowIn:[],allowContentOf:[],allowWhere:[],allowAttributes:[],allowAttributesOf:[],allowChildren:[],inheritTypesFrom:[]};return function(e,t){for(const o of e){const e=Object.keys(o).filter(e=>e.startsWith("is"));for(const i of e)t[i]=o[i]}}(e,o),y(e,o,"allowIn"),y(e,o,"allowContentOf"),y(e,o,"allowWhere"),y(e,o,"allowAttributes"),y(e,o,"allowAttributesOf"),y(e,o,"allowChildren"),y(e,o,"inheritTypesFrom"),function(e,t){for(const o of e){const e=o.inheritAllFrom;e&&(t.allowContentOf.push(e),t.allowWhere.push(e),t.allowAttributesOf.push(e),t.inheritTypesFrom.push(e))}}(e,o),o}function g(e,t){const o=e[t];for(const i of o.allowChildren){const o=e[i];o&&o.allowIn.push(t)}o.allowChildren.length=0}function f(e,t){for(const o of e[t].allowContentOf)if(e[o]){j(e,o).forEach(e=>{e.allowIn.push(t)})}delete e[t].allowContentOf}function m(e,t){for(const o of e[t].allowWhere){const i=e[o];if(i){const o=i.allowIn;e[t].allowIn.push(...o)}}delete e[t].allowWhere}function k(e,t){for(const o of e[t].allowAttributesOf){const i=e[o];if(i){const o=i.allowAttributes;e[t].allowAttributes.push(...o)}}delete e[t].allowAttributesOf}function b(e,t){const o=e[t];for(const t of o.inheritTypesFrom){const i=e[t];if(i){const e=Object.keys(i).filter(e=>e.startsWith("is"));for(const t of e)t in o||(o[t]=i[t])}}delete o.inheritTypesFrom}function _(e,t){const o=e[t],i=o.allowIn.filter(t=>e[t]);o.allowIn=Array.from(new Set(i))}function w(e,t){const o=e[t];for(const i of o.allowIn){e[i].allowChildren.push(t)}}function v(e,t){const o=e[t];o.allowAttributes=Array.from(new Set(o.allowAttributes))}function y(e,t,o){for(const i of e)"string"==typeof i[o]?t[o].push(i[o]):Array.isArray(i[o])&&t[o].push(...i[o])}function j(e,t){const o=e[t];return(i=e,Object.keys(i).map(e=>i[e])).filter(e=>e.allowIn.includes(o.name));var i}function x(e){return"string"==typeof e||e.is("documentFragment")?{name:"string"==typeof e?e:"$documentFragment",*getAttributeKeys(){},getAttribute(){}}:{name:e.is("element")?e.name:"$text",*getAttributeKeys(){yield*e.getAttributeKeys()},getAttribute:t=>e.getAttribute(t)}}function P(e,t,o){for(const i of t.getAttributeKeys())e.checkAttribute(t,i)||o.removeAttribute(i,t)}},"./packages/ckeditor5-engine/src/model/selection.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return d}));var i=o("./packages/ckeditor5-engine/src/model/position.js"),s=o("./packages/ckeditor5-engine/src/model/node.js"),r=o("./packages/ckeditor5-engine/src/model/range.js"),n=o("./packages/ckeditor5-utils/src/emittermixin.js"),a=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),c=o("./packages/ckeditor5-utils/src/mix.js"),l=o("./packages/ckeditor5-utils/src/isiterable.js");class d{constructor(e,t,o){this._lastRangeBackward=!1,this._ranges=[],this._attrs=new Map,e&&this.setTo(e,t,o)}get anchor(){if(this._ranges.length>0){const e=this._ranges[this._ranges.length-1];return this._lastRangeBackward?e.end:e.start}return null}get focus(){if(this._ranges.length>0){const e=this._ranges[this._ranges.length-1];return this._lastRangeBackward?e.start:e.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(e){if(this.rangeCount!=e.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(e.anchor)||!this.focus.isEqual(e.focus))return!1;for(const t of this._ranges){let o=!1;for(const i of e._ranges)if(t.isEqual(i)){o=!0;break}if(!o)return!1}return!0}*getRanges(){for(const e of this._ranges)yield new r.a(e.start,e.end)}getFirstRange(){let e=null;for(const t of this._ranges)e&&!t.start.isBefore(e.start)||(e=t);return e?new r.a(e.start,e.end):null}getLastRange(){let e=null;for(const t of this._ranges)e&&!t.end.isAfter(e.end)||(e=t);return e?new r.a(e.start,e.end):null}getFirstPosition(){const e=this.getFirstRange();return e?e.start.clone():null}getLastPosition(){const e=this.getLastRange();return e?e.end.clone():null}setTo(e,t,o){if(null===e)this._setRanges([]);else if(e instanceof d)this._setRanges(e.getRanges(),e.isBackward);else if(e&&"function"==typeof e.getRanges)this._setRanges(e.getRanges(),e.isBackward);else if(e instanceof r.a)this._setRanges([e],!!t&&!!t.backward);else if(e instanceof i.a)this._setRanges([new r.a(e)]);else if(e instanceof s.a){const s=!!o&&!!o.backward;let n;if("in"==t)n=r.a._createIn(e);else if("on"==t)n=r.a._createOn(e);else{if(void 0===t)throw new a.a("model-selection-setto-required-second-parameter",[this,e]);n=new r.a(i.a._createAt(e,t))}this._setRanges([n],s)}else{if(!Object(l.a)(e))throw new a.a("model-selection-setto-not-selectable",[this,e]);this._setRanges(e,t&&!!t.backward)}}_setRanges(e,t=!1){const o=(e=Array.from(e)).some(t=>{if(!(t instanceof r.a))throw new a.a("model-selection-set-ranges-not-range",[this,e]);return this._ranges.every(e=>!e.isEqual(t))});if(e.length!==this._ranges.length||o){this._removeAllRanges();for(const t of e)this._pushRange(t);this._lastRangeBackward=!!t,this.fire("change:range",{directChange:!0})}}setFocus(e,t){if(null===this.anchor)throw new a.a("model-selection-setfocus-no-ranges",[this,e]);const o=i.a._createAt(e,t);if("same"==o.compareWith(this.focus))return;const s=this.anchor;this._ranges.length&&this._popRange(),"before"==o.compareWith(s)?(this._pushRange(new r.a(o,s)),this._lastRangeBackward=!0):(this._pushRange(new r.a(s,o)),this._lastRangeBackward=!1),this.fire("change:range",{directChange:!0})}getAttribute(e){return this._attrs.get(e)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}hasAttribute(e){return this._attrs.has(e)}removeAttribute(e){this.hasAttribute(e)&&(this._attrs.delete(e),this.fire("change:attribute",{attributeKeys:[e],directChange:!0}))}setAttribute(e,t){this.getAttribute(e)!==t&&(this._attrs.set(e,t),this.fire("change:attribute",{attributeKeys:[e],directChange:!0}))}getSelectedElement(){return 1!==this.rangeCount?null:this.getFirstRange().getContainedElement()}is(e){return"selection"===e||"model:selection"===e}*getSelectedBlocks(){const e=new WeakSet;for(const t of this.getRanges()){const o=p(t.start,e);o&&g(o,t)&&(yield o);for(const o of t.getWalker()){const i=o.item;"elementEnd"==o.type&&h(i,e,t)&&(yield i)}const s=p(t.end,e);s&&!t.end.isTouching(i.a._createAt(s,0))&&g(s,t)&&(yield s)}}containsEntireContent(e=this.anchor.root){const t=i.a._createAt(e,0),o=i.a._createAt(e,"end");return t.isTouching(this.getFirstPosition())&&o.isTouching(this.getLastPosition())}_pushRange(e){this._checkRange(e),this._ranges.push(new r.a(e.start,e.end))}_checkRange(e){for(let t=0;t<this._ranges.length;t++)if(e.isIntersecting(this._ranges[t]))throw new a.a("model-selection-range-intersects",[this,e],{addedRange:e,intersectingRange:this._ranges[t]})}_removeAllRanges(){for(;this._ranges.length>0;)this._popRange()}_popRange(){this._ranges.pop()}}function u(e,t){return!t.has(e)&&(t.add(e),e.root.document.model.schema.isBlock(e)&&e.parent)}function h(e,t,o){return u(e,t)&&g(e,o)}function p(e,t){const o=e.parent.root.document.model.schema,i=e.parent.getAncestors({parentFirst:!0,includeSelf:!0});let s=!1;const r=i.find(e=>!s&&(s=o.isLimit(e),!s&&u(e,t)));return i.forEach(e=>t.add(e)),r}function g(e,t){const o=function(e){const t=e.root.document.model.schema;let o=e.parent;for(;o;){if(t.isBlock(o))return o;o=o.parent}}(e);if(!o)return!0;return!t.containsRange(r.a._createOn(o),!0)}Object(c.a)(d,n.c)},"./packages/ckeditor5-engine/src/model/text.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-engine/src/model/node.js");class s extends i.a{constructor(e,t){super(t),this._data=e||""}get offsetSize(){return this.data.length}get data(){return this._data}is(e){return"$text"===e||"model:$text"===e||"text"===e||"model:text"===e||"node"===e||"model:node"===e}toJSON(){const e=super.toJSON();return e.data=this.data,e}_clone(){return new s(this.data,this.getAttributes())}static fromJSON(e){return new s(e.data,e.attributes)}}},"./packages/ckeditor5-engine/src/model/textproxy.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class s{constructor(e,t,o){if(this.textNode=e,t<0||t>e.offsetSize)throw new i.a("model-textproxy-wrong-offsetintext",this);if(o<0||t+o>e.offsetSize)throw new i.a("model-textproxy-wrong-length",this);this.data=e.data.substring(t,t+o),this.offsetInText=t}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}is(e){return"$textProxy"===e||"model:$textProxy"===e||"textProxy"===e||"model:textProxy"===e}getPath(){const e=this.textNode.getPath();return e.length>0&&(e[e.length-1]+=this.offsetInText),e}getAncestors(e={includeSelf:!1,parentFirst:!1}){const t=[];let o=e.includeSelf?this:this.parent;for(;o;)t[e.parentFirst?"push":"unshift"](o),o=o.parent;return t}hasAttribute(e){return this.textNode.hasAttribute(e)}getAttribute(e){return this.textNode.getAttribute(e)}getAttributes(){return this.textNode.getAttributes()}getAttributeKeys(){return this.textNode.getAttributeKeys()}}},"./packages/ckeditor5-engine/src/model/treewalker.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-engine/src/model/text.js"),s=o("./packages/ckeditor5-engine/src/model/textproxy.js"),r=o("./packages/ckeditor5-engine/src/model/element.js"),n=o("./packages/ckeditor5-engine/src/model/position.js"),a=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class c{constructor(e={}){if(!e.boundaries&&!e.startPosition)throw new a.a("model-tree-walker-no-start-position",null);const t=e.direction||"forward";if("forward"!=t&&"backward"!=t)throw new a.a("model-tree-walker-unknown-direction",e,{direction:t});this.direction=t,this.boundaries=e.boundaries||null,e.startPosition?this.position=e.startPosition.clone():this.position=n.a._createAt(this.boundaries["backward"==this.direction?"end":"start"]),this.position.stickiness="toNone",this.singleCharacters=!!e.singleCharacters,this.shallow=!!e.shallow,this.ignoreElementEnd=!!e.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(e){let t,o,i,s;do{i=this.position,s=this._visitedParent,({done:t,value:o}=this.next())}while(!t&&e(o));t||(this.position=i,this._visitedParent=s)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){const e=this.position,t=this.position.clone(),o=this._visitedParent;if(null===o.parent&&t.offset===o.maxOffset)return{done:!0};if(o===this._boundaryEndParent&&t.offset==this.boundaries.end.offset)return{done:!0};const a=t.parent,c=Object(n.d)(t,a),d=c||Object(n.b)(t,a,c);if(d instanceof r.a)return this.shallow?t.offset++:(t.path.push(0),this._visitedParent=d),this.position=t,l("elementStart",d,e,t,1);if(d instanceof i.a){let i;if(this.singleCharacters)i=1;else{let e=d.endOffset;this._boundaryEndParent==o&&this.boundaries.end.offset<e&&(e=this.boundaries.end.offset),i=e-t.offset}const r=t.offset-d.startOffset,n=new s.a(d,r,i);return t.offset+=i,this.position=t,l("text",n,e,t,i)}return t.path.pop(),t.offset++,this.position=t,this._visitedParent=o.parent,this.ignoreElementEnd?this._next():l("elementEnd",o,e,t)}_previous(){const e=this.position,t=this.position.clone(),o=this._visitedParent;if(null===o.parent&&0===t.offset)return{done:!0};if(o==this._boundaryStartParent&&t.offset==this.boundaries.start.offset)return{done:!0};const a=t.parent,c=Object(n.d)(t,a),d=c||Object(n.c)(t,a,c);if(d instanceof r.a)return t.offset--,this.shallow?(this.position=t,l("elementStart",d,e,t,1)):(t.path.push(d.maxOffset),this.position=t,this._visitedParent=d,this.ignoreElementEnd?this._previous():l("elementEnd",d,e,t));if(d instanceof i.a){let i;if(this.singleCharacters)i=1;else{let e=d.startOffset;this._boundaryStartParent==o&&this.boundaries.start.offset>e&&(e=this.boundaries.start.offset),i=t.offset-e}const r=t.offset-d.startOffset,n=new s.a(d,r-i,i);return t.offset-=i,this.position=t,l("text",n,e,t,i)}return t.path.pop(),this.position=t,this._visitedParent=o.parent,l("elementStart",o,e,t,1)}}function l(e,t,o,i,s){return{done:!1,value:{type:e,item:t,previousPosition:o,nextPosition:i,length:s}}}},"./packages/ckeditor5-engine/src/model/utils/autoparagraphing.js":function(e,t,o){"use strict";function i(e){const{schema:t,document:o}=e.model;for(const i of o.getRootNames()){const s=o.getRoot(i);if(s.isEmpty&&!t.checkChild(s,"$text")&&t.checkChild(s,"paragraph"))return e.insertElement("paragraph",s),!0}return!1}function s(e,t,o){const i=o.createContext(e);return!!o.checkChild(i,"paragraph")&&!!o.checkChild(i.push("paragraph"),t)}function r(e,t){const o=t.createElement("paragraph");return t.insert(o,e),t.createPositionAt(o,0)}o.d(t,"a",(function(){return i})),o.d(t,"b",(function(){return s})),o.d(t,"c",(function(){return r}))},"./packages/ckeditor5-engine/src/view/attributeelement.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-engine/src/view/element.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class r extends i.a{constructor(e,t,o,i){super(e,t,o,i),this.getFillerOffset=n,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 s.a("attribute-element-get-elements-with-same-id-no-id",this);return new Set(this._clonesGroup)}is(e,t=null){return t?t===this.name&&("attributeElement"===e||"view:attributeElement"===e||"element"===e||"view:element"===e):"attributeElement"===e||"view:attributeElement"===e||"element"===e||"view:element"===e||"node"===e||"view:node"===e}isSimilar(e){return null!==this.id||null!==e.id?this.id===e.id:super.isSimilar(e)&&this.priority==e.priority}_clone(e){const t=super._clone(e);return t._priority=this._priority,t._id=this._id,t}}function n(){if(a(this))return null;let e=this.parent;for(;e&&e.is("attributeElement");){if(a(e)>1)return null;e=e.parent}return!e||a(e)>1?null:this.childCount}function a(e){return Array.from(e.getChildren()).filter(e=>!e.is("uiElement")).length}r.DEFAULT_PRIORITY=10},"./packages/ckeditor5-engine/src/view/containerelement.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s})),o.d(t,"b",(function(){return r}));var i=o("./packages/ckeditor5-engine/src/view/element.js");class s extends i.a{constructor(e,t,o,i){super(e,t,o,i),this.getFillerOffset=r}is(e,t=null){return t?t===this.name&&("containerElement"===e||"view:containerElement"===e||"element"===e||"view:element"===e):"containerElement"===e||"view:containerElement"===e||"element"===e||"view:element"===e||"node"===e||"view:node"===e}}function r(){const e=[...this.getChildren()],t=e[this.childCount-1];if(t&&t.is("element","br"))return this.childCount;for(const t of e)if(!t.is("uiElement"))return null;return this.childCount}},"./packages/ckeditor5-engine/src/view/document.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return b}));var i=o("./packages/ckeditor5-engine/src/view/documentselection.js"),s=o("./packages/ckeditor5-utils/src/collection.js"),r=o("./packages/ckeditor5-utils/src/mix.js"),n=o("./packages/ckeditor5-utils/src/eventinfo.js"),a=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),c=o("./packages/ckeditor5-utils/src/emittermixin.js"),l=o("./packages/ckeditor5-utils/src/toarray.js"),d=o("./packages/ckeditor5-engine/src/view/observer/bubblingeventinfo.js");const u=Symbol("bubbling contexts");var h={fire(e,...t){try{const o=e instanceof n.a?e:new n.a(this,e),i=m(this);if(!i.size)return;if(p(o,"capturing",this),g(i,"$capture",o,...t))return o.return;const s=o.startRange||this.selection.getFirstRange(),r=s?s.getContainedElement():null,a=!!r&&Boolean(f(i,r));let c=r||function(e){if(!e)return null;const t=e.start.parent,o=e.end.parent,i=t.getPath(),s=o.getPath();return i.length>s.length?t:o}(s);if(p(o,"atTarget",c),!a){if(g(i,"$text",o,...t))return o.return;p(o,"bubbling",c)}for(;c;){if(c.is("rootElement")){if(g(i,"$root",o,...t))return o.return}else if(c.is("element")&&g(i,c.name,o,...t))return o.return;if(g(i,c,o,...t))return o.return;c=c.parent,p(o,"bubbling",c)}return p(o,"bubbling",this),g(i,"$document",o,...t),o.return}catch(e){a.a.rethrowUnexpectedError(e,this)}},_addEventListener(e,t,o){const i=Object(l.a)(o.context||"$document"),s=m(this);for(const r of i){let i=s.get(r);i||(i=Object.create(c.c),s.set(r,i)),this.listenTo(i,e,t,o)}},_removeEventListener(e,t){const o=m(this);for(const i of o.values())this.stopListening(i,e,t)}};function p(e,t,o){e instanceof d.a&&(e._eventPhase=t,e._currentTarget=o)}function g(e,t,o,...i){const s="string"==typeof t?e.get(t):f(e,t);return!!s&&(s.fire(o,...i),o.stop.called)}function f(e,t){for(const[o,i]of e)if("function"==typeof o&&o(t))return i;return null}function m(e){return e[u]||(e[u]=new Map),e[u]}var k=o("./packages/ckeditor5-utils/src/observablemixin.js");class b{constructor(e){this.selection=new i.a,this.roots=new s.a({idProperty:"rootName"}),this.stylesProcessor=e,this.set("isReadOnly",!1),this.set("isFocused",!1),this.set("isSelecting",!1),this.set("isComposing",!1),this._postFixers=new Set}getRoot(e="main"){return this.roots.get(e)}registerPostFixer(e){this._postFixers.add(e)}destroy(){this.roots.map(e=>e.destroy()),this.stopListening()}_callPostFixers(e){let t=!1;do{for(const o of this._postFixers)if(t=o(e),t)break}while(t)}}Object(r.a)(b,h),Object(r.a)(b,k.a)},"./packages/ckeditor5-engine/src/view/documentfragment.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-engine/src/view/text.js"),s=o("./packages/ckeditor5-engine/src/view/textproxy.js"),r=o("./packages/ckeditor5-utils/src/mix.js"),n=o("./packages/ckeditor5-utils/src/isiterable.js"),a=o("./packages/ckeditor5-utils/src/emittermixin.js");class c{constructor(e,t){this.document=e,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(e){return"documentFragment"===e||"view:documentFragment"===e}_appendChild(e){return this._insertChild(this.childCount,e)}getChild(e){return this._children[e]}getChildIndex(e){return this._children.indexOf(e)}getChildren(){return this._children[Symbol.iterator]()}_insertChild(e,t){this._fireChange("children",this);let o=0;const r=function(e,t){if("string"==typeof t)return[new i.a(e,t)];Object(n.a)(t)||(t=[t]);return Array.from(t).map(t=>"string"==typeof t?new i.a(e,t):t instanceof s.a?new i.a(e,t.data):t)}(this.document,t);for(const t of r)null!==t.parent&&t._remove(),t.parent=this,this._children.splice(e,0,t),e++,o++;return o}_removeChildren(e,t=1){this._fireChange("children",this);for(let o=e;o<e+t;o++)this._children[o].parent=null;return this._children.splice(e,t)}_fireChange(e,t){this.fire("change:"+e,t)}}Object(r.a)(c,a.c)},"./packages/ckeditor5-engine/src/view/documentselection.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return n}));var i=o("./packages/ckeditor5-engine/src/view/selection.js"),s=o("./packages/ckeditor5-utils/src/mix.js"),r=o("./packages/ckeditor5-utils/src/emittermixin.js");class n{constructor(e=null,t,o){this._selection=new i.a,this._selection.delegate("change").to(this),this._selection.setTo(e,t,o)}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(e){return this._selection.isEqual(e)}isSimilar(e){return this._selection.isSimilar(e)}is(e){return"selection"===e||"documentSelection"==e||"view:selection"==e||"view:documentSelection"==e}_setTo(e,t,o){this._selection.setTo(e,t,o)}_setFocus(e,t){this._selection.setFocus(e,t)}}Object(s.a)(n,r.c)},"./packages/ckeditor5-engine/src/view/domconverter.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return w}));var i=o("./packages/ckeditor5-engine/src/view/text.js"),s=o("./packages/ckeditor5-engine/src/view/element.js"),r=o("./packages/ckeditor5-engine/src/view/uielement.js"),n=o("./packages/ckeditor5-engine/src/view/position.js"),a=o("./packages/ckeditor5-engine/src/view/range.js"),c=o("./packages/ckeditor5-engine/src/view/selection.js"),l=o("./packages/ckeditor5-engine/src/view/documentfragment.js"),d=o("./packages/ckeditor5-engine/src/view/treewalker.js"),u=o("./packages/ckeditor5-engine/src/view/matcher.js"),h=o("./packages/ckeditor5-engine/src/view/filler.js"),p=o("./packages/ckeditor5-utils/src/dom/global.js");function g(e){let t=0;for(;e.previousSibling;)e=e.previousSibling,t++;return t}function f(e){const t=[];for(;e&&e.nodeType!=Node.DOCUMENT_NODE;)t.unshift(e),e=e.parentNode;return t}var m=o("./packages/ckeditor5-utils/src/dom/istext.js");const k=Object(h.a)(document),b=Object(h.e)(document),_=Object(h.d)(document);class w{constructor(e,t={}){this.document=e,this.renderingMode=t.renderingMode||"editing",this.experimentalRenderingMode=!1,this.blockFillerMode=t.blockFillerMode||("editing"===this.renderingMode?"br":"nbsp"),this.preElements=["pre"],this.blockElements=["address","article","aside","blockquote","caption","center","dd","details","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","legend","li","main","menu","nav","ol","p","pre","section","summary","table","tbody","td","tfoot","th","thead","tr","ul"],this.inlineObjectElements=["object","iframe","input","button","textarea","select","option","video","embed","audio","img","canvas"],this._domToViewMapping=new WeakMap,this._viewToDomMapping=new WeakMap,this._fakeSelectionMapping=new WeakMap,this._rawContentElementMatcher=new u.a,this._encounteredRawContentDomNodes=new WeakSet}bindFakeSelection(e,t){this._fakeSelectionMapping.set(e,new c.a(t))}fakeSelectionToView(e){return this._fakeSelectionMapping.get(e)}bindElements(e,t){this._domToViewMapping.set(e,t),this._viewToDomMapping.set(t,e)}unbindDomElement(e){const t=this._domToViewMapping.get(e);if(t){this._domToViewMapping.delete(e),this._viewToDomMapping.delete(t);for(const t of e.childNodes)this.unbindDomElement(t)}}bindDocumentFragments(e,t){this._domToViewMapping.set(e,t),this._viewToDomMapping.set(t,e)}shouldRenderAttribute(e,t){return!this.experimentalRenderingMode||"data"===this.renderingMode||!(e.toLowerCase().startsWith("on")||t.match(/(\b)(on\S+)(\s*)=|javascript:|(<\s*)(\/*)script/i)||t.match(/data:(?!image\/(png|jpeg|gif|webp))/i))}setContentOf(e,t){if(!this.experimentalRenderingMode||"data"===this.renderingMode)return void(e.innerHTML=t);const o=(new DOMParser).parseFromString(t,"text/html"),i=o.createDocumentFragment(),s=o.body.childNodes;for(;s.length>0;)i.appendChild(s[0]);const r=o.createTreeWalker(i,NodeFilter.SHOW_ELEMENT),n=[];let a;for(;a=r.nextNode();)n.push(a);for(const e of n){for(const t of e.getAttributeNames()){const o=e.getAttribute(t);this.shouldRenderAttribute(t,o)||e.removeAttribute(t)}const t=e.tagName.toLowerCase();this._shouldRenameElement(t)&&e.replaceWith(this._createReplacementDomElement(t,e))}for(;e.firstChild;)e.firstChild.remove();e.append(i)}viewToDom(e,t,o={}){if(e.is("$text")){const o=this._processDataFromViewText(e);return t.createTextNode(o)}{if(this.mapViewToDom(e))return this.mapViewToDom(e);let i;if(e.is("documentFragment"))i=t.createDocumentFragment(),o.bind&&this.bindDocumentFragments(i,e);else{if(e.is("uiElement"))return i="$comment"===e.name?t.createComment(e.getCustomProperty("$rawContent")):e.render(t,this),o.bind&&this.bindElements(i,e),i;i=this._shouldRenameElement(e.name)?this._createReplacementDomElement(e.name):e.hasAttribute("xmlns")?t.createElementNS(e.getAttribute("xmlns"),e.name):t.createElement(e.name),e.is("rawElement")&&e.render(i,this),o.bind&&this.bindElements(i,e);for(const t of e.getAttributeKeys()){const o=e.getAttribute(t);this.shouldRenderAttribute(t,o)&&i.setAttribute(t,o)}}if(!1!==o.withChildren)for(const s of this.viewChildrenToDom(e,t,o))i.appendChild(s);return i}}*viewChildrenToDom(e,t,o={}){const i=e.getFillerOffset&&e.getFillerOffset();let s=0;for(const r of e.getChildren())i===s&&(yield this._getBlockFiller(t)),yield this.viewToDom(r,t,o),s++;i===s&&(yield this._getBlockFiller(t))}viewRangeToDom(e){const t=this.viewPositionToDom(e.start),o=this.viewPositionToDom(e.end),i=document.createRange();return i.setStart(t.parent,t.offset),i.setEnd(o.parent,o.offset),i}viewPositionToDom(e){const t=e.parent;if(t.is("$text")){const o=this.findCorrespondingDomText(t);if(!o)return null;let i=e.offset;return Object(h.i)(o)&&(i+=h.c),{parent:o,offset:i}}{let o,i,s;if(0===e.offset){if(o=this.mapViewToDom(t),!o)return null;s=o.childNodes[0]}else{const t=e.nodeBefore;if(i=t.is("$text")?this.findCorrespondingDomText(t):this.mapViewToDom(e.nodeBefore),!i)return null;o=i.parentNode,s=i.nextSibling}if(Object(m.a)(s)&&Object(h.i)(s))return{parent:s,offset:h.c};return{parent:o,offset:i?g(i)+1:0}}}domToView(e,t={}){if(this.isBlockFiller(e))return null;const o=this.getHostViewElement(e);if(o)return o;if(this.isComment(e)&&t.skipComments)return null;if(Object(m.a)(e)){if(Object(h.h)(e))return null;{const t=this._processDataFromDomText(e);return""===t?null:new i.a(this.document,t)}}{if(this.mapDomToView(e))return this.mapDomToView(e);let o;if(this.isDocumentFragment(e))o=new l.a(this.document),t.bind&&this.bindDocumentFragments(e,o);else{o=this._createViewElement(e,t),t.bind&&this.bindElements(e,o);const i=e.attributes;if(i)for(let e=i.length-1;e>=0;e--)o._setAttribute(i[e].name,i[e].value);if(this._isViewElementWithRawContent(o,t)||this.isComment(e)){const t=this.isComment(e)?e.data:e.innerHTML;return o._setCustomProperty("$rawContent",t),this._encounteredRawContentDomNodes.add(e),o}}if(!1!==t.withChildren)for(const i of this.domChildrenToView(e,t))o._appendChild(i);return o}}*domChildrenToView(e,t={}){for(let o=0;o<e.childNodes.length;o++){const i=e.childNodes[o],s=this.domToView(i,t);null!==s&&(yield s)}}domSelectionToView(e){if(1===e.rangeCount){let t=e.getRangeAt(0).startContainer;Object(m.a)(t)&&(t=t.parentNode);const o=this.fakeSelectionToView(t);if(o)return o}const t=this.isDomSelectionBackward(e),o=[];for(let t=0;t<e.rangeCount;t++){const i=e.getRangeAt(t),s=this.domRangeToView(i);s&&o.push(s)}return new c.a(o,{backward:t})}domRangeToView(e){const t=this.domPositionToView(e.startContainer,e.startOffset),o=this.domPositionToView(e.endContainer,e.endOffset);return t&&o?new a.a(t,o):null}domPositionToView(e,t=0){if(this.isBlockFiller(e))return this.domPositionToView(e.parentNode,g(e));const o=this.mapDomToView(e);if(o&&(o.is("uiElement")||o.is("rawElement")))return n.a._createBefore(o);if(Object(m.a)(e)){if(Object(h.h)(e))return this.domPositionToView(e.parentNode,g(e));const o=this.findCorrespondingViewText(e);let i=t;return o?(Object(h.i)(e)&&(i-=h.c,i=i<0?0:i),new n.a(o,i)):null}if(0===t){const t=this.mapDomToView(e);if(t)return new n.a(t,0)}else{const o=e.childNodes[t-1],i=Object(m.a)(o)?this.findCorrespondingViewText(o):this.mapDomToView(o);if(i&&i.parent)return new n.a(i.parent,i.index+1)}return null}mapDomToView(e){return this.getHostViewElement(e)||this._domToViewMapping.get(e)}findCorrespondingViewText(e){if(Object(h.h)(e))return null;const t=this.getHostViewElement(e);if(t)return t;const o=e.previousSibling;if(o){if(!this.isElement(o))return null;const e=this.mapDomToView(o);if(e){return e.nextSibling instanceof i.a?e.nextSibling:null}}else{const t=this.mapDomToView(e.parentNode);if(t){const e=t.getChild(0);return e instanceof i.a?e:null}}return null}mapViewToDom(e){return this._viewToDomMapping.get(e)}findCorrespondingDomText(e){const t=e.previousSibling;return t&&this.mapViewToDom(t)?this.mapViewToDom(t).nextSibling:!t&&e.parent&&this.mapViewToDom(e.parent)?this.mapViewToDom(e.parent).childNodes[0]:null}focus(e){const t=this.mapViewToDom(e);if(t&&t.ownerDocument.activeElement!==t){const{scrollX:e,scrollY:o}=p.a.window,i=[];v(t,e=>{const{scrollLeft:t,scrollTop:o}=e;i.push([t,o])}),t.focus(),v(t,e=>{const[t,o]=i.shift();e.scrollLeft=t,e.scrollTop=o}),p.a.window.scrollTo(e,o)}}isElement(e){return e&&e.nodeType==Node.ELEMENT_NODE}isDocumentFragment(e){return e&&e.nodeType==Node.DOCUMENT_FRAGMENT_NODE}isComment(e){return e&&e.nodeType==Node.COMMENT_NODE}isBlockFiller(e){return"br"==this.blockFillerMode?e.isEqualNode(k):!("BR"!==e.tagName||!y(e,this.blockElements)||1!==e.parentNode.childNodes.length)||(e.isEqualNode(_)||function(e,t){return e.isEqualNode(b)&&y(e,t)&&1===e.parentNode.childNodes.length}(e,this.blockElements))}isDomSelectionBackward(e){if(e.isCollapsed)return!1;const t=document.createRange();t.setStart(e.anchorNode,e.anchorOffset),t.setEnd(e.focusNode,e.focusOffset);const o=t.collapsed;return t.detach(),o}getHostViewElement(e){const t=f(e);for(t.pop();t.length;){const e=t.pop(),o=this._domToViewMapping.get(e);if(o&&(o.is("uiElement")||o.is("rawElement")))return o}return null}isDomSelectionCorrect(e){return this._isDomSelectionPositionCorrect(e.anchorNode,e.anchorOffset)&&this._isDomSelectionPositionCorrect(e.focusNode,e.focusOffset)}registerRawContentMatcher(e){this._rawContentElementMatcher.add(e)}_getBlockFiller(e){switch(this.blockFillerMode){case"nbsp":return Object(h.e)(e);case"markedNbsp":return Object(h.d)(e);case"br":return Object(h.a)(e)}}_isDomSelectionPositionCorrect(e,t){if(Object(m.a)(e)&&Object(h.i)(e)&&t<h.c)return!1;if(this.isElement(e)&&Object(h.i)(e.childNodes[t]))return!1;const o=this.mapDomToView(e);return!o||!o.is("uiElement")&&!o.is("rawElement")}_processDataFromViewText(e){let t=e.data;if(e.getAncestors().some(e=>this.preElements.includes(e.name)))return t;if(" "==t.charAt(0)){const o=this._getTouchingInlineViewNode(e,!1);!(o&&o.is("$textProxy")&&this._nodeEndsWithSpace(o))&&o||(t=" "+t.substr(1))}if(" "==t.charAt(t.length-1)){const o=this._getTouchingInlineViewNode(e,!0),i=o&&o.is("$textProxy")&&" "==o.data.charAt(0);" "!=t.charAt(t.length-2)&&o&&!i||(t=t.substr(0,t.length-1)+" ")}return t.replace(/ {2}/g,"  ")}_nodeEndsWithSpace(e){if(e.getAncestors().some(e=>this.preElements.includes(e.name)))return!1;const t=this._processDataFromViewText(e);return" "==t.charAt(t.length-1)}_processDataFromDomText(e){let t=e.data;if(function(e,t){return f(e).some(e=>e.tagName&&t.includes(e.tagName.toLowerCase()))}(e,this.preElements))return Object(h.f)(e);t=t.replace(/[ \n\t\r]{1,}/g," ");const o=this._getTouchingInlineDomNode(e,!1),i=this._getTouchingInlineDomNode(e,!0),s=this._checkShouldLeftTrimDomText(e,o),r=this._checkShouldRightTrimDomText(e,i);s&&(t=t.replace(/^ /,"")),r&&(t=t.replace(/ $/,"")),t=Object(h.f)(new Text(t)),t=t.replace(/ \u00A0/g,"  ");const n=i&&this.isElement(i)&&"BR"!=i.tagName,a=i&&Object(m.a)(i)&&" "==i.data.charAt(0);return(/( |\u00A0)\u00A0$/.test(t)||!i||n||a)&&(t=t.replace(/\u00A0$/," ")),(s||o&&this.isElement(o)&&"BR"!=o.tagName)&&(t=t.replace(/^\u00A0/," ")),t}_checkShouldLeftTrimDomText(e,t){return!t||(this.isElement(t)?"BR"===t.tagName:!this._encounteredRawContentDomNodes.has(e.previousSibling)&&/[^\S\u00A0]/.test(t.data.charAt(t.data.length-1)))}_checkShouldRightTrimDomText(e,t){return!t&&!Object(h.i)(e)}_getTouchingInlineViewNode(e,t){const o=new d.a({startPosition:t?n.a._createAfter(e):n.a._createBefore(e),direction:t?"forward":"backward"});for(const e of o){if(e.item.is("element")&&this.inlineObjectElements.includes(e.item.name))return e.item;if(e.item.is("containerElement"))return null;if(e.item.is("element","br"))return null;if(e.item.is("$textProxy"))return e.item}return null}_getTouchingInlineDomNode(e,t){if(!e.parentNode)return null;const o=t?"firstChild":"lastChild",i=t?"nextSibling":"previousSibling";let s=!0;do{if(!s&&e[o]?e=e[o]:e[i]?(e=e[i],s=!1):(e=e.parentNode,s=!0),!e||this._isBlockElement(e))return null}while(!Object(m.a)(e)&&"BR"!=e.tagName&&!this._isInlineObjectElement(e));return e}_isBlockElement(e){return this.isElement(e)&&this.blockElements.includes(e.tagName.toLowerCase())}_isInlineObjectElement(e){return this.isElement(e)&&this.inlineObjectElements.includes(e.tagName.toLowerCase())}_createViewElement(e,t){if(this.isComment(e))return new r.a(this.document,"$comment");const o=t.keepOriginalCase?e.tagName:e.tagName.toLowerCase();return new s.a(this.document,o)}_isViewElementWithRawContent(e,t){return!1!==t.withChildren&&this._rawContentElementMatcher.match(e)}_shouldRenameElement(e){return this.experimentalRenderingMode&&"editing"==this.renderingMode&&"script"==e}_createReplacementDomElement(e,t=null){const o=document.createElement("span");if(o.setAttribute("data-ck-hidden",e),t){for(;t.firstChild;)o.appendChild(t.firstChild);for(const e of t.getAttributeNames())o.setAttribute(e,t.getAttribute(e))}return o}}function v(e,t){for(;e&&e!=p.a.document;)t(e),e=e.parentNode}function y(e,t){const o=e.parentNode;return o&&o.tagName&&t.includes(o.tagName.toLowerCase())}},"./packages/ckeditor5-engine/src/view/downcastwriter.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return v}));var i=o("./packages/ckeditor5-engine/src/view/position.js"),s=o("./packages/ckeditor5-engine/src/view/range.js"),r=o("./packages/ckeditor5-engine/src/view/selection.js"),n=o("./packages/ckeditor5-engine/src/view/containerelement.js"),a=o("./packages/ckeditor5-engine/src/view/attributeelement.js"),c=o("./packages/ckeditor5-engine/src/view/element.js"),l=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),d=o("./packages/ckeditor5-engine/src/view/node.js");class u extends c.a{constructor(e,t,o,i){super(e,t,o,i),this._isAllowedInsideAttributeElement=!0,this.getFillerOffset=h}is(e,t=null){return t?t===this.name&&("emptyElement"===e||"view:emptyElement"===e||"element"===e||"view:element"===e):"emptyElement"===e||"view:emptyElement"===e||"element"===e||"view:element"===e||"node"===e||"view:node"===e}_insertChild(e,t){if(t&&(t instanceof d.a||Array.from(t).length>0))throw new l.a("view-emptyelement-cannot-add",[this,t])}}function h(){return null}var p=o("./packages/ckeditor5-engine/src/view/uielement.js");class g extends c.a{constructor(e,t,o,i){super(e,t,o,i),this._isAllowedInsideAttributeElement=!0,this.getFillerOffset=f}is(e,t=null){return t?t===this.name&&("rawElement"===e||"view:rawElement"===e||"element"===e||"view:element"===e):"rawElement"===e||"view:rawElement"===e||e===this.name||e==="view:"+this.name||"element"===e||"view:element"===e||"node"===e||"view:node"===e}_insertChild(e,t){if(t&&(t instanceof d.a||Array.from(t).length>0))throw new l.a("view-rawelement-cannot-add",[this,t])}}function f(){return null}var m=o("./packages/ckeditor5-engine/src/view/documentfragment.js"),k=o("./packages/ckeditor5-utils/src/isiterable.js"),b=o("./packages/ckeditor5-engine/src/view/text.js"),_=o("./packages/ckeditor5-engine/src/view/editableelement.js"),w=o("./node_modules/lodash-es/isPlainObject.js");class v{constructor(e){this.document=e,this._cloneGroups=new Map}setSelection(e,t,o){this.document.selection._setTo(e,t,o)}setSelectionFocus(e,t){this.document.selection._setFocus(e,t)}createDocumentFragment(e){return new m.a(this.document,e)}createText(e){return new b.a(this.document,e)}createAttributeElement(e,t,o={}){const i=new a.a(this.document,e,t);return"number"==typeof o.priority&&(i._priority=o.priority),o.id&&(i._id=o.id),i}createContainerElement(e,t,o={}){const i=new n.a(this.document,e,t);return void 0!==o.isAllowedInsideAttributeElement&&(i._isAllowedInsideAttributeElement=o.isAllowedInsideAttributeElement),i}createEditableElement(e,t){const o=new _.a(this.document,e,t);return o._document=this.document,o}createEmptyElement(e,t,o={}){const i=new u(this.document,e,t);return void 0!==o.isAllowedInsideAttributeElement&&(i._isAllowedInsideAttributeElement=o.isAllowedInsideAttributeElement),i}createUIElement(e,t,o,i={}){const s=new p.a(this.document,e,t);return o&&(s.render=o),void 0!==i.isAllowedInsideAttributeElement&&(s._isAllowedInsideAttributeElement=i.isAllowedInsideAttributeElement),s}createRawElement(e,t,o,i={}){const s=new g(this.document,e,t);return s.render=o||(()=>{}),void 0!==i.isAllowedInsideAttributeElement&&(s._isAllowedInsideAttributeElement=i.isAllowedInsideAttributeElement),s}setAttribute(e,t,o){o._setAttribute(e,t)}removeAttribute(e,t){t._removeAttribute(e)}addClass(e,t){t._addClass(e)}removeClass(e,t){t._removeClass(e)}setStyle(e,t,o){Object(w.a)(e)&&void 0===o&&(o=t),o._setStyle(e,t)}removeStyle(e,t){t._removeStyle(e)}setCustomProperty(e,t,o){o._setCustomProperty(e,t)}removeCustomProperty(e,t){return t._removeCustomProperty(e)}breakAttributes(e){return e instanceof i.a?this._breakAttributes(e):this._breakAttributesRange(e)}breakContainer(e){const t=e.parent;if(!t.is("containerElement"))throw new l.a("view-writer-break-non-container-element",this.document);if(!t.parent)throw new l.a("view-writer-break-root",this.document);if(e.isAtStart)return i.a._createBefore(t);if(!e.isAtEnd){const o=t._clone(!1);this.insert(i.a._createAfter(t),o);const r=new s.a(e,i.a._createAt(t,"end")),n=new i.a(o,0);this.move(r,n)}return i.a._createAfter(t)}mergeAttributes(e){const t=e.offset,o=e.parent;if(o.is("$text"))return e;if(o.is("attributeElement")&&0===o.childCount){const e=o.parent,t=o.index;return o._remove(),this._removeFromClonedElementsGroup(o),this.mergeAttributes(new i.a(e,t))}const s=o.getChild(t-1),r=o.getChild(t);if(!s||!r)return e;if(s.is("$text")&&r.is("$text"))return O(s,r);if(s.is("attributeElement")&&r.is("attributeElement")&&s.isSimilar(r)){const e=s.childCount;return s._appendChild(r.getChildren()),r._remove(),this._removeFromClonedElementsGroup(r),this.mergeAttributes(new i.a(s,e))}return e}mergeContainers(e){const t=e.nodeBefore,o=e.nodeAfter;if(!(t&&o&&t.is("containerElement")&&o.is("containerElement")))throw new l.a("view-writer-merge-containers-invalid-position",this.document);const r=t.getChild(t.childCount-1),n=r instanceof b.a?i.a._createAt(r,"end"):i.a._createAt(t,"end");return this.move(s.a._createIn(o),i.a._createAt(t,"end")),this.remove(s.a._createOn(o)),n}insert(e,t){(function e(t,o){for(const i of t){if(!A.some(e=>i instanceof e))throw new l.a("view-writer-insert-invalid-node-type",o);i.is("$text")||e(i.getChildren(),o)}})(t=Object(k.a)(t)?[...t]:[t],this.document);const o=t.reduce((e,t)=>{const o=e[e.length-1],i=!(t.is("uiElement")&&t.isAllowedInsideAttributeElement);return o&&o.breakAttributes==i?o.nodes.push(t):e.push({breakAttributes:i,nodes:[t]}),e},[]);let i=null,r=e;for(const{nodes:e,breakAttributes:t}of o){const o=this._insertNodes(r,e,t);i||(i=o.start),r=o.end}return i?new s.a(i,r):new s.a(e)}remove(e){const t=e instanceof s.a?e:s.a._createOn(e);if(C(t,this.document),t.isCollapsed)return new m.a(this.document);const{start:o,end:i}=this._breakAttributesRange(t,!0),r=o.parent,n=i.offset-o.offset,a=r._removeChildren(o.offset,n);for(const e of a)this._removeFromClonedElementsGroup(e);const c=this.mergeAttributes(o);return t.start=c,t.end=c.clone(),new m.a(this.document,a)}clear(e,t){C(e,this.document);const o=e.getWalker({direction:"backward",ignoreElementEnd:!0});for(const i of o){const o=i.item;let r;if(o.is("element")&&t.isSimilar(o))r=s.a._createOn(o);else if(!i.nextPosition.isAfter(e.start)&&o.is("$textProxy")){const e=o.getAncestors().find(e=>e.is("element")&&t.isSimilar(e));e&&(r=s.a._createIn(e))}r&&(r.end.isAfter(e.end)&&(r.end=e.end),r.start.isBefore(e.start)&&(r.start=e.start),this.remove(r))}}move(e,t){let o;if(t.isAfter(e.end)){const i=(t=this._breakAttributes(t,!0)).parent,s=i.childCount;e=this._breakAttributesRange(e,!0),o=this.remove(e),t.offset+=i.childCount-s}else o=this.remove(e);return this.insert(t,o)}wrap(e,t){if(!(t instanceof a.a))throw new l.a("view-writer-wrap-invalid-attribute",this.document);if(C(e,this.document),e.isCollapsed){let i=e.start;i.parent.is("element")&&(o=i.parent,!Array.from(o.getChildren()).some(e=>!e.is("uiElement")))&&(i=i.getLastMatchingPosition(e=>e.item.is("uiElement"))),i=this._wrapPosition(i,t);const r=this.document.selection;return r.isCollapsed&&r.getFirstPosition().isEqual(e.start)&&this.setSelection(i),new s.a(i)}return this._wrapRange(e,t);var o}unwrap(e,t){if(!(t instanceof a.a))throw new l.a("view-writer-unwrap-invalid-attribute",this.document);if(C(e,this.document),e.isCollapsed)return e;const{start:o,end:i}=this._breakAttributesRange(e,!0),r=o.parent,n=this._unwrapChildren(r,o.offset,i.offset,t),c=this.mergeAttributes(n.start);c.isEqual(n.start)||n.end.offset--;const d=this.mergeAttributes(n.end);return new s.a(c,d)}rename(e,t){const o=new n.a(this.document,e,t.getAttributes());return this.insert(i.a._createAfter(t),o),this.move(s.a._createIn(t),i.a._createAt(o,0)),this.remove(s.a._createOn(t)),o}clearClonedElementsGroup(e){this._cloneGroups.delete(e)}createPositionAt(e,t){return i.a._createAt(e,t)}createPositionAfter(e){return i.a._createAfter(e)}createPositionBefore(e){return i.a._createBefore(e)}createRange(e,t){return new s.a(e,t)}createRangeOn(e){return s.a._createOn(e)}createRangeIn(e){return s.a._createIn(e)}createSelection(e,t,o){return new r.a(e,t,o)}_insertNodes(e,t,o){let i,r;if(i=o?y(e):e.parent.is("$text")?e.parent.parent:e.parent,!i)throw new l.a("view-writer-invalid-position-container",this.document);r=o?this._breakAttributes(e,!0):e.parent.is("$text")?P(e):e;const n=i._insertChild(r.offset,t);for(const e of t)this._addToClonedElementsGroup(e);const a=r.getShiftedBy(n),c=this.mergeAttributes(r);c.isEqual(r)||a.offset--;const d=this.mergeAttributes(a);return new s.a(c,d)}_wrapChildren(e,t,o,r){let n=t;const a=[];for(;n<o;){const t=e.getChild(n),o=t.is("$text"),s=t.is("attributeElement"),c=t.isAllowedInsideAttributeElement;if(s&&this._wrapAttributeElement(r,t))a.push(new i.a(e,n));else if(o||c||s&&j(r,t)){const o=r._clone();t._remove(),o._appendChild(t),e._insertChild(n,o),this._addToClonedElementsGroup(o),a.push(new i.a(e,n))}else s&&this._wrapChildren(t,0,t.childCount,r);n++}let c=0;for(const e of a){if(e.offset-=c,e.offset==t)continue;this.mergeAttributes(e).isEqual(e)||(c++,o--)}return s.a._createFromParentsAndOffsets(e,t,e,o)}_unwrapChildren(e,t,o,r){let n=t;const a=[];for(;n<o;){const t=e.getChild(n);if(t.is("attributeElement"))if(t.isSimilar(r)){const s=t.getChildren(),r=t.childCount;t._remove(),e._insertChild(n,s),this._removeFromClonedElementsGroup(t),a.push(new i.a(e,n),new i.a(e,n+r)),n+=r,o+=r-1}else this._unwrapAttributeElement(r,t)?(a.push(new i.a(e,n),new i.a(e,n+1)),n++):(this._unwrapChildren(t,0,t.childCount,r),n++);else n++}let c=0;for(const e of a){if(e.offset-=c,e.offset==t||e.offset==o)continue;this.mergeAttributes(e).isEqual(e)||(c++,o--)}return s.a._createFromParentsAndOffsets(e,t,e,o)}_wrapRange(e,t){const{start:o,end:i}=this._breakAttributesRange(e,!0),r=o.parent,n=this._wrapChildren(r,o.offset,i.offset,t),a=this.mergeAttributes(n.start);a.isEqual(n.start)||n.end.offset--;const c=this.mergeAttributes(n.end);return new s.a(a,c)}_wrapPosition(e,t){if(t.isSimilar(e.parent))return x(e.clone());e.parent.is("$text")&&(e=P(e));const o=this.createAttributeElement();o._priority=Number.POSITIVE_INFINITY,o.isSimilar=()=>!1,e.parent._insertChild(e.offset,o);const r=new s.a(e,e.getShiftedBy(1));this.wrap(r,t);const n=new i.a(o.parent,o.index);o._remove();const a=n.nodeBefore,c=n.nodeAfter;return a instanceof b.a&&c instanceof b.a?O(a,c):x(n)}_wrapAttributeElement(e,t){if(!E(e,t))return!1;if(e.name!==t.name||e.priority!==t.priority)return!1;for(const o of e.getAttributeKeys())if("class"!==o&&"style"!==o&&t.hasAttribute(o)&&t.getAttribute(o)!==e.getAttribute(o))return!1;for(const o of e.getStyleNames())if(t.hasStyle(o)&&t.getStyle(o)!==e.getStyle(o))return!1;for(const o of e.getAttributeKeys())"class"!==o&&"style"!==o&&(t.hasAttribute(o)||this.setAttribute(o,e.getAttribute(o),t));for(const o of e.getStyleNames())t.hasStyle(o)||this.setStyle(o,e.getStyle(o),t);for(const o of e.getClassNames())t.hasClass(o)||this.addClass(o,t);return!0}_unwrapAttributeElement(e,t){if(!E(e,t))return!1;if(e.name!==t.name||e.priority!==t.priority)return!1;for(const o of e.getAttributeKeys())if("class"!==o&&"style"!==o&&(!t.hasAttribute(o)||t.getAttribute(o)!==e.getAttribute(o)))return!1;if(!t.hasClass(...e.getClassNames()))return!1;for(const o of e.getStyleNames())if(!t.hasStyle(o)||t.getStyle(o)!==e.getStyle(o))return!1;for(const o of e.getAttributeKeys())"class"!==o&&"style"!==o&&this.removeAttribute(o,t);return this.removeClass(Array.from(e.getClassNames()),t),this.removeStyle(Array.from(e.getStyleNames()),t),!0}_breakAttributesRange(e,t=!1){const o=e.start,i=e.end;if(C(e,this.document),e.isCollapsed){const o=this._breakAttributes(e.start,t);return new s.a(o,o)}const r=this._breakAttributes(i,t),n=r.parent.childCount,a=this._breakAttributes(o,t);return r.offset+=r.parent.childCount-n,new s.a(a,r)}_breakAttributes(e,t=!1){const o=e.offset,s=e.parent;if(e.parent.is("emptyElement"))throw new l.a("view-writer-cannot-break-empty-element",this.document);if(e.parent.is("uiElement"))throw new l.a("view-writer-cannot-break-ui-element",this.document);if(e.parent.is("rawElement"))throw new l.a("view-writer-cannot-break-raw-element",this.document);if(!t&&s.is("$text")&&T(s.parent))return e.clone();if(T(s))return e.clone();if(s.is("$text"))return this._breakAttributes(P(e),t);if(o==s.childCount){const e=new i.a(s.parent,s.index+1);return this._breakAttributes(e,t)}if(0===o){const e=new i.a(s.parent,s.index);return this._breakAttributes(e,t)}{const e=s.index+1,r=s._clone();s.parent._insertChild(e,r),this._addToClonedElementsGroup(r);const n=s.childCount-o,a=s._removeChildren(o,n);r._appendChild(a);const c=new i.a(s.parent,e);return this._breakAttributes(c,t)}}_addToClonedElementsGroup(e){if(!e.root.is("rootElement"))return;if(e.is("element"))for(const t of e.getChildren())this._addToClonedElementsGroup(t);const t=e.id;if(!t)return;let o=this._cloneGroups.get(t);o||(o=new Set,this._cloneGroups.set(t,o)),o.add(e),e._clonesGroup=o}_removeFromClonedElementsGroup(e){if(e.is("element"))for(const t of e.getChildren())this._removeFromClonedElementsGroup(t);const t=e.id;if(!t)return;const o=this._cloneGroups.get(t);o&&o.delete(e)}}function y(e){let t=e.parent;for(;!T(t);){if(!t)return;t=t.parent}return t}function j(e,t){return e.priority<t.priority||!(e.priority>t.priority)&&e.getIdentity()<t.getIdentity()}function x(e){const t=e.nodeBefore;if(t&&t.is("$text"))return new i.a(t,t.data.length);const o=e.nodeAfter;return o&&o.is("$text")?new i.a(o,0):e}function P(e){if(e.offset==e.parent.data.length)return new i.a(e.parent.parent,e.parent.index+1);if(0===e.offset)return new i.a(e.parent.parent,e.parent.index);const t=e.parent.data.slice(e.offset);return e.parent._data=e.parent.data.slice(0,e.offset),e.parent.parent._insertChild(e.parent.index+1,new b.a(e.root.document,t)),new i.a(e.parent.parent,e.parent.index+1)}function O(e,t){const o=e.data.length;return e._data+=t.data,t._remove(),new i.a(e,o)}const A=[b.a,a.a,n.a,u,g,p.a];function T(e){return e&&(e.is("containerElement")||e.is("documentFragment"))}function C(e,t){const o=y(e.start),i=y(e.end);if(!o||!i||o!==i)throw new l.a("view-writer-invalid-range-container",t)}function E(e,t){return null===e.id&&null===t.id}},"./packages/ckeditor5-engine/src/view/editableelement.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return n}));var i=o("./packages/ckeditor5-engine/src/view/containerelement.js"),s=o("./packages/ckeditor5-utils/src/mix.js"),r=o("./packages/ckeditor5-utils/src/observablemixin.js");class n extends i.a{constructor(e,t,o,i){super(e,t,o,i),this.set("isReadOnly",!1),this.set("isFocused",!1),this.bind("isReadOnly").to(e),this.bind("isFocused").to(e,"isFocused",t=>t&&e.selection.editableElement==this),this.listenTo(e.selection,"change",()=>{this.isFocused=e.isFocused&&e.selection.editableElement==this})}is(e,t=null){return t?t===this.name&&("editableElement"===e||"view:editableElement"===e||"containerElement"===e||"view:containerElement"===e||"element"===e||"view:element"===e):"editableElement"===e||"view:editableElement"===e||"containerElement"===e||"view:containerElement"===e||"element"===e||"view:element"===e||"node"===e||"view:node"===e}destroy(){this.stopListening()}}Object(s.a)(n,r.a)},"./packages/ckeditor5-engine/src/view/element.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return u}));var i=o("./packages/ckeditor5-engine/src/view/node.js"),s=o("./packages/ckeditor5-engine/src/view/text.js"),r=o("./packages/ckeditor5-engine/src/view/textproxy.js"),n=o("./packages/ckeditor5-utils/src/tomap.js"),a=o("./packages/ckeditor5-utils/src/toarray.js"),c=o("./packages/ckeditor5-utils/src/isiterable.js"),l=o("./packages/ckeditor5-engine/src/view/matcher.js"),d=o("./packages/ckeditor5-engine/src/view/stylesmap.js");class u extends i.a{constructor(e,t,o,i){if(super(e),this.name=t,this._attrs=function(e){e=Object(n.a)(e);for(const[t,o]of e)null===o?e.delete(t):"string"!=typeof o&&e.set(t,String(o));return e}(o),this._children=[],i&&this._insertChild(0,i),this._classes=new Set,this._attrs.has("class")){const e=this._attrs.get("class");h(this._classes,e),this._attrs.delete("class")}this._styles=new d.b(this.document.stylesProcessor),this._attrs.has("style")&&(this._styles.setTo(this._attrs.get("style")),this._attrs.delete("style")),this._customProperties=new Map,this._isAllowedInsideAttributeElement=!1}get childCount(){return this._children.length}get isEmpty(){return 0===this._children.length}get isAllowedInsideAttributeElement(){return this._isAllowedInsideAttributeElement}is(e,t=null){return t?t===this.name&&("element"===e||"view:element"===e):"element"===e||"view:element"===e||"node"===e||"view:node"===e}getChild(e){return this._children[e]}getChildIndex(e){return this._children.indexOf(e)}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(e){if("class"==e)return this._classes.size>0?[...this._classes].join(" "):void 0;if("style"==e){const e=this._styles.toString();return""==e?void 0:e}return this._attrs.get(e)}hasAttribute(e){return"class"==e?this._classes.size>0:"style"==e?!this._styles.isEmpty:this._attrs.has(e)}isSimilar(e){if(!(e instanceof u))return!1;if(this===e)return!0;if(this.name!=e.name)return!1;if(this.isAllowedInsideAttributeElement!=e.isAllowedInsideAttributeElement)return!1;if(this._attrs.size!==e._attrs.size||this._classes.size!==e._classes.size||this._styles.size!==e._styles.size)return!1;for(const[t,o]of this._attrs)if(!e._attrs.has(t)||e._attrs.get(t)!==o)return!1;for(const t of this._classes)if(!e._classes.has(t))return!1;for(const t of this._styles.getStyleNames())if(!e._styles.has(t)||e._styles.getAsString(t)!==this._styles.getAsString(t))return!1;return!0}hasClass(...e){for(const t of e)if(!this._classes.has(t))return!1;return!0}getClassNames(){return this._classes.keys()}getStyle(e){return this._styles.getAsString(e)}getNormalizedStyle(e){return this._styles.getNormalized(e)}getStyleNames(e=!1){return this._styles.getStyleNames(e)}hasStyle(...e){for(const t of e)if(!this._styles.has(t))return!1;return!0}findAncestor(...e){const t=new l.a(...e);let o=this.parent;for(;o;){if(t.match(o))return o;o=o.parent}return null}getCustomProperty(e){return this._customProperties.get(e)}*getCustomProperties(){yield*this._customProperties.entries()}getIdentity(){const e=Array.from(this._classes).sort().join(","),t=this._styles.toString(),o=Array.from(this._attrs).map(e=>`${e[0]}="${e[1]}"`).sort().join(" ");return this.name+(""==e?"":` class="${e}"`)+(t?` style="${t}"`:"")+(""==o?"":" "+o)}_clone(e=!1){const t=[];if(e)for(const o of this.getChildren())t.push(o._clone(e));const o=new this.constructor(this.document,this.name,this._attrs,t);return o._classes=new Set(this._classes),o._styles.set(this._styles.getNormalized()),o._customProperties=new Map(this._customProperties),o.getFillerOffset=this.getFillerOffset,o._isAllowedInsideAttributeElement=this.isAllowedInsideAttributeElement,o}_appendChild(e){return this._insertChild(this.childCount,e)}_insertChild(e,t){this._fireChange("children",this);let o=0;const i=function(e,t){if("string"==typeof t)return[new s.a(e,t)];Object(c.a)(t)||(t=[t]);return Array.from(t).map(t=>"string"==typeof t?new s.a(e,t):t instanceof r.a?new s.a(e,t.data):t)}(this.document,t);for(const t of i)null!==t.parent&&t._remove(),t.parent=this,t.document=this.document,this._children.splice(e,0,t),e++,o++;return o}_removeChildren(e,t=1){this._fireChange("children",this);for(let o=e;o<e+t;o++)this._children[o].parent=null;return this._children.splice(e,t)}_setAttribute(e,t){t=String(t),this._fireChange("attributes",this),"class"==e?h(this._classes,t):"style"==e?this._styles.setTo(t):this._attrs.set(e,t)}_removeAttribute(e){return this._fireChange("attributes",this),"class"==e?this._classes.size>0&&(this._classes.clear(),!0):"style"==e?!this._styles.isEmpty&&(this._styles.clear(),!0):this._attrs.delete(e)}_addClass(e){this._fireChange("attributes",this);for(const t of Object(a.a)(e))this._classes.add(t)}_removeClass(e){this._fireChange("attributes",this);for(const t of Object(a.a)(e))this._classes.delete(t)}_setStyle(e,t){this._fireChange("attributes",this),this._styles.set(e,t)}_removeStyle(e){this._fireChange("attributes",this);for(const t of Object(a.a)(e))this._styles.remove(t)}_setCustomProperty(e,t){this._customProperties.set(e,t)}_removeCustomProperty(e){return this._customProperties.delete(e)}}function h(e,t){const o=t.split(/\s+/);e.clear(),o.forEach(t=>e.add(t))}},"./packages/ckeditor5-engine/src/view/filler.js":function(e,t,o){"use strict";o.d(t,"e",(function(){return r})),o.d(t,"d",(function(){return n})),o.d(t,"a",(function(){return a})),o.d(t,"c",(function(){return c})),o.d(t,"b",(function(){return l})),o.d(t,"i",(function(){return d})),o.d(t,"h",(function(){return u})),o.d(t,"f",(function(){return h})),o.d(t,"g",(function(){return p}));var i=o("./packages/ckeditor5-utils/src/keyboard.js"),s=o("./packages/ckeditor5-utils/src/dom/istext.js");const r=e=>e.createTextNode(" "),n=e=>{const t=e.createElement("span");return t.dataset.ckeFiller=!0,t.innerHTML=" ",t},a=e=>{const t=e.createElement("br");return t.dataset.ckeFiller=!0,t},c=7,l="⁠".repeat(c);function d(e){return Object(s.a)(e)&&e.data.substr(0,c)===l}function u(e){return e.data.length==c&&d(e)}function h(e){return d(e)?e.data.slice(c):e.data}function p(e){e.document.on("arrowKey",g,{priority:"low"})}function g(e,t){if(t.keyCode==i.f.arrowleft){const e=t.domTarget.ownerDocument.defaultView.getSelection();if(1==e.rangeCount&&e.getRangeAt(0).collapsed){const t=e.getRangeAt(0).startContainer,o=e.getRangeAt(0).startOffset;d(t)&&o<=c&&e.collapse(t,0)}}}},"./packages/ckeditor5-engine/src/view/matcher.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./node_modules/lodash-es/isPlainObject.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class r{constructor(...e){this._patterns=[],this.add(...e)}add(...e){for(let t of e)("string"==typeof t||t instanceof RegExp)&&(t={name:t}),this._patterns.push(t)}match(...e){for(const t of e)for(const e of this._patterns){const o=n(t,e);if(o)return{element:t,pattern:e,match:o}}return null}matchAll(...e){const t=[];for(const o of e)for(const e of this._patterns){const i=n(o,e);i&&t.push({element:o,pattern:e,match:i})}return t.length>0?t:null}getElementName(){if(1!==this._patterns.length)return null;const e=this._patterns[0],t=e.name;return"function"==typeof e||!t||t instanceof RegExp?null:t}}function n(e,t){if("function"==typeof t)return t(e);const o={};return t.name&&(o.name=function(e,t){if(e instanceof RegExp)return!!t.match(e);return e===t}(t.name,e.name),!o.name)||t.attributes&&(o.attributes=function(e,t){const o=new Set(t.getAttributeKeys());Object(i.a)(e)?(void 0!==e.style&&Object(s.c)("matcher-pattern-deprecated-attributes-style-key",e),void 0!==e.class&&Object(s.c)("matcher-pattern-deprecated-attributes-class-key",e)):(o.delete("style"),o.delete("class"));return a(e,o,e=>t.getAttribute(e))}(t.attributes,e),!o.attributes)?null:!(t.classes&&(o.classes=function(e,t){return a(e,t.getClassNames())}(t.classes,e),!o.classes))&&(!(t.styles&&(o.styles=function(e,t){return a(e,t.getStyleNames(!0),e=>t.getStyle(e))}(t.styles,e),!o.styles))&&o)}function a(e,t,o){const r=function(e){if(Array.isArray(e))return e.map(e=>Object(i.a)(e)?(void 0!==e.key&&void 0!==e.value||Object(s.c)("matcher-pattern-missing-key-or-value",e),[e.key,e.value]):[e,!0]);if(Object(i.a)(e))return Object.entries(e);return[[e,!0]]}(e),n=Array.from(t),a=[];return r.forEach(([e,t])=>{n.forEach(i=>{(function(e,t){return!0===e||e===t||e instanceof RegExp&&t.match(e)})(e,i)&&function(e,t,o){if(!0===e)return!0;const i=o(t);return e===i||e instanceof RegExp&&!!String(i).match(e)}(t,i,o)&&a.push(i)})}),!r.length||a.length<r.length?null:a}},"./packages/ckeditor5-engine/src/view/node.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./packages/ckeditor5-utils/src/emittermixin.js"),r=o("./packages/ckeditor5-utils/src/mix.js"),n=o("./packages/ckeditor5-utils/src/comparearrays.js"),a=o("./node_modules/lodash-es/clone.js");o("./packages/ckeditor5-utils/src/version.js");class c{constructor(e){this.document=e,this.parent=null}get index(){let e;if(!this.parent)return null;if(-1==(e=this.parent.getChildIndex(this)))throw new i.a("view-node-not-found-in-parent",this);return e}get nextSibling(){const e=this.index;return null!==e&&this.parent.getChild(e+1)||null}get previousSibling(){const e=this.index;return null!==e&&this.parent.getChild(e-1)||null}get root(){let e=this;for(;e.parent;)e=e.parent;return e}isAttached(){return this.root.is("rootElement")}getPath(){const e=[];let t=this;for(;t.parent;)e.unshift(t.index),t=t.parent;return e}getAncestors(e={includeSelf:!1,parentFirst:!1}){const t=[];let o=e.includeSelf?this:this.parent;for(;o;)t[e.parentFirst?"push":"unshift"](o),o=o.parent;return t}getCommonAncestor(e,t={}){const o=this.getAncestors(t),i=e.getAncestors(t);let s=0;for(;o[s]==i[s]&&o[s];)s++;return 0===s?null:o[s-1]}isBefore(e){if(this==e)return!1;if(this.root!==e.root)return!1;const t=this.getPath(),o=e.getPath(),i=Object(n.a)(t,o);switch(i){case"prefix":return!0;case"extension":return!1;default:return t[i]<o[i]}}isAfter(e){return this!=e&&(this.root===e.root&&!this.isBefore(e))}_remove(){this.parent._removeChildren(this.index)}_fireChange(e,t){this.fire("change:"+e,t),this.parent&&this.parent._fireChange(e,t)}toJSON(){const e=Object(a.a)(this);return delete e.parent,e}is(e){return"node"===e||"view:node"===e}}Object(r.a)(c,s.c)},"./packages/ckeditor5-engine/src/view/observer/bubblingeventinfo.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-utils/src/eventinfo.js");class s extends i.a{constructor(e,t,o){super(e,t),this.startRange=o,this._eventPhase="none",this._currentTarget=null}get eventPhase(){return this._eventPhase}get currentTarget(){return this._currentTarget}}},"./packages/ckeditor5-engine/src/view/observer/domeventdata.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./node_modules/lodash-es/assignIn.js");class s{constructor(e,t,o){this.view=e,this.document=e.document,this.domEvent=t,this.domTarget=t.target,Object(i.a)(this,o)}get target(){return this.view.domConverter.mapDomToView(this.domTarget)}preventDefault(){this.domEvent.preventDefault()}stopPropagation(){this.domEvent.stopPropagation()}}},"./packages/ckeditor5-engine/src/view/observer/domeventobserver.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-engine/src/view/observer/observer.js"),s=o("./packages/ckeditor5-engine/src/view/observer/domeventdata.js");class r extends i.a{constructor(e){super(e),this.useCapture=!1}observe(e){("string"==typeof this.domEventType?[this.domEventType]:this.domEventType).forEach(t=>{this.listenTo(e,t,(e,t)=>{this.isEnabled&&!this.checkShouldIgnoreEventFromTarget(t.target)&&this.onDomEvent(t)},{useCapture:this.useCapture})})}fire(e,t,o){this.isEnabled&&this.document.fire(e,new s.a(this.view,t,o))}}},"./packages/ckeditor5-engine/src/view/observer/mouseobserver.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-engine/src/view/observer/domeventobserver.js");class s extends i.a{constructor(e){super(e),this.domEventType=["mousedown","mouseup","mouseover","mouseout"]}onDomEvent(e){this.fire(e.type,e)}}},"./packages/ckeditor5-engine/src/view/observer/observer.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-utils/src/dom/emittermixin.js"),s=o("./packages/ckeditor5-utils/src/mix.js");class r{constructor(e){this.view=e,this.document=e.document,this.isEnabled=!1}enable(){this.isEnabled=!0}disable(){this.isEnabled=!1}destroy(){this.disable(),this.stopListening()}checkShouldIgnoreEventFromTarget(e){return e&&3===e.nodeType&&(e=e.parentNode),!(!e||1!==e.nodeType)&&e.matches("[data-cke-ignore-events], [data-cke-ignore-events] *")}}Object(s.a)(r,i.a)},"./packages/ckeditor5-engine/src/view/position.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-engine/src/view/treewalker.js"),s=o("./packages/ckeditor5-utils/src/comparearrays.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-engine/src/view/editableelement.js");o("./packages/ckeditor5-utils/src/version.js");class a{constructor(e,t){this.parent=e,this.offset=t}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 e=this.parent.is("$text")?this.parent.data.length:this.parent.childCount;return this.offset===e}get root(){return this.parent.root}get editableElement(){let e=this.parent;for(;!(e instanceof n.a);){if(!e.parent)return null;e=e.parent}return e}getShiftedBy(e){const t=a._createAt(this),o=t.offset+e;return t.offset=o<0?0:o,t}getLastMatchingPosition(e,t={}){t.startPosition=this;const o=new i.a(t);return o.skip(e),o.position}getAncestors(){return this.parent.is("documentFragment")?[this.parent]:this.parent.getAncestors({includeSelf:!0})}getCommonAncestor(e){const t=this.getAncestors(),o=e.getAncestors();let i=0;for(;t[i]==o[i]&&t[i];)i++;return 0===i?null:t[i-1]}is(e){return"position"===e||"view:position"===e}isEqual(e){return this.parent==e.parent&&this.offset==e.offset}isBefore(e){return"before"==this.compareWith(e)}isAfter(e){return"after"==this.compareWith(e)}compareWith(e){if(this.root!==e.root)return"different";if(this.isEqual(e))return"same";const t=this.parent.is("node")?this.parent.getPath():[],o=e.parent.is("node")?e.parent.getPath():[];t.push(this.offset),o.push(e.offset);const i=Object(s.a)(t,o);switch(i){case"prefix":return"before";case"extension":return"after";default:return t[i]<o[i]?"before":"after"}}getWalker(e={}){return e.startPosition=this,new i.a(e)}clone(){return new a(this.parent,this.offset)}static _createAt(e,t){if(e instanceof a)return new this(e.parent,e.offset);{const o=e;if("end"==t)t=o.is("$text")?o.data.length:o.childCount;else{if("before"==t)return this._createBefore(o);if("after"==t)return this._createAfter(o);if(0!==t&&!t)throw new r.a("view-createpositionat-offset-required",o)}return new a(o,t)}}static _createAfter(e){if(e.is("$textProxy"))return new a(e.textNode,e.offsetInText+e.data.length);if(!e.parent)throw new r.a("view-position-after-root",e,{root:e});return new a(e.parent,e.index+1)}static _createBefore(e){if(e.is("$textProxy"))return new a(e.textNode,e.offsetInText);if(!e.parent)throw new r.a("view-position-before-root",e,{root:e});return new a(e.parent,e.index)}}},"./packages/ckeditor5-engine/src/view/range.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-engine/src/view/position.js"),s=o("./packages/ckeditor5-engine/src/view/treewalker.js");class r{constructor(e,t=null){this.start=e.clone(),this.end=t?t.clone():e.clone()}*[Symbol.iterator](){yield*new s.a({boundaries:this,ignoreElementEnd:!0})}get isCollapsed(){return this.start.isEqual(this.end)}get isFlat(){return this.start.parent===this.end.parent}get root(){return this.start.root}getEnlarged(){let e=this.start.getLastMatchingPosition(n,{direction:"backward"}),t=this.end.getLastMatchingPosition(n);return e.parent.is("$text")&&e.isAtStart&&(e=i.a._createBefore(e.parent)),t.parent.is("$text")&&t.isAtEnd&&(t=i.a._createAfter(t.parent)),new r(e,t)}getTrimmed(){let e=this.start.getLastMatchingPosition(n);if(e.isAfter(this.end)||e.isEqual(this.end))return new r(e,e);let t=this.end.getLastMatchingPosition(n,{direction:"backward"});const o=e.nodeAfter,s=t.nodeBefore;return o&&o.is("$text")&&(e=new i.a(o,0)),s&&s.is("$text")&&(t=new i.a(s,s.data.length)),new r(e,t)}isEqual(e){return this==e||this.start.isEqual(e.start)&&this.end.isEqual(e.end)}containsPosition(e){return e.isAfter(this.start)&&e.isBefore(this.end)}containsRange(e,t=!1){e.isCollapsed&&(t=!1);const o=this.containsPosition(e.start)||t&&this.start.isEqual(e.start),i=this.containsPosition(e.end)||t&&this.end.isEqual(e.end);return o&&i}getDifference(e){const t=[];return this.isIntersecting(e)?(this.containsPosition(e.start)&&t.push(new r(this.start,e.start)),this.containsPosition(e.end)&&t.push(new r(e.end,this.end))):t.push(this.clone()),t}getIntersection(e){if(this.isIntersecting(e)){let t=this.start,o=this.end;return this.containsPosition(e.start)&&(t=e.start),this.containsPosition(e.end)&&(o=e.end),new r(t,o)}return null}getWalker(e={}){return e.boundaries=this,new s.a(e)}getCommonAncestor(){return this.start.getCommonAncestor(this.end)}getContainedElement(){if(this.isCollapsed)return null;let e=this.start.nodeAfter,t=this.end.nodeBefore;return this.start.parent.is("$text")&&this.start.isAtEnd&&this.start.parent.nextSibling&&(e=this.start.parent.nextSibling),this.end.parent.is("$text")&&this.end.isAtStart&&this.end.parent.previousSibling&&(t=this.end.parent.previousSibling),e&&e.is("element")&&e===t?e:null}clone(){return new r(this.start,this.end)}*getItems(e={}){e.boundaries=this,e.ignoreElementEnd=!0;const t=new s.a(e);for(const e of t)yield e.item}*getPositions(e={}){e.boundaries=this;const t=new s.a(e);yield t.position;for(const e of t)yield e.nextPosition}is(e){return"range"===e||"view:range"===e}isIntersecting(e){return this.start.isBefore(e.end)&&this.end.isAfter(e.start)}static _createFromParentsAndOffsets(e,t,o,s){return new this(new i.a(e,t),new i.a(o,s))}static _createFromPositionAndShift(e,t){const o=e,i=e.getShiftedBy(t);return t>0?new this(o,i):new this(i,o)}static _createIn(e){return this._createFromParentsAndOffsets(e,0,e,e.childCount)}static _createOn(e){const t=e.is("$textProxy")?e.offsetSize:1;return this._createFromPositionAndShift(i.a._createBefore(e),t)}}function n(e){return!(!e.item.is("attributeElement")&&!e.item.is("uiElement"))}},"./packages/ckeditor5-engine/src/view/renderer.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return m}));var i=o("./packages/ckeditor5-engine/src/view/text.js"),s=o("./packages/ckeditor5-engine/src/view/position.js"),r=o("./packages/ckeditor5-engine/src/view/filler.js"),n=o("./packages/ckeditor5-utils/src/mix.js"),a=o("./packages/ckeditor5-utils/src/diff.js");function c(e,t,o){e.insertBefore(o,e.childNodes[t]||null)}function l(e){const t=e.parentNode;t&&t.removeChild(e)}var d=o("./packages/ckeditor5-utils/src/observablemixin.js"),u=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),h=o("./packages/ckeditor5-utils/src/dom/istext.js"),p=o("./packages/ckeditor5-utils/src/dom/isnode.js"),g=o("./packages/ckeditor5-utils/src/fastdiff.js"),f=o("./packages/ckeditor5-utils/src/env.js");o("./packages/ckeditor5-engine/theme/renderer.css");class m{constructor(e,t){this.domDocuments=new Set,this.domConverter=e,this.markedAttributes=new Set,this.markedChildren=new Set,this.markedTexts=new Set,this.selection=t,this.set("isFocused",!1),this.set("isSelecting",!1),f.a.isBlink&&!f.a.isAndroid&&this.on("change:isSelecting",()=>{this.isSelecting||this.render()}),this._inlineFiller=null,this._fakeSelectionContainer=null}markToSync(e,t){if("text"===e)this.domConverter.mapViewToDom(t.parent)&&this.markedTexts.add(t);else{if(!this.domConverter.mapViewToDom(t))return;if("attributes"===e)this.markedAttributes.add(t);else{if("children"!==e)throw new u.a("view-renderer-unknown-type",this);this.markedChildren.add(t)}}}render(){let e;const t=!(f.a.isBlink&&!f.a.isAndroid)||!this.isSelecting;for(const e of this.markedChildren)this._updateChildrenMappings(e);t?(this._inlineFiller&&!this._isSelectionInInlineFiller()&&this._removeInlineFiller(),this._inlineFiller?e=this._getInlineFillerPosition():this._needsInlineFillerAtSelection()&&(e=this.selection.getFirstPosition(),this.markedChildren.add(e.parent))):this._inlineFiller&&this._inlineFiller.parentNode&&(e=this.domConverter.domPositionToView(this._inlineFiller));for(const e of this.markedAttributes)this._updateAttrs(e);for(const t of this.markedChildren)this._updateChildren(t,{inlineFillerPosition:e});for(const t of this.markedTexts)!this.markedChildren.has(t.parent)&&this.domConverter.mapViewToDom(t.parent)&&this._updateText(t,{inlineFillerPosition:e});if(t)if(e){const t=this.domConverter.viewPositionToDom(e),o=t.parent.ownerDocument;Object(r.i)(t.parent)?this._inlineFiller=t.parent:this._inlineFiller=k(o,t.parent,t.offset)}else this._inlineFiller=null;this._updateFocus(),this._updateSelection(),this.markedTexts.clear(),this.markedAttributes.clear(),this.markedChildren.clear()}_updateChildrenMappings(e){const t=this.domConverter.mapViewToDom(e);if(!t)return;const o=Array.from(this.domConverter.mapViewToDom(e).childNodes),i=Array.from(this.domConverter.viewChildrenToDom(e,t.ownerDocument,{withChildren:!1})),s=this._diffNodeLists(o,i),r=this._findReplaceActions(s,o,i);if(-1!==r.indexOf("replace")){const t={equal:0,insert:0,delete:0};for(const s of r)if("replace"===s){const s=t.equal+t.insert,r=t.equal+t.delete,n=e.getChild(s);!n||n.is("uiElement")||n.is("rawElement")||this._updateElementMappings(n,o[r]),l(i[s]),t.equal++}else t[s]++}}_updateElementMappings(e,t){this.domConverter.unbindDomElement(t),this.domConverter.bindElements(t,e),this.markedChildren.add(e),this.markedAttributes.add(e)}_getInlineFillerPosition(){const e=this.selection.getFirstPosition();return e.parent.is("$text")?s.a._createBefore(this.selection.getFirstPosition().parent):e}_isSelectionInInlineFiller(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const e=this.selection.getFirstPosition(),t=this.domConverter.viewPositionToDom(e);return!!(t&&Object(h.a)(t.parent)&&Object(r.i)(t.parent))}_removeInlineFiller(){const e=this._inlineFiller;if(!Object(r.i)(e))throw new u.a("view-renderer-filler-was-lost",this);Object(r.h)(e)?e.remove():e.data=e.data.substr(r.c),this._inlineFiller=null}_needsInlineFillerAtSelection(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const e=this.selection.getFirstPosition(),t=e.parent,o=e.offset;if(!this.domConverter.mapViewToDom(t.root))return!1;if(!t.is("element"))return!1;if(!function(e){if("false"==e.getAttribute("contenteditable"))return!1;const t=e.findAncestor(e=>e.hasAttribute("contenteditable"));return!t||"true"==t.getAttribute("contenteditable")}(t))return!1;if(o===t.getFillerOffset())return!1;const s=e.nodeBefore,r=e.nodeAfter;return!(s instanceof i.a||r instanceof i.a)}_updateText(e,t){const o=this.domConverter.findCorrespondingDomText(e),i=this.domConverter.viewToDom(e,o.ownerDocument),s=o.data;let n=i.data;const a=t.inlineFillerPosition;if(a&&a.parent==e.parent&&a.offset==e.index&&(n=r.b+n),s!=n){const e=Object(g.a)(s,n);for(const t of e)"insert"===t.type?o.insertData(t.index,t.values.join("")):o.deleteData(t.index,t.howMany)}}_updateAttrs(e){const t=this.domConverter.mapViewToDom(e);if(!t)return;const o=Array.from(t.attributes).map(e=>e.name),i=e.getAttributeKeys();for(const o of i){const i=e.getAttribute(o);this.domConverter.shouldRenderAttribute(o,i)?t.setAttribute(o,i):t.removeAttribute(o)}for(const i of o)"script"===e.name&&"data-ck-hidden"===i||e.hasAttribute(i)||t.removeAttribute(i)}_updateChildren(e,t){const o=this.domConverter.mapViewToDom(e);if(!o)return;const i=t.inlineFillerPosition,s=this.domConverter.mapViewToDom(e).childNodes,r=Array.from(this.domConverter.viewChildrenToDom(e,o.ownerDocument,{bind:!0}));i&&i.parent===e&&k(o.ownerDocument,r,i.offset);const n=this._diffNodeLists(s,r);let a=0;const d=new Set;for(const e of n)"delete"===e?(d.add(s[a]),l(s[a])):"equal"===e&&a++;a=0;for(const e of n)"insert"===e?(c(o,a,r[a]),a++):"equal"===e&&(this._markDescendantTextToSync(this.domConverter.domToView(r[a])),a++);for(const e of d)e.parentNode||this.domConverter.unbindDomElement(e)}_diffNodeLists(e,t){return e=function(e,t){const o=Array.from(e);if(0==o.length||!t)return o;o[o.length-1]==t&&o.pop();return o}(e,this._fakeSelectionContainer),Object(a.a)(e,t,_.bind(null,this.domConverter))}_findReplaceActions(e,t,o){if(-1===e.indexOf("insert")||-1===e.indexOf("delete"))return e;let i=[],s=[],r=[];const n={equal:0,insert:0,delete:0};for(const c of e)"insert"===c?r.push(o[n.equal+n.insert]):"delete"===c?s.push(t[n.equal+n.delete]):(i=i.concat(Object(a.a)(s,r,b).map(e=>"equal"===e?"replace":e)),i.push("equal"),s=[],r=[]),n[c]++;return i.concat(Object(a.a)(s,r,b).map(e=>"equal"===e?"replace":e))}_markDescendantTextToSync(e){if(e)if(e.is("$text"))this.markedTexts.add(e);else if(e.is("element"))for(const t of e.getChildren())this._markDescendantTextToSync(t)}_updateSelection(){if(f.a.isBlink&&!f.a.isAndroid&&this.isSelecting&&!this.markedChildren.size)return;if(0===this.selection.rangeCount)return this._removeDomSelection(),void this._removeFakeSelection();const e=this.domConverter.mapViewToDom(this.selection.editableElement);this.isFocused&&e&&(this.selection.isFake?this._updateFakeSelection(e):(this._removeFakeSelection(),this._updateDomSelection(e)))}_updateFakeSelection(e){const t=e.ownerDocument;this._fakeSelectionContainer||(this._fakeSelectionContainer=function(e){const t=e.createElement("div");return t.className="ck-fake-selection-container",Object.assign(t.style,{position:"fixed",top:0,left:"-9999px",width:"42px"}),t.textContent=" ",t}(t));const o=this._fakeSelectionContainer;if(this.domConverter.bindFakeSelection(o,this.selection),!this._fakeSelectionNeedsUpdate(e))return;o.parentElement&&o.parentElement==e||e.appendChild(o),o.textContent=this.selection.fakeSelectionLabel||" ";const i=t.getSelection(),s=t.createRange();i.removeAllRanges(),s.selectNodeContents(o),i.addRange(s)}_updateDomSelection(e){const t=e.ownerDocument.defaultView.getSelection();if(!this._domSelectionNeedsUpdate(t))return;const o=this.domConverter.viewPositionToDom(this.selection.anchor),i=this.domConverter.viewPositionToDom(this.selection.focus);t.collapse(o.parent,o.offset),t.extend(i.parent,i.offset),f.a.isGecko&&function(e,t){const o=e.parent;if(o.nodeType!=Node.ELEMENT_NODE||e.offset!=o.childNodes.length-1)return;const i=o.childNodes[e.offset];i&&"BR"==i.tagName&&t.addRange(t.getRangeAt(0))}(i,t)}_domSelectionNeedsUpdate(e){if(!this.domConverter.isDomSelectionCorrect(e))return!0;const t=e&&this.domConverter.domSelectionToView(e);return(!t||!this.selection.isEqual(t))&&!(!this.selection.isCollapsed&&this.selection.isSimilar(t))}_fakeSelectionNeedsUpdate(e){const t=this._fakeSelectionContainer,o=e.ownerDocument.getSelection();return!t||t.parentElement!==e||(o.anchorNode!==t&&!t.contains(o.anchorNode)||t.textContent!==this.selection.fakeSelectionLabel)}_removeDomSelection(){for(const e of this.domDocuments){if(e.getSelection().rangeCount){const t=e.activeElement,o=this.domConverter.mapDomToView(t);t&&o&&e.getSelection().removeAllRanges()}}}_removeFakeSelection(){const e=this._fakeSelectionContainer;e&&e.remove()}_updateFocus(){if(this.isFocused){const e=this.selection.editableElement;e&&this.domConverter.focus(e)}}}function k(e,t,o){const i=t instanceof Array?t:t.childNodes,s=i[o];if(Object(h.a)(s))return s.data=r.b+s.data,s;{const s=e.createTextNode(r.b);return Array.isArray(t)?i.splice(o,0,s):c(t,o,s),s}}function b(e,t){return Object(p.a)(e)&&Object(p.a)(t)&&!Object(h.a)(e)&&!Object(h.a)(t)&&e.nodeType!==Node.COMMENT_NODE&&t.nodeType!==Node.COMMENT_NODE&&e.tagName.toLowerCase()===t.tagName.toLowerCase()}function _(e,t,o){return t===o||(Object(h.a)(t)&&Object(h.a)(o)?t.data===o.data:!(!e.isBlockFiller(t)||!e.isBlockFiller(o)))}Object(n.a)(m,d.a)},"./packages/ckeditor5-engine/src/view/selection.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return h}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./packages/ckeditor5-engine/src/view/range.js"),r=o("./packages/ckeditor5-engine/src/view/position.js"),n=o("./packages/ckeditor5-utils/src/mix.js"),a=o("./packages/ckeditor5-utils/src/emittermixin.js"),c=o("./packages/ckeditor5-engine/src/view/node.js"),l=o("./packages/ckeditor5-utils/src/count.js"),d=o("./packages/ckeditor5-utils/src/isiterable.js"),u=o("./packages/ckeditor5-engine/src/view/documentselection.js");class h{constructor(e=null,t,o){this._ranges=[],this._lastRangeBackward=!1,this._isFake=!1,this._fakeSelectionLabel="",this.setTo(e,t,o)}get isFake(){return this._isFake}get fakeSelectionLabel(){return this._fakeSelectionLabel}get anchor(){if(!this._ranges.length)return null;const e=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?e.end:e.start).clone()}get focus(){if(!this._ranges.length)return null;const e=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?e.start:e.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 e of this._ranges)yield e.clone()}getFirstRange(){let e=null;for(const t of this._ranges)e&&!t.start.isBefore(e.start)||(e=t);return e?e.clone():null}getLastRange(){let e=null;for(const t of this._ranges)e&&!t.end.isAfter(e.end)||(e=t);return e?e.clone():null}getFirstPosition(){const e=this.getFirstRange();return e?e.start.clone():null}getLastPosition(){const e=this.getLastRange();return e?e.end.clone():null}isEqual(e){if(this.isFake!=e.isFake)return!1;if(this.isFake&&this.fakeSelectionLabel!=e.fakeSelectionLabel)return!1;if(this.rangeCount!=e.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(e.anchor)||!this.focus.isEqual(e.focus))return!1;for(const t of this._ranges){let o=!1;for(const i of e._ranges)if(t.isEqual(i)){o=!0;break}if(!o)return!1}return!0}isSimilar(e){if(this.isBackward!=e.isBackward)return!1;const t=Object(l.a)(this.getRanges());if(t!=Object(l.a)(e.getRanges()))return!1;if(0==t)return!0;for(let t of this.getRanges()){t=t.getTrimmed();let o=!1;for(let i of e.getRanges())if(i=i.getTrimmed(),t.start.isEqual(i.start)&&t.end.isEqual(i.end)){o=!0;break}if(!o)return!1}return!0}getSelectedElement(){return 1!==this.rangeCount?null:this.getFirstRange().getContainedElement()}setTo(e,t,o){if(null===e)this._setRanges([]),this._setFakeOptions(t);else if(e instanceof h||e instanceof u.a)this._setRanges(e.getRanges(),e.isBackward),this._setFakeOptions({fake:e.isFake,label:e.fakeSelectionLabel});else if(e instanceof s.a)this._setRanges([e],t&&t.backward),this._setFakeOptions(t);else if(e instanceof r.a)this._setRanges([new s.a(e)]),this._setFakeOptions(t);else if(e instanceof c.a){const n=!!o&&!!o.backward;let a;if(void 0===t)throw new i.a("view-selection-setto-required-second-parameter",this);a="in"==t?s.a._createIn(e):"on"==t?s.a._createOn(e):new s.a(r.a._createAt(e,t)),this._setRanges([a],n),this._setFakeOptions(o)}else{if(!Object(d.a)(e))throw new i.a("view-selection-setto-not-selectable",this);this._setRanges(e,t&&t.backward),this._setFakeOptions(t)}this.fire("change")}setFocus(e,t){if(null===this.anchor)throw new i.a("view-selection-setfocus-no-ranges",this);const o=r.a._createAt(e,t);if("same"==o.compareWith(this.focus))return;const n=this.anchor;this._ranges.pop(),"before"==o.compareWith(n)?this._addRange(new s.a(o,n),!0):this._addRange(new s.a(n,o)),this.fire("change")}is(e){return"selection"===e||"view:selection"===e}_setRanges(e,t=!1){e=Array.from(e),this._ranges=[];for(const t of e)this._addRange(t);this._lastRangeBackward=!!t}_setFakeOptions(e={}){this._isFake=!!e.fake,this._fakeSelectionLabel=e.fake&&e.label||""}_addRange(e,t=!1){if(!(e instanceof s.a))throw new i.a("view-selection-add-range-not-range",this);this._pushRange(e),this._lastRangeBackward=!!t}_pushRange(e){for(const t of this._ranges)if(e.isIntersecting(t))throw new i.a("view-selection-range-intersects",this,{addedRange:e,intersectingRange:t});this._ranges.push(new s.a(e.start,e.end))}}Object(n.a)(h,a.c)},"./packages/ckeditor5-engine/src/view/stylesmap.js":function(e,t,o){"use strict";o.d(t,"b",(function(){return ee})),o.d(t,"a",(function(){return te}));var i=o("./node_modules/lodash-es/isObject.js"),s=o("./node_modules/lodash-es/isArray.js"),r=o("./node_modules/lodash-es/isSymbol.js"),n=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;var c=function(e,t){if(Object(s.a)(e))return!1;var o=typeof e;return!("number"!=o&&"symbol"!=o&&"boolean"!=o&&null!=e&&!Object(r.a)(e))||(a.test(e)||!n.test(e)||null!=t&&e in Object(t))},l=o("./node_modules/lodash-es/_MapCache.js");function d(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var o=function(){var i=arguments,s=t?t.apply(this,i):i[0],r=o.cache;if(r.has(s))return r.get(s);var n=e.apply(this,i);return o.cache=r.set(s,n)||r,n};return o.cache=new(d.Cache||l.a),o}d.Cache=l.a;var u=d;var h=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,p=/\\(\\)?/g,g=function(e){var t=u(e,(function(e){return 500===o.size&&o.clear(),e})),o=t.cache;return t}((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(h,(function(e,o,i,s){t.push(i?s.replace(p,"$1"):o||e)})),t})),f=o("./node_modules/lodash-es/toString.js");var m=function(e,t){return Object(s.a)(e)?e:c(e,t)?[e]:g(Object(f.a)(e))};var k=function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0};var b=function(e){if("string"==typeof e||Object(r.a)(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t};var _=function(e,t){for(var o=0,i=(t=m(t,e)).length;null!=e&&o<i;)e=e[b(t[o++])];return o&&o==i?e:void 0};var w=function(e,t,o){var i=-1,s=e.length;t<0&&(t=-t>s?0:s+t),(o=o>s?s:o)<0&&(o+=s),s=t>o?0:o-t>>>0,t>>>=0;for(var r=Array(s);++i<s;)r[i]=e[i+t];return r};var v=function(e,t){return t.length<2?e:_(e,w(t,0,-1))};var y=function(e,t){return t=m(t,e),null==(e=v(e,t))||delete e[b(k(t))]};var j=function(e,t){return null==e||y(e,t)};var x=function(e,t,o){var i=null==e?void 0:_(e,t);return void 0===i?o:i},P=o("./node_modules/lodash-es/_Stack.js"),O=o("./node_modules/lodash-es/_baseAssignValue.js"),A=o("./node_modules/lodash-es/eq.js");var T=function(e,t,o){(void 0!==o&&!Object(A.a)(e[t],o)||void 0===o&&!(t in e))&&Object(O.a)(e,t,o)};var C=function(e){return function(t,o,i){for(var s=-1,r=Object(t),n=i(t),a=n.length;a--;){var c=n[e?a:++s];if(!1===o(r[c],c,r))break}return t}}(),E=o("./node_modules/lodash-es/_cloneBuffer.js"),S=o("./node_modules/lodash-es/_cloneTypedArray.js"),R=o("./node_modules/lodash-es/_copyArray.js"),M=o("./node_modules/lodash-es/_initCloneObject.js"),N=o("./node_modules/lodash-es/isArguments.js"),I=o("./node_modules/lodash-es/isArrayLike.js"),z=o("./node_modules/lodash-es/isObjectLike.js");var V=function(e){return Object(z.a)(e)&&Object(I.a)(e)},D=o("./node_modules/lodash-es/isBuffer.js"),B=o("./node_modules/lodash-es/isFunction.js"),F=o("./node_modules/lodash-es/isPlainObject.js"),L=o("./node_modules/lodash-es/isTypedArray.js");var W=function(e,t){if(("constructor"!==t||"function"!=typeof e[t])&&"__proto__"!=t)return e[t]},H=o("./node_modules/lodash-es/_copyObject.js"),q=o("./node_modules/lodash-es/keysIn.js");var $=function(e){return Object(H.a)(e,Object(q.a)(e))};var U=function(e,t,o,r,n,a,c){var l=W(e,o),d=W(t,o),u=c.get(d);if(u)T(e,o,u);else{var h=a?a(l,d,o+"",e,t,c):void 0,p=void 0===h;if(p){var g=Object(s.a)(d),f=!g&&Object(D.a)(d),m=!g&&!f&&Object(L.a)(d);h=d,g||f||m?Object(s.a)(l)?h=l:V(l)?h=Object(R.a)(l):f?(p=!1,h=Object(E.a)(d,!0)):m?(p=!1,h=Object(S.a)(d,!0)):h=[]:Object(F.a)(d)||Object(N.a)(d)?(h=l,Object(N.a)(l)?h=$(l):Object(i.a)(l)&&!Object(B.a)(l)||(h=Object(M.a)(d))):p=!1}p&&(c.set(d,h),n(h,d,r,a,c),c.delete(d)),T(e,o,h)}};var K=function e(t,o,s,r,n){t!==o&&C(o,(function(a,c){if(n||(n=new P.a),Object(i.a)(a))U(t,o,c,s,e,r,n);else{var l=r?r(W(t,c),a,c+"",t,o,n):void 0;void 0===l&&(l=a),T(t,c,l)}}),q.a)},G=o("./node_modules/lodash-es/_createAssigner.js"),J=Object(G.a)((function(e,t,o){K(e,t,o)})),Y=o("./node_modules/lodash-es/_assignValue.js"),X=o("./node_modules/lodash-es/_isIndex.js");var Z=function(e,t,o,s){if(!Object(i.a)(e))return e;for(var r=-1,n=(t=m(t,e)).length,a=n-1,c=e;null!=c&&++r<n;){var l=b(t[r]),d=o;if("__proto__"===l||"constructor"===l||"prototype"===l)return e;if(r!=a){var u=c[l];void 0===(d=s?s(u,l,c):void 0)&&(d=Object(i.a)(u)?u:Object(X.a)(t[r+1])?[]:{})}Object(Y.a)(c,l,d),c=c[l]}return e};var Q=function(e,t,o){return null==e?e:Z(e,t,o)};class ee{constructor(e){this._styles={},this._styleProcessor=e}get isEmpty(){const e=Object.entries(this._styles);return!Array.from(e).length}get size(){return this.isEmpty?0:this.getStyleNames().length}setTo(e){this.clear();const t=Array.from(function(e){let t=null,o=0,i=0,s=null;const r=new Map;if(""===e)return r;";"!=e.charAt(e.length-1)&&(e+=";");for(let n=0;n<e.length;n++){const a=e.charAt(n);if(null===t)switch(a){case":":s||(s=e.substr(o,n-o),i=n+1);break;case'"':case"'":t=a;break;case";":{const t=e.substr(i,n-i);s&&r.set(s.trim(),t.trim()),s=null,o=n+1;break}}else a===t&&(t=null)}return r}(e).entries());for(const[e,o]of t)this._styleProcessor.toNormalizedForm(e,o,this._styles)}has(e){if(this.isEmpty)return!1;const t=this._styleProcessor.getReducedForm(e,this._styles).find(([t])=>t===e);return Array.isArray(t)}set(e,t){if(Object(i.a)(e))for(const[t,o]of Object.entries(e))this._styleProcessor.toNormalizedForm(t,o,this._styles);else this._styleProcessor.toNormalizedForm(e,t,this._styles)}remove(e){const t=oe(e);j(this._styles,t),delete this._styles[e],this._cleanEmptyObjectsOnPath(t)}getNormalized(e){return this._styleProcessor.getNormalized(e,this._styles)}toString(){return this.isEmpty?"":this._getStylesEntries().map(e=>e.join(":")).sort().join(";")+";"}getAsString(e){if(this.isEmpty)return;if(this._styles[e]&&!Object(i.a)(this._styles[e]))return this._styles[e];const t=this._styleProcessor.getReducedForm(e,this._styles).find(([t])=>t===e);return Array.isArray(t)?t[1]:void 0}getStyleNames(e=!1){if(this.isEmpty)return[];if(e)return this._styleProcessor.getStyleNames(this._styles);return this._getStylesEntries().map(([e])=>e)}clear(){this._styles={}}_getStylesEntries(){const e=[],t=Object.keys(this._styles);for(const o of t)e.push(...this._styleProcessor.getReducedForm(o,this._styles));return e}_cleanEmptyObjectsOnPath(e){const t=e.split(".");if(!(t.length>1))return;const o=t.splice(0,t.length-1).join("."),i=x(this._styles,o);if(!i)return;!Array.from(Object.keys(i)).length&&this.remove(o)}}class te{constructor(){this._normalizers=new Map,this._extractors=new Map,this._reducers=new Map,this._consumables=new Map}toNormalizedForm(e,t,o){if(Object(i.a)(t))ie(o,oe(e),t);else if(this._normalizers.has(e)){const i=this._normalizers.get(e),{path:s,value:r}=i(t);ie(o,s,r)}else ie(o,e,t)}getNormalized(e,t){if(!e)return J({},t);if(void 0!==t[e])return t[e];if(this._extractors.has(e)){const o=this._extractors.get(e);if("string"==typeof o)return x(t,o);const i=o(e,t);if(i)return i}return x(t,oe(e))}getReducedForm(e,t){const o=this.getNormalized(e,t);if(void 0===o)return[];if(this._reducers.has(e)){return this._reducers.get(e)(o)}return[[e,o]]}getStyleNames(e){const t=Array.from(this._consumables.keys()).filter(t=>{const o=this.getNormalized(t,e);return o&&"object"==typeof o?Object.keys(o).length:o}),o=new Set([...t,...Object.keys(e)]);return Array.from(o.values())}getRelatedStyles(e){return this._consumables.get(e)||[]}setNormalizer(e,t){this._normalizers.set(e,t)}setExtractor(e,t){this._extractors.set(e,t)}setReducer(e,t){this._reducers.set(e,t)}setStyleRelation(e,t){this._mapStyleNames(e,t);for(const o of t)this._mapStyleNames(o,[e])}_mapStyleNames(e,t){this._consumables.has(e)||this._consumables.set(e,[]),this._consumables.get(e).push(...t)}}function oe(e){return e.replace("-",".")}function ie(e,t,o){let s=o;Object(i.a)(o)&&(s=J({},x(e,t),o)),Q(e,t,s)}},"./packages/ckeditor5-engine/src/view/text.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-engine/src/view/node.js");class s extends i.a{constructor(e,t){super(e),this._textData=t}is(e){return"$text"===e||"view:$text"===e||"text"===e||"view:text"===e||"node"===e||"view:node"===e}get data(){return this._textData}get _data(){return this.data}set _data(e){this._fireChange("text",this),this._textData=e}isSimilar(e){return e instanceof s&&(this===e||this.data===e.data)}_clone(){return new s(this.document,this.data)}}},"./packages/ckeditor5-engine/src/view/textproxy.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class s{constructor(e,t,o){if(this.textNode=e,t<0||t>e.data.length)throw new i.a("view-textproxy-wrong-offsetintext",this);if(o<0||t+o>e.data.length)throw new i.a("view-textproxy-wrong-length",this);this.data=e.data.substring(t,t+o),this.offsetInText=t}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(e){return"$textProxy"===e||"view:$textProxy"===e||"textProxy"===e||"view:textProxy"===e}getAncestors(e={includeSelf:!1,parentFirst:!1}){const t=[];let o=e.includeSelf?this.textNode:this.parent;for(;null!==o;)t[e.parentFirst?"push":"unshift"](o),o=o.parent;return t}}},"./packages/ckeditor5-engine/src/view/treewalker.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-engine/src/view/element.js"),s=o("./packages/ckeditor5-engine/src/view/text.js"),r=o("./packages/ckeditor5-engine/src/view/textproxy.js"),n=o("./packages/ckeditor5-engine/src/view/position.js"),a=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class c{constructor(e={}){if(!e.boundaries&&!e.startPosition)throw new a.a("view-tree-walker-no-start-position",null);if(e.direction&&"forward"!=e.direction&&"backward"!=e.direction)throw new a.a("view-tree-walker-unknown-direction",e.startPosition,{direction:e.direction});this.boundaries=e.boundaries||null,e.startPosition?this.position=n.a._createAt(e.startPosition):this.position=n.a._createAt(e.boundaries["backward"==e.direction?"end":"start"]),this.direction=e.direction||"forward",this.singleCharacters=!!e.singleCharacters,this.shallow=!!e.shallow,this.ignoreElementEnd=!!e.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null}[Symbol.iterator](){return this}skip(e){let t,o,i;do{i=this.position,({done:t,value:o}=this.next())}while(!t&&e(o));t||(this.position=i)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){let e=this.position.clone();const t=this.position,o=e.parent;if(null===o.parent&&e.offset===o.childCount)return{done:!0};if(o===this._boundaryEndParent&&e.offset==this.boundaries.end.offset)return{done:!0};let a;if(o instanceof s.a){if(e.isAtEnd)return this.position=n.a._createAfter(o),this._next();a=o.data[e.offset]}else a=o.getChild(e.offset);if(a instanceof i.a)return this.shallow?e.offset++:e=new n.a(a,0),this.position=e,this._formatReturnValue("elementStart",a,t,e,1);if(a instanceof s.a){if(this.singleCharacters)return e=new n.a(a,0),this.position=e,this._next();{let o,i=a.data.length;return a==this._boundaryEndParent?(i=this.boundaries.end.offset,o=new r.a(a,0,i),e=n.a._createAfter(o)):(o=new r.a(a,0,a.data.length),e.offset++),this.position=e,this._formatReturnValue("text",o,t,e,i)}}if("string"==typeof a){let i;if(this.singleCharacters)i=1;else{i=(o===this._boundaryEndParent?this.boundaries.end.offset:o.data.length)-e.offset}const s=new r.a(o,e.offset,i);return e.offset+=i,this.position=e,this._formatReturnValue("text",s,t,e,i)}return e=n.a._createAfter(o),this.position=e,this.ignoreElementEnd?this._next():this._formatReturnValue("elementEnd",o,t,e)}_previous(){let e=this.position.clone();const t=this.position,o=e.parent;if(null===o.parent&&0===e.offset)return{done:!0};if(o==this._boundaryStartParent&&e.offset==this.boundaries.start.offset)return{done:!0};let a;if(o instanceof s.a){if(e.isAtStart)return this.position=n.a._createBefore(o),this._previous();a=o.data[e.offset-1]}else a=o.getChild(e.offset-1);if(a instanceof i.a)return this.shallow?(e.offset--,this.position=e,this._formatReturnValue("elementStart",a,t,e,1)):(e=new n.a(a,a.childCount),this.position=e,this.ignoreElementEnd?this._previous():this._formatReturnValue("elementEnd",a,t,e));if(a instanceof s.a){if(this.singleCharacters)return e=new n.a(a,a.data.length),this.position=e,this._previous();{let o,i=a.data.length;if(a==this._boundaryStartParent){const t=this.boundaries.start.offset;o=new r.a(a,t,a.data.length-t),i=o.data.length,e=n.a._createBefore(o)}else o=new r.a(a,0,a.data.length),e.offset--;return this.position=e,this._formatReturnValue("text",o,t,e,i)}}if("string"==typeof a){let i;if(this.singleCharacters)i=1;else{const t=o===this._boundaryStartParent?this.boundaries.start.offset:0;i=e.offset-t}e.offset-=i;const s=new r.a(o,e.offset,i);return this.position=e,this._formatReturnValue("text",s,t,e,i)}return e=n.a._createBefore(o),this.position=e,this._formatReturnValue("elementStart",o,t,e,1)}_formatReturnValue(e,t,o,i,s){return t instanceof r.a&&(t.offsetInText+t.data.length==t.textNode.data.length&&("forward"!=this.direction||this.boundaries&&this.boundaries.end.isEqual(this.position)?o=n.a._createAfter(t.textNode):(i=n.a._createAfter(t.textNode),this.position=i)),0===t.offsetInText&&("backward"!=this.direction||this.boundaries&&this.boundaries.start.isEqual(this.position)?o=n.a._createBefore(t.textNode):(i=n.a._createBefore(t.textNode),this.position=i))),{done:!1,value:{type:e,item:t,previousPosition:o,nextPosition:i,length:s}}}}},"./packages/ckeditor5-engine/src/view/uielement.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a})),o.d(t,"b",(function(){return c}));var i=o("./packages/ckeditor5-engine/src/view/element.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),r=o("./packages/ckeditor5-engine/src/view/node.js"),n=o("./packages/ckeditor5-utils/src/keyboard.js");class a extends i.a{constructor(e,t,o,i){super(e,t,o,i),this._isAllowedInsideAttributeElement=!0,this.getFillerOffset=l}is(e,t=null){return t?t===this.name&&("uiElement"===e||"view:uiElement"===e||"element"===e||"view:element"===e):"uiElement"===e||"view:uiElement"===e||"element"===e||"view:element"===e||"node"===e||"view:node"===e}_insertChild(e,t){if(t&&(t instanceof r.a||Array.from(t).length>0))throw new s.a("view-uielement-cannot-add",this)}render(e){return this.toDomElement(e)}toDomElement(e){const t=e.createElement(this.name);for(const e of this.getAttributeKeys())t.setAttribute(e,this.getAttribute(e));return t}}function c(e){e.document.on("arrowKey",(t,o)=>function(e,t,o){if(t.keyCode==n.f.arrowright){const e=t.domTarget.ownerDocument.defaultView.getSelection(),i=1==e.rangeCount&&e.getRangeAt(0).collapsed;if(i||t.shiftKey){const t=e.focusNode,s=e.focusOffset,r=o.domPositionToView(t,s);if(null===r)return;let n=!1;const a=r.getLastMatchingPosition(e=>(e.item.is("uiElement")&&(n=!0),!(!e.item.is("uiElement")&&!e.item.is("attributeElement"))));if(n){const t=o.viewPositionToDom(a);i?e.collapse(t.parent,t.offset):e.extend(t.parent,t.offset)}}}}(0,o,e.domConverter),{priority:"low"})}function l(){return null}},"./packages/ckeditor5-engine/theme/placeholder.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-engine/theme/placeholder.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-engine/theme/renderer.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-engine/theme/renderer.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-enter/src/enter.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return l}));var i=o("./packages/ckeditor5-core/src/plugin.js"),s=o("./packages/ckeditor5-core/src/command.js"),r=o("./packages/ckeditor5-enter/src/utils.js");class n extends s.a{execute(){const e=this.editor.model,t=e.document;e.change(o=>{!function(e,t,o,i){const s=o.isCollapsed,n=o.getFirstRange(),c=n.start.parent,l=n.end.parent;if(i.isLimit(c)||i.isLimit(l))return void(s||c!=l||e.deleteContent(o));if(s){const e=Object(r.a)(t.model.schema,o.getAttributes());a(t,n.start),t.setSelectionAttribute(e)}else{const i=!(n.start.isAtStart&&n.end.isAtEnd),s=c==l;e.deleteContent(o,{leaveUnmerged:i}),i&&(s?a(t,o.focus):t.setSelection(l,0))}}(this.editor.model,o,t.selection,e.schema),this.fire("afterExecute",{writer:o})})}}function a(e,t){e.split(t),e.setSelection(t.parent.nextSibling,0)}var c=o("./packages/ckeditor5-enter/src/enterobserver.js");class l extends i.a{static get pluginName(){return"Enter"}init(){const e=this.editor,t=e.editing.view,o=t.document;t.addObserver(c.a),e.commands.add("enter",new n(e)),this.listenTo(o,"enter",(o,i)=>{i.preventDefault(),i.isSoft||(e.execute("enter"),t.scrollToTheSelection())},{priority:"low"})}}},"./packages/ckeditor5-enter/src/enterobserver.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-engine/src/view/observer/observer.js"),s=o("./packages/ckeditor5-engine/src/view/observer/domeventdata.js"),r=o("./packages/ckeditor5-engine/src/view/observer/bubblingeventinfo.js"),n=o("./packages/ckeditor5-utils/src/keyboard.js");class a extends i.a{constructor(e){super(e);const t=this.document;t.on("keydown",(e,o)=>{if(this.isEnabled&&o.keyCode==n.f.enter){const i=new r.a(t,"enter",t.selection.getFirstRange());t.fire(i,new s.a(t,o.domEvent,{isSoft:o.shiftKey})),i.stop.called&&e.stop()}})}observe(){}}},"./packages/ckeditor5-enter/src/utils.js":function(e,t,o){"use strict";function*i(e,t){for(const o of t)o&&e.getAttributeProperties(o[0]).copyOnEnter&&(yield o)}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-typing/src/delete.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return g}));var i=o("./packages/ckeditor5-core/src/plugin.js"),s=o("./packages/ckeditor5-core/src/command.js"),r=o("./packages/ckeditor5-utils/src/count.js"),n=o("./packages/ckeditor5-typing/src/utils/changebuffer.js");class a extends s.a{constructor(e,t){super(e),this.direction=t,this._buffer=new n.a(e.model,e.config.get("typing.undoStep"))}get buffer(){return this._buffer}execute(e={}){const t=this.editor.model,o=t.document;t.enqueueChange(this._buffer.batch,i=>{this._buffer.lock();const s=i.createSelection(e.selection||o.selection),n=e.sequence||1,a=s.isCollapsed;if(s.isCollapsed&&t.modifySelection(s,{direction:this.direction,unit:e.unit}),this._shouldEntireContentBeReplacedWithParagraph(n))return void this._replaceEntireContentWithParagraph(i);if(this._shouldReplaceFirstBlockWithParagraph(s,n))return void this.editor.execute("paragraph",{selection:s});if(s.isCollapsed)return;let c=0;s.getFirstRange().getMinimalFlatRanges().forEach(e=>{c+=Object(r.a)(e.getWalker({singleCharacters:!0,ignoreElementEnd:!0,shallow:!0}))}),t.deleteContent(s,{doNotResetEntireContent:a,direction:this.direction}),this._buffer.input(c),i.setSelection(s),this._buffer.unlock()})}_shouldEntireContentBeReplacedWithParagraph(e){if(e>1)return!1;const t=this.editor.model,o=t.document.selection,i=t.schema.getLimitElement(o);if(!(o.isCollapsed&&o.containsEntireContent(i)))return!1;if(!t.schema.checkChild(i,"paragraph"))return!1;const s=i.getChild(0);return!s||"paragraph"!==s.name}_replaceEntireContentWithParagraph(e){const t=this.editor.model,o=t.document.selection,i=t.schema.getLimitElement(o),s=e.createElement("paragraph");e.remove(e.createRangeIn(i)),e.insert(s,i),e.setSelection(s,0)}_shouldReplaceFirstBlockWithParagraph(e,t){const o=this.editor.model;if(t>1||"backward"!=this.direction)return!1;if(!e.isCollapsed)return!1;const i=e.getFirstPosition(),s=o.schema.getLimitElement(i),r=s.getChild(0);return i.parent==r&&(!!e.containsEntireContent(r)&&(!!o.schema.checkChild(s,"paragraph")&&"paragraph"!=r.name))}}var c=o("./packages/ckeditor5-engine/src/view/observer/observer.js"),l=o("./packages/ckeditor5-engine/src/view/observer/domeventdata.js"),d=o("./packages/ckeditor5-engine/src/view/observer/bubblingeventinfo.js"),u=o("./packages/ckeditor5-utils/src/keyboard.js"),h=o("./packages/ckeditor5-utils/src/env.js");class p extends c.a{constructor(e){super(e);const t=e.document;let o=0;function i(e,o,i){const s=new d.a(t,"delete",t.selection.getFirstRange());t.fire(s,new l.a(t,o,i)),s.stop.called&&e.stop()}t.on("keyup",(e,t)=>{t.keyCode!=u.f.delete&&t.keyCode!=u.f.backspace||(o=0)}),t.on("keydown",(e,t)=>{const s={};if(t.keyCode==u.f.delete)s.direction="forward",s.unit="character";else{if(t.keyCode!=u.f.backspace)return;s.direction="backward",s.unit="codePoint"}const r=h.a.isMac?t.altKey:t.ctrlKey;s.unit=r?"word":s.unit,s.sequence=++o,i(e,t.domEvent,s)}),h.a.isAndroid&&t.on("beforeinput",(t,o)=>{if("deleteContentBackward"!=o.domEvent.inputType)return;const s={unit:"codepoint",direction:"backward",sequence:1},r=o.domTarget.ownerDocument.defaultView.getSelection();r.anchorNode==r.focusNode&&r.anchorOffset+1!=r.focusOffset&&(s.selectionToRemove=e.domConverter.domSelectionToView(r)),i(t,o.domEvent,s)})}observe(){}}class g extends i.a{static get pluginName(){return"Delete"}init(){const e=this.editor,t=e.editing.view,o=t.document,i=e.model.document;t.addObserver(p),this._undoOnBackspace=!1;const s=new a(e,"forward");if(e.commands.add("deleteForward",s),e.commands.add("forwardDelete",s),e.commands.add("delete",new a(e,"backward")),this.listenTo(o,"delete",(o,i)=>{const s={unit:i.unit,sequence:i.sequence};if(i.selectionToRemove){const t=e.model.createSelection(),o=[];for(const t of i.selectionToRemove.getRanges())o.push(e.editing.mapper.toModelRange(t));t.setTo(o),s.selection=t}e.execute("forward"==i.direction?"deleteForward":"delete",s),i.preventDefault(),t.scrollToTheSelection()},{priority:"low"}),h.a.isAndroid){let e=null;this.listenTo(o,"delete",(t,o)=>{const i=o.domTarget.ownerDocument.defaultView.getSelection();e={anchorNode:i.anchorNode,anchorOffset:i.anchorOffset,focusNode:i.focusNode,focusOffset:i.focusOffset}},{priority:"lowest"}),this.listenTo(o,"keyup",(t,o)=>{if(e){const t=o.domTarget.ownerDocument.defaultView.getSelection();t.collapse(e.anchorNode,e.anchorOffset),t.extend(e.focusNode,e.focusOffset),e=null}})}this.editor.plugins.has("UndoEditing")&&(this.listenTo(o,"delete",(t,o)=>{this._undoOnBackspace&&"backward"==o.direction&&1==o.sequence&&"codePoint"==o.unit&&(this._undoOnBackspace=!1,e.execute("undo"),o.preventDefault(),t.stop())},{context:"$capture"}),this.listenTo(i,"change",()=>{this._undoOnBackspace=!1}))}requestUndoOnBackspace(){this.editor.plugins.has("UndoEditing")&&(this._undoOnBackspace=!0)}}},"./packages/ckeditor5-typing/src/utils/changebuffer.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return i}));class i{constructor(e,t=20){this.model=e,this.size=0,this.limit=t,this.isLocked=!1,this._changeCallback=(e,t)=>{"transparent"!=t.type&&t!==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(e){this.size+=e,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(e){this.isLocked&&!e||(this._batch=null,this.size=0)}}},"./packages/ckeditor5-typing/src/utils/injectunsafekeystrokeshandling.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r})),o.d(t,"b",(function(){return a}));var i=o("./packages/ckeditor5-utils/src/keyboard.js"),s=o("./packages/ckeditor5-utils/src/env.js");function r(e){let t=null;const o=e.model,i=e.editing.view,r=e.commands.get("input");function n(e){const s=o.document,n=i.document.isComposing,l=t&&t.isEqual(s.selection);t=null,r.isEnabled&&(a(e)||s.selection.isCollapsed||n&&229===e.keyCode||!n&&229===e.keyCode&&l||c())}function c(){const e=r.buffer;e.lock();const t=e.batch;r._batches.add(t),o.enqueueChange(t,()=>{o.deleteContent(o.document.selection)}),e.unlock()}s.a.isAndroid?i.document.on("beforeinput",(e,t)=>n(t),{priority:"lowest"}):i.document.on("keydown",(e,t)=>n(t),{priority:"lowest"}),i.document.on("compositionstart",(function(){const e=o.document,t=1!==e.selection.rangeCount||e.selection.getFirstRange().isFlat;if(e.selection.isCollapsed||t)return;c()}),{priority:"lowest"}),i.document.on("compositionend",()=>{t=o.createSelection(o.document.selection)},{priority:"lowest"})}const n=[Object(i.a)("arrowUp"),Object(i.a)("arrowRight"),Object(i.a)("arrowDown"),Object(i.a)("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 e=112;e<=135;e++)n.push(e);function a(e){return!(!e.ctrlKey&&!e.metaKey)||n.includes(e.keyCode)}},"./packages/ckeditor5-ui/src/bindings/clickoutsidehandler.js":function(e,t,o){"use strict";function i({emitter:e,activator:t,callback:o,contextElements:i}){e.listenTo(document,"mousedown",(e,s)=>{if(!t())return;const r="function"==typeof s.composedPath?s.composedPath():[];for(const e of i)if(e.contains(s.target)||r.includes(e))return;o()})}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-ui/src/button/buttonview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-ui/src/view.js"),s=o("./packages/ckeditor5-ui/src/icon/iconview.js"),r=o("./packages/ckeditor5-ui/src/tooltip/tooltipview.js"),n=o("./packages/ckeditor5-utils/src/uid.js"),a=o("./packages/ckeditor5-utils/src/keyboard.js");o("./packages/ckeditor5-ui/theme/components/button/button.css");class c extends i.a{constructor(e){super(e);const t=this.bindTemplate,o=Object(n.a)();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(o),this.iconView=new s.a,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",t.to("class"),t.if("isEnabled","ck-disabled",e=>!e),t.if("isVisible","ck-hidden",e=>!e),t.to("isOn",e=>e?"ck-on":"ck-off"),t.if("withText","ck-button_with-text"),t.if("withKeystroke","ck-button_with-keystroke")],type:t.to("type",e=>e||"button"),tabindex:t.to("tabindex"),"aria-labelledby":"ck-editor__aria-label_"+o,"aria-disabled":t.if("isEnabled",!0,e=>!e),"aria-pressed":t.to("isOn",e=>!!this.isToggleable&&String(e))},children:this.children,on:{mousedown:t.to(e=>{e.preventDefault()}),click:t.to(e=>{this.isEnabled?this.fire("execute"):e.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.keystroke&&this.children.add(this.keystrokeView)}focus(){this.element.focus()}_createTooltipView(){const e=new r.a;return e.bind("text").to(this,"_tooltipString"),e.bind("position").to(this,"tooltipPosition"),e}_createLabelView(e){const t=new i.a,o=this.bindTemplate;return t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__label"],style:o.to("labelStyle"),id:"ck-editor__aria-label_"+e},children:[{text:this.bindTemplate.to("label")}]}),t}_createKeystrokeView(){const e=new i.a;return e.setTemplate({tag:"span",attributes:{class:["ck","ck-button__keystroke"]},children:[{text:this.bindTemplate.to("keystroke",e=>Object(a.b)(e))}]}),e}_getTooltipString(e,t,o){return e?"string"==typeof e?e:(o&&(o=Object(a.b)(o)),e instanceof Function?e(t,o):`${t}${o?` (${o})`:""}`):""}}},"./packages/ckeditor5-ui/src/button/switchbuttonview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-ui/src/view.js"),s=o("./packages/ckeditor5-ui/src/button/buttonview.js");o("./packages/ckeditor5-ui/theme/components/button/switchbutton.css");class r extends s.a{constructor(e){super(e),this.isToggleable=!0,this.toggleSwitchView=this._createToggleView(),this.extendTemplate({attributes:{class:"ck-switchbutton"}})}render(){super.render(),this.children.add(this.toggleSwitchView)}_createToggleView(){const e=new i.a;return e.setTemplate({tag:"span",attributes:{class:["ck","ck-button__toggle"]},children:[{tag:"span",attributes:{class:["ck","ck-button__toggle__inner"]}}]}),e}}},"./packages/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return n}));var i=o("./packages/ckeditor5-ui/src/button/buttonview.js"),s=o("./packages/ckeditor5-ui/theme/icons/dropdown-arrow.svg"),r=o("./packages/ckeditor5-ui/src/icon/iconview.js");class n extends i.a{constructor(e){super(e),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 e=new r.a;return e.content=s.a,e.extendTemplate({attributes:{class:"ck-dropdown__arrow"}}),e}}},"./packages/ckeditor5-ui/src/dropdown/utils.js":function(e,t,o){"use strict";o.d(t,"c",(function(){return m})),o.d(t,"b",(function(){return k})),o.d(t,"a",(function(){return b}));var i=o("./packages/ckeditor5-ui/src/view.js");class s extends i.a{constructor(e){super(e);const t=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",t.to("position",e=>"ck-dropdown__panel_"+e),t.if("isVisible","ck-dropdown__panel-visible")]},children:this.children,on:{selectstart:t.to(e=>e.preventDefault())}})}focus(){this.children.length&&this.children.first.focus()}focusLast(){if(this.children.length){const e=this.children.last;"function"==typeof e.focusLast?e.focusLast():e.focus()}}}var r=o("./packages/ckeditor5-utils/src/keystrokehandler.js"),n=(o("./packages/ckeditor5-ui/theme/components/dropdown/dropdown.css"),o("./packages/ckeditor5-utils/src/dom/position.js"));class a extends i.a{constructor(e,t,o){super(e);const i=this.bindTemplate;this.buttonView=t,this.panelView=o,this.set("isOpen",!1),this.set("isEnabled",!0),this.set("class"),this.set("id"),this.set("panelPosition","auto"),this.keystrokes=new r.a,this.setTemplate({tag:"div",attributes:{class:["ck","ck-dropdown",i.to("class"),i.if("isEnabled","ck-disabled",e=>!e)],id:i.to("id"),"aria-describedby":i.to("ariaDescribedById")},children:[t,o]}),t.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=a._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);const e=(e,t)=>{this.isOpen&&(this.buttonView.focus(),this.isOpen=!1,t())};this.keystrokes.set("arrowdown",(e,t)=>{this.buttonView.isEnabled&&!this.isOpen&&(this.isOpen=!0,t())}),this.keystrokes.set("arrowright",(e,t)=>{this.isOpen&&t()}),this.keystrokes.set("arrowleft",e),this.keystrokes.set("esc",e)}focus(){this.buttonView.focus()}get _panelPositions(){const{south:e,north:t,southEast:o,southWest:i,northEast:s,northWest:r,southMiddleEast:n,southMiddleWest:c,northMiddleEast:l,northMiddleWest:d}=a.defaultPanelPositions;return"rtl"!==this.locale.uiLanguageDirection?[o,i,n,c,e,s,r,l,d,t]:[i,o,c,n,e,r,s,d,l,t]}}a.defaultPanelPositions={south:(e,t)=>({top:e.bottom,left:e.left-(t.width-e.width)/2,name:"s"}),southEast:e=>({top:e.bottom,left:e.left,name:"se"}),southWest:(e,t)=>({top:e.bottom,left:e.left-t.width+e.width,name:"sw"}),southMiddleEast:(e,t)=>({top:e.bottom,left:e.left-(t.width-e.width)/4,name:"sme"}),southMiddleWest:(e,t)=>({top:e.bottom,left:e.left-3*(t.width-e.width)/4,name:"smw"}),north:(e,t)=>({top:e.top-t.height,left:e.left-(t.width-e.width)/2,name:"n"}),northEast:(e,t)=>({top:e.top-t.height,left:e.left,name:"ne"}),northWest:(e,t)=>({top:e.top-t.height,left:e.left-t.width+e.width,name:"nw"}),northMiddleEast:(e,t)=>({top:e.top-t.height,left:e.left-(t.width-e.width)/4,name:"nme"}),northMiddleWest:(e,t)=>({top:e.top-t.height,left:e.left-3*(t.width-e.width)/4,name:"nmw"})},a._getOptimalPosition=n.a;var c=o("./packages/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js"),l=o("./packages/ckeditor5-ui/src/toolbar/toolbarview.js"),d=o("./packages/ckeditor5-ui/src/list/listview.js"),u=o("./packages/ckeditor5-ui/src/list/listitemview.js");class h extends i.a{constructor(e){super(e),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__separator"]}})}}var p=o("./packages/ckeditor5-ui/src/button/buttonview.js"),g=o("./packages/ckeditor5-ui/src/button/switchbuttonview.js"),f=o("./packages/ckeditor5-ui/src/bindings/clickoutsidehandler.js");o("./packages/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css"),o("./packages/ckeditor5-ui/theme/components/dropdown/listdropdown.css");function m(e,t=c.a){const o=new t(e),i=new s(e),r=new a(e,o,i);return o.bind("isEnabled").to(r),o instanceof c.a?o.bind("isOn").to(r,"isOpen"):o.arrowView.bind("isOn").to(r,"isOpen"),function(e){(function(e){e.on("render",()=>{Object(f.a)({emitter:e,activator:()=>e.isOpen,callback:()=>{e.isOpen=!1},contextElements:[e.element]})})})(e),function(e){e.on("execute",t=>{t.source instanceof g.a||(e.isOpen=!1)})}(e),function(e){e.keystrokes.set("arrowdown",(t,o)=>{e.isOpen&&(e.panelView.focus(),o())}),e.keystrokes.set("arrowup",(t,o)=>{e.isOpen&&(e.panelView.focusLast(),o())})}(e)}(r),r}function k(e,t){const o=e.locale,i=o.t,s=e.toolbarView=new l.a(o);s.set("ariaLabel",i("Dropdown toolbar")),e.extendTemplate({attributes:{class:["ck-toolbar-dropdown"]}}),t.map(e=>s.items.add(e)),e.panelView.children.add(s),s.items.delegate("execute").to(e)}function b(e,t){const o=e.locale,i=e.listView=new d.a(o);i.items.bindTo(t).using(({type:e,model:t})=>{if("separator"===e)return new h(o);if("button"===e||"switchbutton"===e){const i=new u.a(o);let s;return s="button"===e?new p.a(o):new g.a(o),s.bind(...Object.keys(t)).to(t),s.delegate("execute").to(i),i.children.add(s),i}}),e.panelView.children.add(i),i.items.delegate("execute").to(e)}},"./packages/ckeditor5-ui/src/focuscycler.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-utils/src/dom/global.js");class s{constructor(e){if(Object.assign(this,e),e.actions&&e.keystrokeHandler)for(const t in e.actions){let o=e.actions[t];"string"==typeof o&&(o=[o]);for(const i of o)e.keystrokeHandler.set(i,(e,o)=>{this[t](),o()})}}get first(){return this.focusables.find(r)||null}get last(){return this.focusables.filter(r).slice(-1)[0]||null}get next(){return this._getFocusableItem(1)}get previous(){return this._getFocusableItem(-1)}get current(){let e=null;return null===this.focusTracker.focusedElement?null:(this.focusables.find((t,o)=>{const i=t.element===this.focusTracker.focusedElement;return i&&(e=o),i}),e)}focusFirst(){this._focus(this.first)}focusLast(){this._focus(this.last)}focusNext(){this._focus(this.next)}focusPrevious(){this._focus(this.previous)}_focus(e){e&&e.focus()}_getFocusableItem(e){const t=this.current,o=this.focusables.length;if(!o)return null;if(null===t)return this[1===e?"first":"last"];let i=(t+o+e)%o;do{const t=this.focusables.get(i);if(r(t))return t;i=(i+o+e)%o}while(i!==t);return null}}function r(e){return!(!e.focus||"none"==i.a.window.getComputedStyle(e.element).display)}},"./packages/ckeditor5-ui/src/icon/iconview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-ui/src/view.js");o("./packages/ckeditor5-ui/theme/components/icon/icon.css");class s extends i.a{constructor(){super();const e=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:e.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 e=(new DOMParser).parseFromString(this.content.trim(),"image/svg+xml").querySelector("svg"),t=e.getAttribute("viewBox");for(t&&(this.viewBox=t),this.element.innerHTML="";e.childNodes.length>0;)this.element.appendChild(e.childNodes[0])}}_colorFillPaths(){this.fillColor&&this.element.querySelectorAll(".ck-icon__fill").forEach(e=>{e.style.fill=this.fillColor})}}},"./packages/ckeditor5-ui/src/list/listitemview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-ui/src/view.js");class s extends i.a{constructor(e){super(e),this.children=this.createCollection(),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__item"]},children:this.children})}focus(){this.children.first.focus()}}},"./packages/ckeditor5-ui/src/list/listview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-ui/src/view.js"),s=o("./packages/ckeditor5-utils/src/focustracker.js"),r=o("./packages/ckeditor5-ui/src/focuscycler.js"),n=o("./packages/ckeditor5-utils/src/keystrokehandler.js");o("./packages/ckeditor5-ui/theme/components/list/list.css");class a extends i.a{constructor(){super(),this.items=this.createCollection(),this.focusTracker=new s.a,this.keystrokes=new n.a,this._focusCycler=new r.a({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 e of this.items)this.focusTracker.add(e.element);this.items.on("add",(e,t)=>{this.focusTracker.add(t.element)}),this.items.on("remove",(e,t)=>{this.focusTracker.remove(t.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}}},"./packages/ckeditor5-ui/src/panel/balloon/balloonpanelview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return u}));var i=o("./packages/ckeditor5-ui/src/view.js"),s=o("./packages/ckeditor5-utils/src/dom/position.js"),r=o("./packages/ckeditor5-utils/src/dom/isrange.js"),n=o("./packages/ckeditor5-utils/src/dom/tounit.js"),a=o("./packages/ckeditor5-utils/src/dom/global.js"),c=o("./node_modules/lodash-es/isElement.js");o("./packages/ckeditor5-ui/theme/components/panel/balloonpanel.css");const l=Object(n.a)("px"),d=a.a.document.body;class u extends i.a{constructor(e){super(e);const t=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",t.to("position",e=>"ck-balloon-panel_"+e),t.if("isVisible","ck-balloon-panel_visible"),t.if("withArrow","ck-balloon-panel_with-arrow"),t.to("class")],style:{top:t.to("top",l),left:t.to("left",l)}},children:this.content})}show(){this.isVisible=!0}hide(){this.isVisible=!1}attachTo(e){this.show();const t=u.defaultPositions,o=Object.assign({},{element:this.element,positions:[t.southArrowNorth,t.southArrowNorthMiddleWest,t.southArrowNorthMiddleEast,t.southArrowNorthWest,t.southArrowNorthEast,t.northArrowSouth,t.northArrowSouthMiddleWest,t.northArrowSouthMiddleEast,t.northArrowSouthWest,t.northArrowSouthEast,t.viewportStickyNorth],limiter:d,fitInViewport:!0},e),i=u._getOptimalPosition(o),s=parseInt(i.left),r=parseInt(i.top),{name:n,config:a={}}=i,{withArrow:c=!0}=a;Object.assign(this,{top:r,left:s,position:n,withArrow:c})}pin(e){this.unpin(),this._pinWhenIsVisibleCallback=()=>{this.isVisible?this._startPinning(e):this._stopPinning()},this._startPinning(e),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(e){this.attachTo(e);const t=h(e.target),o=e.limiter?h(e.limiter):d;this.listenTo(a.a.document,"scroll",(i,s)=>{const r=s.target,n=t&&r.contains(t),a=o&&r.contains(o);!n&&!a&&t&&o||this.attachTo(e)},{useCapture:!0}),this.listenTo(a.a.window,"resize",()=>{this.attachTo(e)})}_stopPinning(){this.stopListening(a.a.document,"scroll"),this.stopListening(a.a.window,"resize")}}function h(e){return Object(c.a)(e)?e:Object(r.a)(e)?e.commonAncestorContainer:"function"==typeof e?h(e()):null}function p(e,t){return e.top-t.height-u.arrowVerticalOffset}function g(e){return e.bottom+u.arrowVerticalOffset}u.arrowHorizontalOffset=25,u.arrowVerticalOffset=10,u.stickyVerticalOffset=20,u._getOptimalPosition=s.a,u.defaultPositions={northWestArrowSouthWest:(e,t)=>({top:p(e,t),left:e.left-u.arrowHorizontalOffset,name:"arrow_sw"}),northWestArrowSouthMiddleWest:(e,t)=>({top:p(e,t),left:e.left-.25*t.width-u.arrowHorizontalOffset,name:"arrow_smw"}),northWestArrowSouth:(e,t)=>({top:p(e,t),left:e.left-t.width/2,name:"arrow_s"}),northWestArrowSouthMiddleEast:(e,t)=>({top:p(e,t),left:e.left-.75*t.width+u.arrowHorizontalOffset,name:"arrow_sme"}),northWestArrowSouthEast:(e,t)=>({top:p(e,t),left:e.left-t.width+u.arrowHorizontalOffset,name:"arrow_se"}),northArrowSouthWest:(e,t)=>({top:p(e,t),left:e.left+e.width/2-u.arrowHorizontalOffset,name:"arrow_sw"}),northArrowSouthMiddleWest:(e,t)=>({top:p(e,t),left:e.left+e.width/2-.25*t.width-u.arrowHorizontalOffset,name:"arrow_smw"}),northArrowSouth:(e,t)=>({top:p(e,t),left:e.left+e.width/2-t.width/2,name:"arrow_s"}),northArrowSouthMiddleEast:(e,t)=>({top:p(e,t),left:e.left+e.width/2-.75*t.width+u.arrowHorizontalOffset,name:"arrow_sme"}),northArrowSouthEast:(e,t)=>({top:p(e,t),left:e.left+e.width/2-t.width+u.arrowHorizontalOffset,name:"arrow_se"}),northEastArrowSouthWest:(e,t)=>({top:p(e,t),left:e.right-u.arrowHorizontalOffset,name:"arrow_sw"}),northEastArrowSouthMiddleWest:(e,t)=>({top:p(e,t),left:e.right-.25*t.width-u.arrowHorizontalOffset,name:"arrow_smw"}),northEastArrowSouth:(e,t)=>({top:p(e,t),left:e.right-t.width/2,name:"arrow_s"}),northEastArrowSouthMiddleEast:(e,t)=>({top:p(e,t),left:e.right-.75*t.width+u.arrowHorizontalOffset,name:"arrow_sme"}),northEastArrowSouthEast:(e,t)=>({top:p(e,t),left:e.right-t.width+u.arrowHorizontalOffset,name:"arrow_se"}),southWestArrowNorthWest:(e,t)=>({top:g(e),left:e.left-u.arrowHorizontalOffset,name:"arrow_nw"}),southWestArrowNorthMiddleWest:(e,t)=>({top:g(e),left:e.left-.25*t.width-u.arrowHorizontalOffset,name:"arrow_nmw"}),southWestArrowNorth:(e,t)=>({top:g(e),left:e.left-t.width/2,name:"arrow_n"}),southWestArrowNorthMiddleEast:(e,t)=>({top:g(e),left:e.left-.75*t.width+u.arrowHorizontalOffset,name:"arrow_nme"}),southWestArrowNorthEast:(e,t)=>({top:g(e),left:e.left-t.width+u.arrowHorizontalOffset,name:"arrow_ne"}),southArrowNorthWest:(e,t)=>({top:g(e),left:e.left+e.width/2-u.arrowHorizontalOffset,name:"arrow_nw"}),southArrowNorthMiddleWest:(e,t)=>({top:g(e),left:e.left+e.width/2-.25*t.width-u.arrowHorizontalOffset,name:"arrow_nmw"}),southArrowNorth:(e,t)=>({top:g(e),left:e.left+e.width/2-t.width/2,name:"arrow_n"}),southArrowNorthMiddleEast:(e,t)=>({top:g(e),left:e.left+e.width/2-.75*t.width+u.arrowHorizontalOffset,name:"arrow_nme"}),southArrowNorthEast:(e,t)=>({top:g(e),left:e.left+e.width/2-t.width+u.arrowHorizontalOffset,name:"arrow_ne"}),southEastArrowNorthWest:(e,t)=>({top:g(e),left:e.right-u.arrowHorizontalOffset,name:"arrow_nw"}),southEastArrowNorthMiddleWest:(e,t)=>({top:g(e),left:e.right-.25*t.width-u.arrowHorizontalOffset,name:"arrow_nmw"}),southEastArrowNorth:(e,t)=>({top:g(e),left:e.right-t.width/2,name:"arrow_n"}),southEastArrowNorthMiddleEast:(e,t)=>({top:g(e),left:e.right-.75*t.width+u.arrowHorizontalOffset,name:"arrow_nme"}),southEastArrowNorthEast:(e,t)=>({top:g(e),left:e.right-t.width+u.arrowHorizontalOffset,name:"arrow_ne"}),viewportStickyNorth:(e,t,o)=>e.getIntersection(o)?{top:o.top+u.stickyVerticalOffset,left:e.left+e.width/2-t.width/2,name:"arrowless",config:{withArrow:!1}}:null}},"./packages/ckeditor5-ui/src/panel/balloon/contextualballoon.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return h}));var i=o("./packages/ckeditor5-core/src/plugin.js"),s=o("./packages/ckeditor5-ui/src/panel/balloon/balloonpanelview.js"),r=o("./packages/ckeditor5-ui/src/view.js"),n=o("./packages/ckeditor5-ui/src/button/buttonview.js"),a=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),c=o("./packages/ckeditor5-utils/src/focustracker.js"),l=o("./packages/ckeditor5-utils/src/dom/tounit.js"),d=o("./packages/ckeditor5-utils/src/dom/rect.js");o("./packages/ckeditor5-ui/theme/components/panel/balloonrotator.css"),o("./packages/ckeditor5-ui/theme/components/panel/fakepanel.css");const u=Object(l.a)("px");class h extends i.a{static get pluginName(){return"ContextualBalloon"}constructor(e){super(e),this.positionLimiter=()=>{const e=this.editor.editing.view,t=e.document.selection.editableElement;return t?e.domConverter.mapViewToDom(t.root):null},this.set("visibleView",null),this.view=new s.a(e.locale),e.ui.view.body.add(this.view),e.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(e){return Array.from(this._viewToStack.keys()).includes(e)}add(e){if(this.hasView(e.view))throw new a.a("contextualballoon-add-view-exist",[this,e]);const t=e.stackId||"main";if(!this._idToStack.has(t))return this._idToStack.set(t,new Map([[e.view,e]])),this._viewToStack.set(e.view,this._idToStack.get(t)),this._numberOfStacks=this._idToStack.size,void(this._visibleStack&&!e.singleViewMode||this.showStack(t));const o=this._idToStack.get(t);e.singleViewMode&&this.showStack(t),o.set(e.view,e),this._viewToStack.set(e.view,o),o===this._visibleStack&&this._showView(e)}remove(e){if(!this.hasView(e))throw new a.a("contextualballoon-remove-view-not-exist",[this,e]);const t=this._viewToStack.get(e);this._singleViewMode&&this.visibleView===e&&(this._singleViewMode=!1),this.visibleView===e&&(1===t.size?this._idToStack.size>1?this._showNextStack():(this.view.hide(),this.visibleView=null,this._rotatorView.hideView()):this._showView(Array.from(t.values())[t.size-2])),1===t.size?(this._idToStack.delete(this._getStackId(t)),this._numberOfStacks=this._idToStack.size):t.delete(e),this._viewToStack.delete(e)}updatePosition(e){e&&(this._visibleStack.get(this.visibleView).position=e),this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition()}showStack(e){this.visibleStack=e;const t=this._idToStack.get(e);if(!t)throw new a.a("contextualballoon-showstack-stack-not-exist",this);this._visibleStack!==t&&this._showView(Array.from(t.values()).pop())}get _visibleStack(){return this._viewToStack.get(this.visibleView)}_getStackId(e){return Array.from(this._idToStack.entries()).find(t=>t[1]===e)[0]}_showNextStack(){const e=Array.from(this._idToStack.values());let t=e.indexOf(this._visibleStack)+1;e[t]||(t=0),this.showStack(this._getStackId(e[t]))}_showPrevStack(){const e=Array.from(this._idToStack.values());let t=e.indexOf(this._visibleStack)-1;e[t]||(t=e.length-1),this.showStack(this._getStackId(e[t]))}_createRotatorView(){const e=new p(this.editor.locale),t=this.editor.locale.t;return this.view.content.add(e),e.bind("isNavigationVisible").to(this,"_numberOfStacks",this,"_singleViewMode",(e,t)=>!t&&e>1),e.on("change:isNavigationVisible",()=>this.updatePosition(),{priority:"low"}),e.bind("counter").to(this,"visibleView",this,"_numberOfStacks",(e,o)=>{if(o<2)return"";const i=Array.from(this._idToStack.values()).indexOf(this._visibleStack)+1;return t("%0 of %1",[i,o])}),e.buttonNextView.on("execute",()=>{e.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showNextStack()}),e.buttonPrevView.on("execute",()=>{e.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showPrevStack()}),e}_createFakePanelsView(){const e=new g(this.editor.locale,this.view);return e.bind("numberOfPanels").to(this,"_numberOfStacks",this,"_singleViewMode",(e,t)=>!t&&e>=2?Math.min(e-1,2):0),e.listenTo(this.view,"change:top",()=>e.updatePosition()),e.listenTo(this.view,"change:left",()=>e.updatePosition()),this.editor.ui.view.body.add(e),e}_showView({view:e,balloonClassName:t="",withArrow:o=!0,singleViewMode:i=!1}){this.view.class=t,this.view.withArrow=o,this._rotatorView.showView(e),this.visibleView=e,this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition(),i&&(this._singleViewMode=!0)}_getBalloonPosition(){let e=Array.from(this._visibleStack.values()).pop().position;return e&&(e.limiter||(e=Object.assign({},e,{limiter:this.positionLimiter})),e=Object.assign({},e,{viewportOffsetConfig:this.editor.ui.viewportOffset})),e}}class p extends r.a{constructor(e){super(e);const t=e.t,o=this.bindTemplate;this.set("isNavigationVisible",!0),this.focusTracker=new c.a,this.buttonPrevView=this._createButtonView(t("Previous"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M11.463 5.187a.888.888 0 1 1 1.254 1.255L9.16 10l3.557 3.557a.888.888 0 1 1-1.254 1.255L7.26 10.61a.888.888 0 0 1 .16-1.382l4.043-4.042z"/></svg>'),this.buttonNextView=this._createButtonView(t("Next"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8.537 14.813a.888.888 0 1 1-1.254-1.255L10.84 10 7.283 6.442a.888.888 0 1 1 1.254-1.255L12.74 9.39a.888.888 0 0 1-.16 1.382l-4.043 4.042z"/></svg>'),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",o.to("isNavigationVisible",e=>e?"":"ck-hidden")]},children:[this.buttonPrevView,{tag:"span",attributes:{class:["ck-balloon-rotator__counter"]},children:[{text:o.to("counter")}]},this.buttonNextView]},{tag:"div",attributes:{class:"ck-balloon-rotator__content"},children:this.content}]})}render(){super.render(),this.focusTracker.add(this.element)}showView(e){this.hideView(),this.content.add(e)}hideView(){this.content.clear()}_createButtonView(e,t){const o=new n.a(this.locale);return o.set({label:e,icon:t,tooltip:!0}),o}}class g extends r.a{constructor(e,t){super(e);const o=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=t,this.setTemplate({tag:"div",attributes:{class:["ck-fake-panel",o.to("numberOfPanels",e=>e?"":"ck-hidden")],style:{top:o.to("top",u),left:o.to("left",u),width:o.to("width",u),height:o.to("height",u)}},children:this.content}),this.on("change:numberOfPanels",(e,t,o,i)=>{o>i?this._addPanels(o-i):this._removePanels(i-o),this.updatePosition()})}_addPanels(e){for(;e--;){const e=new r.a;e.setTemplate({tag:"div"}),this.content.add(e),this.registerChild(e)}}_removePanels(e){for(;e--;){const e=this.content.last;this.content.remove(e),this.deregisterChild(e),e.destroy()}}updatePosition(){if(this.numberOfPanels){const{top:e,left:t}=this._balloonPanelView,{width:o,height:i}=new d.a(this._balloonPanelView.element);Object.assign(this,{top:e,left:t,width:o,height:i})}}}},"./packages/ckeditor5-ui/src/template.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return h}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./packages/ckeditor5-utils/src/mix.js"),r=o("./packages/ckeditor5-utils/src/emittermixin.js"),n=o("./packages/ckeditor5-ui/src/view.js"),a=o("./packages/ckeditor5-ui/src/viewcollection.js"),c=o("./packages/ckeditor5-utils/src/dom/isnode.js"),l=o("./node_modules/lodash-es/isObject.js"),d=o("./node_modules/lodash-es/cloneDeepWith.js"),u=o("./packages/ckeditor5-utils/src/toarray.js");class h{constructor(e){Object.assign(this,y(v(e))),this._isRendered=!1,this._revertData=null}render(){const e=this._renderNode({intoFragment:!0});return this._isRendered=!0,e}apply(e){return this._revertData={children:[],bindings:[],attributes:{}},this._renderNode({node:e,isApplying:!0,revertData:this._revertData}),e}revert(e){if(!this._revertData)throw new i.a("ui-template-revert-not-applied",[this,e]);this._revertTemplateFromNode(e,this._revertData)}*getViews(){yield*function*e(t){if(t.children)for(const o of t.children)A(o)?yield o:T(o)&&(yield*e(o))}(this)}static bind(e,t){return{to:(o,i)=>new g({eventNameOrFunction:o,attribute:o,observable:e,emitter:t,callback:i}),if:(o,i,s)=>new f({observable:e,emitter:t,attribute:o,valueIfTrue:i,callback:s})}}static extend(e,t){if(e._isRendered)throw new i.a("template-extend-render",[this,e]);!function e(t,o){o.attributes&&(t.attributes||(t.attributes={}),P(t.attributes,o.attributes));o.eventListeners&&(t.eventListeners||(t.eventListeners={}),P(t.eventListeners,o.eventListeners));o.text&&t.text.push(...o.text);if(o.children&&o.children.length){if(t.children.length!=o.children.length)throw new i.a("ui-template-extend-children-mismatch",t);let s=0;for(const i of o.children)e(t.children[s++],i)}}(e,y(v(t)))}_renderNode(e){let t;if(t=e.node?this.tag&&this.text:this.tag?this.text:!this.text,t)throw new i.a("ui-template-wrong-syntax",this);return this.text?this._renderText(e):this._renderElement(e)}_renderElement(e){let t=e.node;return t||(t=e.node=document.createElementNS(this.ns||"http://www.w3.org/1999/xhtml",this.tag)),this._renderAttributes(e),this._renderElementChildren(e),this._setUpListeners(e),t}_renderText(e){let t=e.node;return t?e.revertData.text=t.textContent:t=e.node=document.createTextNode(""),m(this.text)?this._bindToObservable({schema:this.text,updater:b(t),data:e}):t.textContent=this.text.join(""),t}_renderAttributes(e){let t,o,i,s;if(!this.attributes)return;const r=e.node,n=e.revertData;for(t in this.attributes)if(i=r.getAttribute(t),o=this.attributes[t],n&&(n.attributes[t]=i),s=Object(l.a)(o[0])&&o[0].ns?o[0].ns:null,m(o)){const a=s?o[0].value:o;n&&E(t)&&a.unshift(i),this._bindToObservable({schema:a,updater:_(r,t,s),data:e})}else"style"==t&&"string"!=typeof o[0]?this._renderStyleAttribute(o[0],e):(n&&i&&E(t)&&o.unshift(i),o=o.map(e=>e&&e.value||e).reduce((e,t)=>e.concat(t),[]).reduce(x,""),O(o)||r.setAttributeNS(s,t,o))}_renderStyleAttribute(e,t){const o=t.node;for(const i in e){const s=e[i];m(s)?this._bindToObservable({schema:[s],updater:w(o,i),data:t}):o.style[i]=s}}_renderElementChildren(e){const t=e.node,o=e.intoFragment?document.createDocumentFragment():t,i=e.isApplying;let s=0;for(const r of this.children)if(C(r)){if(!i){r.setParent(t);for(const e of r)o.appendChild(e.element)}}else if(A(r))i||(r.isRendered||r.render(),o.appendChild(r.element));else if(Object(c.a)(r))o.appendChild(r);else if(i){const t={children:[],bindings:[],attributes:{}};e.revertData.children.push(t),r._renderNode({node:o.childNodes[s++],isApplying:!0,revertData:t})}else o.appendChild(r.render());e.intoFragment&&t.appendChild(o)}_setUpListeners(e){if(this.eventListeners)for(const t in this.eventListeners){const o=this.eventListeners[t].map(o=>{const[i,s]=t.split("@");return o.activateDomEventListener(i,s,e)});e.revertData&&e.revertData.bindings.push(o)}}_bindToObservable({schema:e,updater:t,data:o}){const i=o.revertData;k(e,t,o);const s=e.filter(e=>!O(e)).filter(e=>e.observable).map(i=>i.activateAttributeListener(e,t,o));i&&i.bindings.push(s)}_revertTemplateFromNode(e,t){for(const e of t.bindings)for(const t of e)t();if(t.text)e.textContent=t.text;else{for(const o in t.attributes){const i=t.attributes[o];null===i?e.removeAttribute(o):e.setAttribute(o,i)}for(let o=0;o<t.children.length;++o)this._revertTemplateFromNode(e.childNodes[o],t.children[o])}}}Object(s.a)(h,r.c);class p{constructor(e){Object.assign(this,e)}getValue(e){const t=this.observable[this.attribute];return this.callback?this.callback(t,e):t}activateAttributeListener(e,t,o){const i=()=>k(e,t,o);return this.emitter.listenTo(this.observable,"change:"+this.attribute,i),()=>{this.emitter.stopListening(this.observable,"change:"+this.attribute,i)}}}class g extends p{activateDomEventListener(e,t,o){const i=(e,o)=>{t&&!o.target.matches(t)||("function"==typeof this.eventNameOrFunction?this.eventNameOrFunction(o):this.observable.fire(this.eventNameOrFunction,o))};return this.emitter.listenTo(o.node,e,i),()=>{this.emitter.stopListening(o.node,e,i)}}}class f extends p{getValue(e){return!O(super.getValue(e))&&(this.valueIfTrue||!0)}}function m(e){return!!e&&(e.value&&(e=e.value),Array.isArray(e)?e.some(m):e instanceof p)}function k(e,t,{node:o}){let i=function(e,t){return e.map(e=>e instanceof p?e.getValue(t):e)}(e,o);i=1==e.length&&e[0]instanceof f?i[0]:i.reduce(x,""),O(i)?t.remove():t.set(i)}function b(e){return{set(t){e.textContent=t},remove(){e.textContent=""}}}function _(e,t,o){return{set(i){e.setAttributeNS(o,t,i)},remove(){e.removeAttributeNS(o,t)}}}function w(e,t){return{set(o){e.style[t]=o},remove(){e.style[t]=null}}}function v(e){return Object(d.a)(e,e=>{if(e&&(e instanceof p||T(e)||A(e)||C(e)))return e})}function y(e){if("string"==typeof e?e=function(e){return{text:[e]}}(e):e.text&&function(e){e.text=Object(u.a)(e.text)}(e),e.on&&(e.eventListeners=function(e){for(const t in e)j(e,t);return e}(e.on),delete e.on),!e.text){e.attributes&&function(e){for(const t in e)e[t].value&&(e[t].value=Object(u.a)(e[t].value)),j(e,t)}(e.attributes);const t=[];if(e.children)if(C(e.children))t.push(e.children);else for(const o of e.children)T(o)||A(o)||Object(c.a)(o)?t.push(o):t.push(new h(o));e.children=t}return e}function j(e,t){e[t]=Object(u.a)(e[t])}function x(e,t){return O(t)?e:O(e)?t:`${e} ${t}`}function P(e,t){for(const o in t)e[o]?e[o].push(...t[o]):e[o]=t[o]}function O(e){return!e&&0!==e}function A(e){return e instanceof n.a}function T(e){return e instanceof h}function C(e){return e instanceof a.a}function E(e){return"class"==e||"style"==e}},"./packages/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.js":function(e,t,o){"use strict";function i(e){return Array.isArray(e)?{items:e,removeItems:[]}:e?Object.assign({items:[],removeItems:[]},e):{items:[],removeItems:[]}}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-ui/src/toolbar/toolbarseparatorview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-ui/src/view.js");class s extends i.a{constructor(e){super(e),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__separator"]}})}}},"./packages/ckeditor5-ui/src/toolbar/toolbarview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return k}));var i=o("./packages/ckeditor5-ui/src/view.js"),s=o("./packages/ckeditor5-utils/src/focustracker.js"),r=o("./packages/ckeditor5-ui/src/focuscycler.js"),n=o("./packages/ckeditor5-utils/src/keystrokehandler.js"),a=o("./packages/ckeditor5-ui/src/toolbar/toolbarseparatorview.js");class c extends i.a{constructor(e){super(e),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__line-break"]}})}}var l=o("./packages/ckeditor5-utils/src/dom/resizeobserver.js");function d(e){return e.bindTemplate.to(t=>{t.target===e.element&&t.preventDefault()})}var u=o("./packages/ckeditor5-utils/src/dom/rect.js"),h=o("./packages/ckeditor5-utils/src/dom/global.js"),p=o("./packages/ckeditor5-ui/src/dropdown/utils.js"),g=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),f=o("./packages/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.js"),m=o("./packages/ckeditor5-core/theme/icons/three-vertical-dots.svg");o("./packages/ckeditor5-ui/theme/components/toolbar/toolbar.css");class k extends i.a{constructor(e,t){super(e);const o=this.bindTemplate,i=this.t;this.options=t||{},this.set("ariaLabel",i("Editor toolbar")),this.set("maxWidth","auto"),this.items=this.createCollection(),this.focusTracker=new s.a,this.keystrokes=new n.a,this.set("class"),this.set("isCompact",!1),this.itemsView=new b(e),this.children=this.createCollection(),this.children.add(this.itemsView),this.focusables=this.createCollection();const a="rtl"===e.uiLanguageDirection;this._focusCycler=new r.a({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:[a?"arrowright":"arrowleft","arrowup"],focusNext:[a?"arrowleft":"arrowright","arrowdown"]}});const c=["ck","ck-toolbar",o.to("class"),o.if("isCompact","ck-toolbar_compact")];this.options.shouldGroupWhenFull&&this.options.isFloating&&c.push("ck-toolbar_floating"),this.setTemplate({tag:"div",attributes:{class:c,role:"toolbar","aria-label":o.to("ariaLabel"),style:{maxWidth:o.to("maxWidth")}},children:this.children,on:{mousedown:d(this)}}),this._behavior=this.options.shouldGroupWhenFull?new w(this):new _(this)}render(){super.render();for(const e of this.items)this.focusTracker.add(e.element);this.items.on("add",(e,t)=>{this.focusTracker.add(t.element)}),this.items.on("remove",(e,t)=>{this.focusTracker.remove(t.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(e,t){const o=Object(f.a)(e),i=o.items.filter((e,i,s)=>"|"===e||-1===o.removeItems.indexOf(e)&&("-"===e?!this.options.shouldGroupWhenFull||(Object(g.c)("toolbarview-line-break-ignored-when-grouping-items",s),!1):!!t.has(e)||(Object(g.c)("toolbarview-item-unavailable",{name:e}),!1))),s=this._cleanSeparators(i).map(e=>"|"===e?new a.a:"-"===e?new c:t.create(e));this.items.addMany(s)}_cleanSeparators(e){const t=e=>"-"!==e&&"|"!==e,o=e.length,i=e.findIndex(t),s=o-e.slice().reverse().findIndex(t);return e.slice(i,s).filter((e,o,i)=>{if(t(e))return!0;return!(o>0&&i[o-1]===e)})}}class b extends i.a{constructor(e){super(e),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-toolbar__items"]},children:this.children})}}class _{constructor(e){const t=e.bindTemplate;e.set("isVertical",!1),e.itemsView.children.bindTo(e.items).using(e=>e),e.focusables.bindTo(e.items).using(e=>e),e.extendTemplate({attributes:{class:[t.if("isVertical","ck-toolbar_vertical")]}})}render(){}destroy(){}}class w{constructor(e){this.view=e,this.viewChildren=e.children,this.viewFocusables=e.focusables,this.viewItemsView=e.itemsView,this.viewFocusTracker=e.focusTracker,this.viewLocale=e.locale,this.ungroupedItems=e.createCollection(),this.groupedItems=e.createCollection(),this.groupedItemsDropdown=this._createGroupedItemsDropdown(),this.resizeObserver=null,this.cachedPadding=null,this.shouldUpdateGroupingOnNextResize=!1,e.itemsView.children.bindTo(this.ungroupedItems).using(e=>e),this.ungroupedItems.on("add",this._updateFocusCycleableItems.bind(this)),this.ungroupedItems.on("remove",this._updateFocusCycleableItems.bind(this)),e.children.on("add",this._updateFocusCycleableItems.bind(this)),e.children.on("remove",this._updateFocusCycleableItems.bind(this)),e.items.on("change",(e,t)=>{const o=t.index;for(const e of t.removed)o>=this.ungroupedItems.length?this.groupedItems.remove(e):this.ungroupedItems.remove(e);for(let e=o;e<o+t.added.length;e++){const i=t.added[e-o];e>this.ungroupedItems.length?this.groupedItems.add(i,e-this.ungroupedItems.length):this.ungroupedItems.add(i,e)}this._updateGrouping()}),e.extendTemplate({attributes:{class:["ck-toolbar_grouping"]}})}render(e){this.viewElement=e.element,this._enableGroupingOnResize(),this._enableGroupingOnMaxWidthChange(e)}destroy(){this.groupedItemsDropdown.destroy(),this.resizeObserver.destroy()}_updateGrouping(){if(!this.viewElement.ownerDocument.body.contains(this.viewElement))return;if(!this.viewElement.offsetParent)return void(this.shouldUpdateGroupingOnNextResize=!0);const e=this.groupedItems.length;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()}this.groupedItems.length!==e&&this.view.fire("groupedItemsUpdate")}get _areItemsOverflowing(){if(!this.ungroupedItems.length)return!1;const e=this.viewElement,t=this.viewLocale.uiLanguageDirection,o=new u.a(e.lastChild),i=new u.a(e);if(!this.cachedPadding){const o=h.a.window.getComputedStyle(e),i="ltr"===t?"paddingRight":"paddingLeft";this.cachedPadding=Number.parseInt(o[i])}return"ltr"===t?o.right>i.right-this.cachedPadding:o.left<i.left+this.cachedPadding}_enableGroupingOnResize(){let e;this.resizeObserver=new l.a(this.viewElement,t=>{e&&e===t.contentRect.width&&!this.shouldUpdateGroupingOnNextResize||(this.shouldUpdateGroupingOnNextResize=!1,this._updateGrouping(),e=t.contentRect.width)}),this._updateGrouping()}_enableGroupingOnMaxWidthChange(e){e.on("change:maxWidth",()=>{this._updateGrouping()})}_groupLastItem(){this.groupedItems.length||(this.viewChildren.add(new a.a),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 e=this.viewLocale,t=e.t,o=Object(p.c)(e);return o.class="ck-toolbar__grouped-dropdown",o.panelPosition="ltr"===e.uiLanguageDirection?"sw":"se",Object(p.b)(o,[]),o.buttonView.set({label:t("Show more items"),tooltip:!0,tooltipPosition:"rtl"===e.uiLanguageDirection?"se":"sw",icon:m.a}),o.toolbarView.items.bindTo(this.groupedItems).using(e=>e),o}_updateFocusCycleableItems(){this.viewFocusables.clear(),this.ungroupedItems.map(e=>{this.viewFocusables.add(e)}),this.groupedItems.length&&this.viewFocusables.add(this.groupedItemsDropdown)}}},"./packages/ckeditor5-ui/src/tooltip/tooltipview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-ui/src/view.js");o("./packages/ckeditor5-ui/theme/components/tooltip/tooltip.css");class s extends i.a{constructor(e){super(e),this.set("text",""),this.set("position","s");const t=this.bindTemplate;this.setTemplate({tag:"span",attributes:{class:["ck","ck-tooltip",t.to("position",e=>"ck-tooltip_"+e),t.if("text","ck-hidden",e=>!e.trim())]},children:[{tag:"span",attributes:{class:["ck","ck-tooltip__text"]},children:[{text:t.to("text")}]}]})}}},"./packages/ckeditor5-ui/src/view.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return u}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./packages/ckeditor5-ui/src/viewcollection.js"),r=o("./packages/ckeditor5-ui/src/template.js"),n=o("./packages/ckeditor5-utils/src/dom/emittermixin.js"),a=o("./packages/ckeditor5-utils/src/observablemixin.js"),c=o("./packages/ckeditor5-utils/src/collection.js"),l=o("./packages/ckeditor5-utils/src/mix.js"),d=o("./packages/ckeditor5-utils/src/isiterable.js");o("./packages/ckeditor5-ui/theme/globals/globals.css");class u{constructor(e){this.element=null,this.isRendered=!1,this.locale=e,this.t=e&&e.t,this._viewCollections=new c.a,this._unboundChildren=this.createCollection(),this._viewCollections.on("add",(t,o)=>{o.locale=e}),this.decorate("render")}get bindTemplate(){return this._bindTemplate?this._bindTemplate:this._bindTemplate=r.a.bind(this,this)}createCollection(e){const t=new s.a(e);return this._viewCollections.add(t),t}registerChild(e){Object(d.a)(e)||(e=[e]);for(const t of e)this._unboundChildren.add(t)}deregisterChild(e){Object(d.a)(e)||(e=[e]);for(const t of e)this._unboundChildren.remove(t)}setTemplate(e){this.template=new r.a(e)}extendTemplate(e){r.a.extend(this.template,e)}render(){if(this.isRendered)throw new i.a("ui-view-render-already-rendered",this);this.template&&(this.element=this.template.render(),this.registerChild(this.template.getViews())),this.isRendered=!0}destroy(){this.stopListening(),this._viewCollections.map(e=>e.destroy()),this.template&&this.template._revertData&&this.template.revert(this.element)}}Object(l.a)(u,n.a),Object(l.a)(u,a.a)},"./packages/ckeditor5-ui/src/viewcollection.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./packages/ckeditor5-utils/src/collection.js");class r extends s.a{constructor(e=[]){super(e,{idProperty:"viewUid"}),this.on("add",(e,t,o)=>{this._renderViewIntoCollectionParent(t,o)}),this.on("remove",(e,t)=>{t.element&&this._parentElement&&t.element.remove()}),this._parentElement=null}destroy(){this.map(e=>e.destroy())}setParent(e){this._parentElement=e;for(const e of this)this._renderViewIntoCollectionParent(e)}delegate(...e){if(!e.length||!e.every(e=>"string"==typeof e))throw new i.a("ui-viewcollection-delegate-wrong-events",this);return{to:t=>{for(const o of this)for(const i of e)o.delegate(i).to(t);this.on("add",(o,i)=>{for(const o of e)i.delegate(o).to(t)}),this.on("remove",(o,i)=>{for(const o of e)i.stopDelegating(o,t)})}}}_renderViewIntoCollectionParent(e,t){e.isRendered||e.render(),e.element&&this._parentElement&&this._parentElement.insertBefore(e.element,this._parentElement.children[t])}}},"./packages/ckeditor5-ui/theme/components/button/button.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/button/button.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/button/switchbutton.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/button/switchbutton.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/colorgrid/colorgrid.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/colorgrid/colorgrid.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/dropdown/dropdown.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/dropdown.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/dropdown/listdropdown.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/listdropdown.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/dropdown/splitbutton.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/splitbutton.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/editorui/editorui.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/editorui/editorui.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/formheader/formheader.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/formheader/formheader.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/icon/icon.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/icon/icon.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/inputtext/inputtext.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/inputtext/inputtext.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/label/label.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/label/label.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/list/list.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/list/list.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/panel/balloonpanel.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/balloonpanel.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/panel/balloonrotator.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/balloonrotator.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/panel/fakepanel.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/fakepanel.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/panel/stickypanel.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/stickypanel.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/toolbar/toolbar.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/toolbar/toolbar.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/components/tooltip/tooltip.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/tooltip/tooltip.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/globals/globals.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/globals/globals.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-ui/theme/icons/dropdown-arrow.svg":function(e,t,o){"use strict";t.a='<svg viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg"><path d="M.941 4.523a.75.75 0 1 1 1.06-1.06l3.006 3.005 3.005-3.005a.75.75 0 1 1 1.06 1.06l-3.549 3.55a.75.75 0 0 1-1.168-.136L.941 4.523z"/></svg>'},"./packages/ckeditor5-utils/src/ckeditorerror.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return i})),o.d(t,"c",(function(){return s})),o.d(t,"b",(function(){return r}));class i extends Error{constructor(e,t,o){super(function(e,t){const o=new WeakSet,i=t?" "+JSON.stringify(t,(e,t)=>{if("object"==typeof t&&null!==t){if(o.has(t))return`[object ${t.constructor.name}]`;o.add(t)}return t}):"",s=n(e);return e+i+s}(e,o)),this.name="CKEditorError",this.context=t,this.data=o}is(e){return"CKEditorError"===e}static rethrowUnexpectedError(e,t){if(e.is&&e.is("CKEditorError"))throw e;const o=new i(e.message,t);throw o.stack=e.stack,o}}function s(e,t){console.warn(...a(e,t))}function r(e,t){console.error(...a(e,t))}function n(e){return"\nRead more: https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/error-codes.html#error-"+e}function a(e,t){const o=n(e);return t?[e,t,o]:[e,o]}},"./packages/ckeditor5-utils/src/collection.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-utils/src/emittermixin.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),r=o("./packages/ckeditor5-utils/src/uid.js"),n=o("./packages/ckeditor5-utils/src/isiterable.js"),a=o("./packages/ckeditor5-utils/src/mix.js");class c{constructor(e={},t={}){const o=Object(n.a)(e);if(o||(t=e),this._items=[],this._itemMap=new Map,this._idProperty=t.idProperty||"id",this._bindToExternalToInternalMap=new WeakMap,this._bindToInternalToExternalMap=new WeakMap,this._skippedIndexesFromExternal=[],o)for(const t of e)this._items.push(t),this._itemMap.set(this._getItemIdBeforeAdding(t),t)}get length(){return this._items.length}get first(){return this._items[0]||null}get last(){return this._items[this.length-1]||null}add(e,t){return this.addMany([e],t)}addMany(e,t){if(void 0===t)t=this._items.length;else if(t>this._items.length||t<0)throw new s.a("collection-add-item-invalid-index",this);for(let o=0;o<e.length;o++){const i=e[o],s=this._getItemIdBeforeAdding(i),r=t+o;this._items.splice(r,0,i),this._itemMap.set(s,i),this.fire("add",i,r)}return this.fire("change",{added:e,removed:[],index:t}),this}get(e){let t;if("string"==typeof e)t=this._itemMap.get(e);else{if("number"!=typeof e)throw new s.a("collection-get-invalid-arg",this);t=this._items[e]}return t||null}has(e){if("string"==typeof e)return this._itemMap.has(e);{const t=e[this._idProperty];return this._itemMap.has(t)}}getIndex(e){let t;return t="string"==typeof e?this._itemMap.get(e):e,this._items.indexOf(t)}remove(e){const[t,o]=this._remove(e);return this.fire("change",{added:[],removed:[t],index:o}),t}map(e,t){return this._items.map(e,t)}find(e,t){return this._items.find(e,t)}filter(e,t){return this._items.filter(e,t)}clear(){this._bindToCollection&&(this.stopListening(this._bindToCollection),this._bindToCollection=null);const e=Array.from(this._items);for(;this.length;)this._remove(0);this.fire("change",{added:[],removed:e,index:0})}bindTo(e){if(this._bindToCollection)throw new s.a("collection-bind-to-rebind",this);return this._bindToCollection=e,{as:e=>{this._setUpBindToBinding(t=>new e(t))},using:e=>{"function"==typeof e?this._setUpBindToBinding(t=>e(t)):this._setUpBindToBinding(t=>t[e])}}}_setUpBindToBinding(e){const t=this._bindToCollection,o=(o,i,s)=>{const r=t._bindToCollection==this,n=t._bindToInternalToExternalMap.get(i);if(r&&n)this._bindToExternalToInternalMap.set(i,n),this._bindToInternalToExternalMap.set(n,i);else{const o=e(i);if(!o)return void this._skippedIndexesFromExternal.push(s);let r=s;for(const e of this._skippedIndexesFromExternal)s>e&&r--;for(const e of t._skippedIndexesFromExternal)r>=e&&r++;this._bindToExternalToInternalMap.set(i,o),this._bindToInternalToExternalMap.set(o,i),this.add(o,r);for(let e=0;e<t._skippedIndexesFromExternal.length;e++)r<=t._skippedIndexesFromExternal[e]&&t._skippedIndexesFromExternal[e]++}};for(const e of t)o(0,e,t.getIndex(e));this.listenTo(t,"add",o),this.listenTo(t,"remove",(e,t,o)=>{const i=this._bindToExternalToInternalMap.get(t);i&&this.remove(i),this._skippedIndexesFromExternal=this._skippedIndexesFromExternal.reduce((e,t)=>(o<t&&e.push(t-1),o>t&&e.push(t),e),[])})}_getItemIdBeforeAdding(e){const t=this._idProperty;let o;if(t in e){if(o=e[t],"string"!=typeof o)throw new s.a("collection-add-invalid-id",this);if(this.get(o))throw new s.a("collection-add-item-already-exists",this)}else e[t]=o=Object(r.a)();return o}_remove(e){let t,o,i,r=!1;const n=this._idProperty;if("string"==typeof e?(o=e,i=this._itemMap.get(o),r=!i,i&&(t=this._items.indexOf(i))):"number"==typeof e?(t=e,i=this._items[t],r=!i,i&&(o=i[n])):(i=e,o=i[n],t=this._items.indexOf(i),r=-1==t||!this._itemMap.get(o)),r)throw new s.a("collection-remove-404",this);this._items.splice(t,1),this._itemMap.delete(o);const a=this._bindToInternalToExternalMap.get(i);return this._bindToInternalToExternalMap.delete(i),this._bindToExternalToInternalMap.delete(a),this.fire("remove",i,t),[i,t]}[Symbol.iterator](){return this._items[Symbol.iterator]()}}Object(a.a)(c,i.c)},"./packages/ckeditor5-utils/src/comparearrays.js":function(e,t,o){"use strict";function i(e,t){const o=Math.min(e.length,t.length);for(let i=0;i<o;i++)if(e[i]!=t[i])return i;return e.length==t.length?"same":e.length<t.length?"prefix":"extension"}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/count.js":function(e,t,o){"use strict";function i(e){let t=0;for(const o of e)t++;return t}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/diff.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-utils/src/fastdiff.js");function s(e,t,o){o=o||function(e,t){return e===t};const i=e.length,r=t.length;if(i>200||r>200||i+r>300)return s.fastDiff(e,t,o,!0);let n,a;if(r<i){const o=e;e=t,t=o,n="delete",a="insert"}else n="insert",a="delete";const c=e.length,l=t.length,d=l-c,u={},h={};function p(i){const s=(void 0!==h[i-1]?h[i-1]:-1)+1,r=void 0!==h[i+1]?h[i+1]:-1,d=s>r?-1:1;u[i+d]&&(u[i]=u[i+d].slice(0)),u[i]||(u[i]=[]),u[i].push(s>r?n:a);let p=Math.max(s,r),g=p-i;for(;g<c&&p<l&&o(e[g],t[p]);)g++,p++,u[i].push("equal");return p}let g,f=0;do{for(g=-f;g<d;g++)h[g]=p(g);for(g=d+f;g>d;g--)h[g]=p(g);h[d]=p(d),f++}while(h[d]!==l);return u[d].slice(1)}s.fastDiff=i.a},"./packages/ckeditor5-utils/src/dom/createelement.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-utils/src/isiterable.js"),s=o("./node_modules/lodash-es/_baseGetTag.js"),r=o("./node_modules/lodash-es/isArray.js"),n=o("./node_modules/lodash-es/isObjectLike.js");var a=function(e){return"string"==typeof e||!Object(r.a)(e)&&Object(n.a)(e)&&"[object String]"==Object(s.a)(e)};function c(e,t,o={},s=[]){const r=o&&o.xmlns,n=r?e.createElementNS(r,t):e.createElement(t);for(const e in o)n.setAttribute(e,o[e]);!a(s)&&Object(i.a)(s)||(s=[s]);for(let t of s)a(t)&&(t=e.createTextNode(t)),n.appendChild(t);return n}},"./packages/ckeditor5-utils/src/dom/emittermixin.js":function(e,t,o){"use strict";var i=o("./packages/ckeditor5-utils/src/emittermixin.js"),s=o("./packages/ckeditor5-utils/src/uid.js"),r=o("./packages/ckeditor5-utils/src/dom/isnode.js"),n=o("./packages/ckeditor5-utils/src/dom/iswindow.js"),a=o("./node_modules/lodash-es/assignIn.js");const c=Object(a.a)({},i.c,{listenTo(e,...t){if(Object(r.a)(e)||Object(n.a)(e)){const o=this._getProxyEmitter(e)||new l(e);o.attach(...t),e=o}i.c.listenTo.call(this,e,...t)},stopListening(e,t,o){if(Object(r.a)(e)||Object(n.a)(e)){const t=this._getProxyEmitter(e);if(!t)return;e=t}i.c.stopListening.call(this,e,t,o),e instanceof l&&e.detach(t)},_getProxyEmitter(e){return Object(i.a)(this,d(e))}});t.a=c;class l{constructor(e){Object(i.b)(this,d(e)),this._domNode=e}}function d(e){return e["data-ck-expando"]||(e["data-ck-expando"]=Object(s.a)())}Object(a.a)(l.prototype,i.c,{attach(e,t,o={}){if(this._domListeners&&this._domListeners[e])return;const i={capture:!!o.useCapture,passive:!!o.usePassive},s=this._createDomListener(e,i);this._domNode.addEventListener(e,s,i),this._domListeners||(this._domListeners={}),this._domListeners[e]=s},detach(e){let t;!this._domListeners[e]||(t=this._events[e])&&t.callbacks.length||this._domListeners[e].removeListener()},_createDomListener(e,t){const o=t=>{this.fire(e,t)};return o.removeListener=()=>{this._domNode.removeEventListener(e,o,t),delete this._domListeners[e]},o}})},"./packages/ckeditor5-utils/src/dom/getborderwidths.js":function(e,t,o){"use strict";function i(e){const t=e.ownerDocument.defaultView.getComputedStyle(e);return{top:parseInt(t.borderTopWidth,10),right:parseInt(t.borderRightWidth,10),bottom:parseInt(t.borderBottomWidth,10),left:parseInt(t.borderLeftWidth,10)}}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/dom/global.js":function(e,t,o){"use strict";t.a={window:window,document:document}},"./packages/ckeditor5-utils/src/dom/isnode.js":function(e,t,o){"use strict";function i(e){if(e){if(e.defaultView)return e instanceof e.defaultView.Document;if(e.ownerDocument&&e.ownerDocument.defaultView)return e instanceof e.ownerDocument.defaultView.Node}return!1}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/dom/isrange.js":function(e,t,o){"use strict";function i(e){return"[object Range]"==Object.prototype.toString.apply(e)}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/dom/istext.js":function(e,t,o){"use strict";function i(e){return"[object Text]"==Object.prototype.toString.call(e)}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/dom/iswindow.js":function(e,t,o){"use strict";function i(e){const t=Object.prototype.toString.apply(e);return"[object Window]"==t||"[object global]"==t}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/dom/position.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-utils/src/dom/global.js"),s=o("./packages/ckeditor5-utils/src/dom/rect.js");var r=o("./packages/ckeditor5-utils/src/dom/getborderwidths.js"),n=o("./node_modules/lodash-es/isFunction.js");function a({element:e,target:t,positions:o,limiter:r,fitInViewport:a,viewportOffsetConfig:c}){Object(n.a)(t)&&(t=t()),Object(n.a)(r)&&(r=r());const d=function(e){return e&&e.parentNode?e.offsetParent===i.a.document.body?null:e.offsetParent:null}(e),u=new s.a(e);let h;const p={targetRect:new s.a(t),elementRect:u,positionedElementAncestor:d};if(r||a){const e=r&&new s.a(r).getVisible(),t=a&&function(e){e=Object.assign({top:0,bottom:0,left:0,right:0},e);const t=new s.a(i.a.window);return t.top+=e.top,t.height-=e.top,t.bottom-=e.bottom,t.height-=e.bottom,t}(c);Object.assign(p,{limiterRect:e,viewportRect:t}),h=function(e,t){const{elementRect:o}=t,i=o.getArea(),s=e.map(e=>new l(e,t)).filter(e=>!!e.name);let r=0,n=null;for(const e of s){const{_limiterIntersectionArea:t,_viewportIntersectionArea:o}=e;if(t===i)return e;const s=o**2+t**2;s>r&&(r=s,n=e)}return n}(o,p)||new l(o[0],p)}else h=new l(o[0],p);return h}function c(e){const{scrollX:t,scrollY:o}=i.a.window;return e.clone().moveBy(t,o)}class l{constructor(e,t){const o=e(t.targetRect,t.elementRect,t.viewportRect);if(!o)return;const{left:i,top:s,name:r,config:n}=o;Object.assign(this,{name:r,config:n}),this._positioningFunctionCorrdinates={left:i,top:s},this._options=t}get left(){return this._absoluteRect.left}get top(){return this._absoluteRect.top}get _limiterIntersectionArea(){const e=this._options.limiterRect;if(e){const t=this._options.viewportRect;if(!t)return e.getIntersectionArea(this._rect);{const o=e.getIntersection(t);if(o)return o.getIntersectionArea(this._rect)}}return 0}get _viewportIntersectionArea(){const e=this._options.viewportRect;return e?e.getIntersectionArea(this._rect):0}get _rect(){return this._cachedRect||(this._cachedRect=this._options.elementRect.clone().moveTo(this._positioningFunctionCorrdinates.left,this._positioningFunctionCorrdinates.top)),this._cachedRect}get _absoluteRect(){return this._cachedAbsoluteRect||(this._cachedAbsoluteRect=c(this._rect),this._options.positionedElementAncestor&&function(e,t){const o=c(new s.a(t)),i=Object(r.a)(t);let n=0,a=0;n-=o.left,a-=o.top,n+=t.scrollLeft,a+=t.scrollTop,n-=i.left,a-=i.top,e.moveBy(n,a)}(this._cachedAbsoluteRect,this._options.positionedElementAncestor)),this._cachedAbsoluteRect}}},"./packages/ckeditor5-utils/src/dom/rect.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return l}));var i=o("./packages/ckeditor5-utils/src/dom/isrange.js"),s=o("./packages/ckeditor5-utils/src/dom/iswindow.js"),r=o("./packages/ckeditor5-utils/src/dom/getborderwidths.js"),n=o("./packages/ckeditor5-utils/src/dom/istext.js"),a=o("./node_modules/lodash-es/isElement.js");const c=["top","right","bottom","left","width","height"];class l{constructor(e){const t=Object(i.a)(e);if(Object.defineProperty(this,"_source",{value:e._source||e,writable:!0,enumerable:!1}),Object(a.a)(e)||t)if(t){const t=l.getDomRangeRects(e);d(this,l.getBoundingRect(t))}else d(this,e.getBoundingClientRect());else if(Object(s.a)(e)){const{innerWidth:t,innerHeight:o}=e;d(this,{top:0,right:t,bottom:o,left:0,width:t,height:o})}else d(this,e)}clone(){return new l(this)}moveTo(e,t){return this.top=t,this.right=e+this.width,this.bottom=t+this.height,this.left=e,this}moveBy(e,t){return this.top+=t,this.right+=e,this.left+=e,this.bottom+=t,this}getIntersection(e){const t={top:Math.max(this.top,e.top),right:Math.min(this.right,e.right),bottom:Math.min(this.bottom,e.bottom),left:Math.max(this.left,e.left)};return t.width=t.right-t.left,t.height=t.bottom-t.top,t.width<0||t.height<0?null:new l(t)}getIntersectionArea(e){const t=this.getIntersection(e);return t?t.getArea():0}getArea(){return this.width*this.height}getVisible(){const e=this._source;let t=this.clone();if(!u(e)){let o=e.parentNode||e.commonAncestorContainer;for(;o&&!u(o);){const e=new l(o),i=t.getIntersection(e);if(!i)return null;i.getArea()<t.getArea()&&(t=i),o=o.parentNode}}return t}isEqual(e){for(const t of c)if(this[t]!==e[t])return!1;return!0}contains(e){const t=this.getIntersection(e);return!(!t||!t.isEqual(e))}excludeScrollbarsAndBorders(){const e=this._source;let t,o,i;if(Object(s.a)(e))t=e.innerWidth-e.document.documentElement.clientWidth,o=e.innerHeight-e.document.documentElement.clientHeight,i=e.getComputedStyle(e.document.documentElement).direction;else{const s=Object(r.a)(this._source);t=e.offsetWidth-e.clientWidth-s.left-s.right,o=e.offsetHeight-e.clientHeight-s.top-s.bottom,i=e.ownerDocument.defaultView.getComputedStyle(e).direction,this.left+=s.left,this.top+=s.top,this.right-=s.right,this.bottom-=s.bottom,this.width=this.right-this.left,this.height=this.bottom-this.top}return this.width-=t,"ltr"===i?this.right-=t:this.left+=t,this.height-=o,this.bottom-=o,this}static getDomRangeRects(e){const t=[],o=Array.from(e.getClientRects());if(o.length)for(const e of o)t.push(new l(e));else{let o=e.startContainer;Object(n.a)(o)&&(o=o.parentNode);const i=new l(o.getBoundingClientRect());i.right=i.left,i.width=0,t.push(i)}return t}static getBoundingRect(e){const t={left:Number.POSITIVE_INFINITY,top:Number.POSITIVE_INFINITY,right:Number.NEGATIVE_INFINITY,bottom:Number.NEGATIVE_INFINITY};let o=0;for(const i of e)o++,t.left=Math.min(t.left,i.left),t.top=Math.min(t.top,i.top),t.right=Math.max(t.right,i.right),t.bottom=Math.max(t.bottom,i.bottom);return 0==o?null:(t.width=t.right-t.left,t.height=t.bottom-t.top,new l(t))}}function d(e,t){for(const o of c)e[o]=t[o]}function u(e){return!!Object(a.a)(e)&&e===e.ownerDocument.body}},"./packages/ckeditor5-utils/src/dom/resizeobserver.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-utils/src/mix.js"),s=o("./packages/ckeditor5-utils/src/dom/global.js"),r=o("./packages/ckeditor5-utils/src/dom/rect.js"),n=o("./packages/ckeditor5-utils/src/dom/emittermixin.js");class a{constructor(e,t){a._observerInstance||a._createObserver(),this._element=e,this._callback=t,a._addElementCallback(e,t),a._observerInstance.observe(e)}destroy(){a._deleteElementCallback(this._element,this._callback)}static _addElementCallback(e,t){a._elementCallbacks||(a._elementCallbacks=new Map);let o=a._elementCallbacks.get(e);o||(o=new Set,a._elementCallbacks.set(e,o)),o.add(t)}static _deleteElementCallback(e,t){const o=a._getElementCallbacks(e);o&&(o.delete(t),o.size||(a._elementCallbacks.delete(e),a._observerInstance.unobserve(e))),a._elementCallbacks&&!a._elementCallbacks.size&&(a._observerInstance=null,a._elementCallbacks=null)}static _getElementCallbacks(e){return a._elementCallbacks?a._elementCallbacks.get(e):null}static _createObserver(){let e;e="function"==typeof s.a.window.ResizeObserver?s.a.window.ResizeObserver:c,a._observerInstance=new e(e=>{for(const t of e){const e=a._getElementCallbacks(t.target);if(e)for(const o of e)o(t)}})}}a._observerInstance=null,a._elementCallbacks=null;class c{constructor(e){this._callback=e,this._elements=new Set,this._previousRects=new Map,this._periodicCheckTimeout=null}observe(e){this._elements.add(e),this._checkElementRectsAndExecuteCallback(),1===this._elements.size&&this._startPeriodicCheck()}unobserve(e){this._elements.delete(e),this._previousRects.delete(e),this._elements.size||this._stopPeriodicCheck()}_startPeriodicCheck(){const e=()=>{this._checkElementRectsAndExecuteCallback(),this._periodicCheckTimeout=setTimeout(e,100)};this.listenTo(s.a.window,"resize",()=>{this._checkElementRectsAndExecuteCallback()}),this._periodicCheckTimeout=setTimeout(e,100)}_stopPeriodicCheck(){clearTimeout(this._periodicCheckTimeout),this.stopListening(),this._previousRects.clear()}_checkElementRectsAndExecuteCallback(){const e=[];for(const t of this._elements)this._hasRectChanged(t)&&e.push({target:t,contentRect:this._previousRects.get(t)});e.length&&this._callback(e)}_hasRectChanged(e){if(!e.ownerDocument.body.contains(e))return!1;const t=new r.a(e),o=this._previousRects.get(e),i=!o||!o.isEqual(t);return this._previousRects.set(e,t),i}}Object(i.a)(c,n.a)},"./packages/ckeditor5-utils/src/dom/setdatainelement.js":function(e,t,o){"use strict";function i(e,t){e instanceof HTMLTextAreaElement&&(e.value=t),e.innerHTML=t}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/dom/tounit.js":function(e,t,o){"use strict";function i(e){return t=>t+e}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/emittermixin.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return d})),o.d(t,"b",(function(){return u}));var i=o("./packages/ckeditor5-utils/src/eventinfo.js"),s=o("./packages/ckeditor5-utils/src/uid.js"),r=o("./packages/ckeditor5-utils/src/priorities.js"),n=(o("./packages/ckeditor5-utils/src/version.js"),o("./packages/ckeditor5-utils/src/ckeditorerror.js"));const a=Symbol("listeningTo"),c=Symbol("emitterId"),l={on(e,t,o={}){this.listenTo(this,e,t,o)},once(e,t,o){let i=!1;this.listenTo(this,e,(function(e,...o){i||(i=!0,e.off(),t.call(this,e,...o))}),o)},off(e,t){this.stopListening(this,e,t)},listenTo(e,t,o,i={}){let s,r;this[a]||(this[a]={});const n=this[a];h(e)||u(e);const c=h(e);(s=n[c])||(s=n[c]={emitter:e,callbacks:{}}),(r=s.callbacks[t])||(r=s.callbacks[t]=[]),r.push(o),function(e,t,o,i,s){t._addEventListener?t._addEventListener(o,i,s):e._addEventListener.call(t,o,i,s)}(this,e,t,o,i)},stopListening(e,t,o){const i=this[a];let s=e&&h(e);const r=i&&s&&i[s],n=r&&t&&r.callbacks[t];if(!(!i||e&&!r||t&&!n))if(o){m(this,e,t,o);-1!==n.indexOf(o)&&(1===n.length?delete r.callbacks[t]:m(this,e,t,o))}else if(n){for(;o=n.pop();)m(this,e,t,o);delete r.callbacks[t]}else if(r){for(t in r.callbacks)this.stopListening(e,t);delete i[s]}else{for(s in i)this.stopListening(i[s].emitter);delete this[a]}},fire(e,...t){try{const o=e instanceof i.a?e:new i.a(this,e),s=o.name;let r=function e(t,o){let i;if(!t._events||!(i=t._events[o])||!i.callbacks.length)return o.indexOf(":")>-1?e(t,o.substr(0,o.lastIndexOf(":"))):null;return i.callbacks}(this,s);if(o.path.push(this),r){const e=[o,...t];r=Array.from(r);for(let t=0;t<r.length&&(r[t].callback.apply(this,e),o.off.called&&(delete o.off.called,this._removeEventListener(s,r[t].callback)),!o.stop.called);t++);}if(this._delegations){const e=this._delegations.get(s),i=this._delegations.get("*");e&&f(e,o,t),i&&f(i,o,t)}return o.return}catch(e){n.a.rethrowUnexpectedError(e,this)}},delegate(...e){return{to:(t,o)=>{this._delegations||(this._delegations=new Map),e.forEach(e=>{const i=this._delegations.get(e);i?i.set(t,o):this._delegations.set(e,new Map([[t,o]]))})}}},stopDelegating(e,t){if(this._delegations)if(e)if(t){const o=this._delegations.get(e);o&&o.delete(t)}else this._delegations.delete(e);else this._delegations.clear()},_addEventListener(e,t,o){!function(e,t){const o=p(e);if(o[t])return;let i=t,s=null;const r=[];for(;""!==i&&!o[i];)o[i]={callbacks:[],childEvents:[]},r.push(o[i]),s&&o[i].childEvents.push(s),s=i,i=i.substr(0,i.lastIndexOf(":"));if(""!==i){for(const e of r)e.callbacks=o[i].callbacks.slice();o[i].childEvents.push(s)}}(this,e);const i=g(this,e),s=r.a.get(o.priority),n={callback:t,priority:s};for(const e of i){let t=!1;for(let o=0;o<e.length;o++)if(e[o].priority<s){e.splice(o,0,n),t=!0;break}t||e.push(n)}},_removeEventListener(e,t){const o=g(this,e);for(const e of o)for(let o=0;o<e.length;o++)e[o].callback==t&&(e.splice(o,1),o--)}};function d(e,t){return e[a]&&e[a][t]?e[a][t].emitter:null}function u(e,t){e[c]||(e[c]=t||Object(s.a)())}function h(e){return e[c]}function p(e){return e._events||Object.defineProperty(e,"_events",{value:{}}),e._events}function g(e,t){const o=p(e)[t];if(!o)return[];let i=[o.callbacks];for(let t=0;t<o.childEvents.length;t++){const s=g(e,o.childEvents[t]);i=i.concat(s)}return i}function f(e,t,o){for(let[s,r]of e){r?"function"==typeof r&&(r=r(t.name)):r=t.name;const e=new i.a(t.source,r);e.path=[...t.path],s.fire(e,...o)}}function m(e,t,o,i){t._removeEventListener?t._removeEventListener(o,i):e._removeEventListener.call(t,o,i)}t.c=l},"./packages/ckeditor5-utils/src/env.js":function(e,t,o){"use strict";const i=navigator.userAgent.toLowerCase(),s={isMac:function(e){return e.indexOf("macintosh")>-1}(i),isGecko:function(e){return!!e.match(/gecko\/\d+/)}(i),isSafari:function(e){return e.indexOf(" applewebkit/")>-1&&-1===e.indexOf("chrome")}(i),isAndroid:function(e){return e.indexOf("android")>-1}(i),isBlink:function(e){return e.indexOf("chrome/")>-1&&e.indexOf("edge/")<0}(i),features:{isRegExpUnicodePropertySupported:function(){let e=!1;try{e=0==="ć".search(new RegExp("[\\p{L}]","u"))}catch(e){}return e}()}};t.a=s},"./packages/ckeditor5-utils/src/eventinfo.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=function(){return function e(){e.called=!0}};class s{constructor(e,t){this.source=e,this.name=t,this.path=[],this.stop=i(),this.off=i()}}},"./packages/ckeditor5-utils/src/fastdiff.js":function(e,t,o){"use strict";function i(e,t,o,i=!1){o=o||function(e,t){return e===t},Array.isArray(e)||(e=Array.prototype.slice.call(e)),Array.isArray(t)||(t=Array.prototype.slice.call(t));const n=function(e,t,o){const i=s(e,t,o);if(-1===i)return{firstIndex:-1,lastIndexOld:-1,lastIndexNew:-1};const n=r(e,i),a=r(t,i),c=s(n,a,o),l=e.length-c,d=t.length-c;return{firstIndex:i,lastIndexOld:l,lastIndexNew:d}}(e,t,o);return i?function(e,t){const{firstIndex:o,lastIndexOld:i,lastIndexNew:s}=e;if(-1===o)return Array(t).fill("equal");let r=[];o>0&&(r=r.concat(Array(o).fill("equal")));s-o>0&&(r=r.concat(Array(s-o).fill("insert")));i-o>0&&(r=r.concat(Array(i-o).fill("delete")));s<t&&(r=r.concat(Array(t-s).fill("equal")));return r}(n,t.length):function(e,t){const o=[],{firstIndex:i,lastIndexOld:s,lastIndexNew:r}=t;r-i>0&&o.push({index:i,type:"insert",values:e.slice(i,r)});s-i>0&&o.push({index:i+(r-i),type:"delete",howMany:s-i});return o}(t,n)}function s(e,t,o){for(let i=0;i<Math.max(e.length,t.length);i++)if(void 0===e[i]||void 0===t[i]||!o(e[i],t[i]))return i;return-1}function r(e,t){return e.slice(t).reverse()}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/first.js":function(e,t,o){"use strict";function i(e){const t=e.next();return t.done?null:t.value}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/focustracker.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-utils/src/dom/emittermixin.js"),s=o("./packages/ckeditor5-utils/src/observablemixin.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-utils/src/mix.js");class a{constructor(){this.set("isFocused",!1),this.set("focusedElement",null),this._elements=new Set,this._nextEventLoopTimeout=null}add(e){if(this._elements.has(e))throw new r.a("focustracker-add-element-already-exist",this);this.listenTo(e,"focus",()=>this._focus(e),{useCapture:!0}),this.listenTo(e,"blur",()=>this._blur(),{useCapture:!0}),this._elements.add(e)}remove(e){e===this.focusedElement&&this._blur(e),this._elements.has(e)&&(this.stopListening(e),this._elements.delete(e))}destroy(){this.stopListening()}_focus(e){clearTimeout(this._nextEventLoopTimeout),this.focusedElement=e,this.isFocused=!0}_blur(){clearTimeout(this._nextEventLoopTimeout),this._nextEventLoopTimeout=setTimeout(()=>{this.focusedElement=null,this.isFocused=!1},0)}}Object(n.a)(a,i.a),Object(n.a)(a,s.a)},"./packages/ckeditor5-utils/src/index.js":function(e,t,o){"use strict";o.d(t,"n",(function(){return i.a})),o.d(t,"m",(function(){return s.a})),o.d(t,"A",(function(){return r.a})),o.d(t,"e",(function(){return n.c})),o.d(t,"i",(function(){return a.a})),o.d(t,"a",(function(){return c.a})),o.d(t,"y",(function(){return c.b})),o.d(t,"z",(function(){return c.c})),o.d(t,"d",(function(){return l})),o.d(t,"l",(function(){return d.a})),o.d(t,"c",(function(){return u.a})),o.d(t,"u",(function(){return h.a})),o.d(t,"q",(function(){return p})),o.d(t,"j",(function(){return g.a})),o.d(t,"k",(function(){return f.a})),o.d(t,"D",(function(){return m.a})),o.d(t,"G",(function(){return k.a})),o.d(t,"x",(function(){return b.f})),o.d(t,"p",(function(){return b.a})),o.d(t,"B",(function(){return b.g})),o.d(t,"r",(function(){return b.b})),o.d(t,"v",(function(){return b.d})),o.d(t,"t",(function(){return b.c})),o.d(t,"w",(function(){return b.e})),o.d(t,"s",(function(){return _.a})),o.d(t,"h",(function(){return w.a})),o.d(t,"b",(function(){return v.a})),o.d(t,"o",(function(){return y.a})),o.d(t,"f",(function(){return j.a})),o.d(t,"g",(function(){return x.a})),o.d(t,"E",(function(){return P.a})),o.d(t,"F",(function(){return O.a})),o.d(t,"C",(function(){return A.a})),o.d(t,"H",(function(){return T.a})),o.d(t,"I",(function(){return C.a}));var i=o("./packages/ckeditor5-utils/src/env.js"),s=o("./packages/ckeditor5-utils/src/diff.js"),r=o("./packages/ckeditor5-utils/src/mix.js"),n=o("./packages/ckeditor5-utils/src/emittermixin.js"),a=o("./packages/ckeditor5-utils/src/observablemixin.js"),c=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class l{constructor(){this._replacedElements=[]}replace(e,t){this._replacedElements.push({element:e,newElement:t}),e.style.display="none",t&&e.parentNode.insertBefore(t,e.nextSibling)}restore(){this._replacedElements.forEach(({element:e,newElement:t})=>{e.style.display="",t&&t.remove()}),this._replacedElements=[]}}var d=o("./packages/ckeditor5-utils/src/dom/createelement.js"),u=o("./packages/ckeditor5-utils/src/dom/emittermixin.js"),h=o("./packages/ckeditor5-utils/src/dom/global.js");function p(e){return e instanceof HTMLTextAreaElement?e.value:e.innerHTML}var g=o("./packages/ckeditor5-utils/src/dom/rect.js"),f=o("./packages/ckeditor5-utils/src/dom/resizeobserver.js"),m=o("./packages/ckeditor5-utils/src/dom/setdatainelement.js"),k=o("./packages/ckeditor5-utils/src/dom/tounit.js"),b=o("./packages/ckeditor5-utils/src/keyboard.js"),_=o("./packages/ckeditor5-utils/src/language.js"),w=o("./packages/ckeditor5-utils/src/locale.js"),v=o("./packages/ckeditor5-utils/src/collection.js"),y=o("./packages/ckeditor5-utils/src/first.js"),j=o("./packages/ckeditor5-utils/src/focustracker.js"),x=o("./packages/ckeditor5-utils/src/keystrokehandler.js"),P=o("./packages/ckeditor5-utils/src/toarray.js"),O=o("./packages/ckeditor5-utils/src/tomap.js"),A=o("./packages/ckeditor5-utils/src/priorities.js"),T=o("./packages/ckeditor5-utils/src/uid.js"),C=o("./packages/ckeditor5-utils/src/version.js")},"./packages/ckeditor5-utils/src/isiterable.js":function(e,t,o){"use strict";function i(e){return!(!e||!e[Symbol.iterator])}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/keyboard.js":function(e,t,o){"use strict";o.d(t,"f",(function(){return a})),o.d(t,"a",(function(){return l})),o.d(t,"g",(function(){return d})),o.d(t,"b",(function(){return u})),o.d(t,"d",(function(){return h})),o.d(t,"c",(function(){return p})),o.d(t,"e",(function(){return g}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./packages/ckeditor5-utils/src/env.js");const r={ctrl:"⌃",cmd:"⌘",alt:"⌥",shift:"⇧"},n={ctrl:"Ctrl+",alt:"Alt+",shift:"Shift+"},a=function(){const e={arrowleft:37,arrowup:38,arrowright:39,arrowdown:40,backspace:8,delete:46,enter:13,space:32,esc:27,tab:9,ctrl:1114112,shift:2228224,alt:4456448,cmd:8912896};for(let t=65;t<=90;t++){const o=String.fromCharCode(t);e[o.toLowerCase()]=t}for(let t=48;t<=57;t++)e[t-48]=t;for(let t=112;t<=123;t++)e["f"+(t-111)]=t;for(const t of"`-=[];',./\\")e[t]=t.charCodeAt(0);return e}(),c=Object.fromEntries(Object.entries(a).map(([e,t])=>[t,e.charAt(0).toUpperCase()+e.slice(1)]));function l(e){let t;if("string"==typeof e){if(t=a[e.toLowerCase()],!t)throw new i.a("keyboard-unknown-key",null,{key:e})}else t=e.keyCode+(e.altKey?a.alt:0)+(e.ctrlKey?a.ctrl:0)+(e.shiftKey?a.shift:0)+(e.metaKey?a.cmd:0);return t}function d(e){return"string"==typeof e&&(e=function(e){return e.split("+").map(e=>e.trim())}(e)),e.map(e=>"string"==typeof e?function(e){if(e.endsWith("!"))return l(e.slice(0,-1));const t=l(e);return s.a.isMac&&t==a.ctrl?a.cmd:t}(e):e).reduce((e,t)=>t+e,0)}function u(e){let t=d(e);return Object.entries(s.a.isMac?r:n).reduce((e,[o,i])=>(0!=(t&a[o])&&(t&=~a[o],e+=i),e),"")+(t?c[t]:"")}function h(e){return e==a.arrowright||e==a.arrowleft||e==a.arrowup||e==a.arrowdown}function p(e,t){const o="ltr"===t;switch(e){case a.arrowleft:return o?"left":"right";case a.arrowright:return o?"right":"left";case a.arrowup:return"up";case a.arrowdown:return"down"}}function g(e,t){const o=p(e,t);return"down"===o||"right"===o}},"./packages/ckeditor5-utils/src/keystrokehandler.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-utils/src/dom/emittermixin.js"),s=o("./packages/ckeditor5-utils/src/keyboard.js");class r{constructor(){this._listener=Object.create(i.a)}listenTo(e){this._listener.listenTo(e,"keydown",(e,t)=>{this._listener.fire("_keydown:"+Object(s.a)(t),t)})}set(e,t,o={}){const i=Object(s.g)(e),r=o.priority;this._listener.listenTo(this._listener,"_keydown:"+i,(e,o)=>{t(o,()=>{o.preventDefault(),o.stopPropagation(),e.stop()}),e.return=!0},{priority:r})}press(e){return!!this._listener.fire("_keydown:"+Object(s.a)(e),e)}destroy(){this._listener.stopListening()}}},"./packages/ckeditor5-utils/src/language.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));const i=["ar","ara","fa","per","fas","he","heb","ku","kur","ug","uig"];function s(e){return i.includes(e)?"rtl":"ltr"}},"./packages/ckeditor5-utils/src/locale.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-utils/src/toarray.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js");function r(e,t,o=1){if("number"!=typeof o)throw new s.a("translation-service-quantity-not-a-number",null,{quantity:o});const i=Object.keys(window.CKEDITOR_TRANSLATIONS).length;1===i&&(e=Object.keys(window.CKEDITOR_TRANSLATIONS)[0]);const r=t.id||t.string;if(0===i||!function(e,t){return!!window.CKEDITOR_TRANSLATIONS[e]&&!!window.CKEDITOR_TRANSLATIONS[e].dictionary[t]}(e,r))return 1!==o?t.plural:t.string;const n=window.CKEDITOR_TRANSLATIONS[e].dictionary,a=window.CKEDITOR_TRANSLATIONS[e].getPluralForm||(e=>1===e?0:1);if("string"==typeof n[r])return n[r];const c=Number(a(o));return n[r][c]}window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={});var n=o("./packages/ckeditor5-utils/src/language.js");class a{constructor(e={}){this.uiLanguage=e.uiLanguage||"en",this.contentLanguage=e.contentLanguage||this.uiLanguage,this.uiLanguageDirection=Object(n.a)(this.uiLanguage),this.contentLanguageDirection=Object(n.a)(this.contentLanguage),this.t=(e,t)=>this._t(e,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(e,t=[]){t=Object(i.a)(t),"string"==typeof e&&(e={string:e});const o=!!e.plural?t[0]:1;return function(e,t){return e.replace(/%(\d+)/g,(e,o)=>o<t.length?t[o]:e)}(r(this.uiLanguage,e,o),t)}}},"./packages/ckeditor5-utils/src/mix.js":function(e,t,o){"use strict";function i(e,...t){t.forEach(t=>{Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t)).forEach(o=>{if(o in e.prototype)return;const i=Object.getOwnPropertyDescriptor(t,o);i.enumerable=!1,Object.defineProperty(e.prototype,o,i)})})}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/observablemixin.js":function(e,t,o){"use strict";var i=o("./packages/ckeditor5-utils/src/emittermixin.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),r=o("./node_modules/lodash-es/isObject.js"),n=o("./node_modules/lodash-es/assignIn.js");const a=Symbol("observableProperties"),c=Symbol("boundObservables"),l=Symbol("boundProperties"),d=Symbol("decoratedMethods"),u=Symbol("decoratedOriginal"),h={set(e,t){if(Object(r.a)(e))return void Object.keys(e).forEach(t=>{this.set(t,e[t])},this);p(this);const o=this[a];if(e in this&&!o.has(e))throw new s.a("observable-set-cannot-override",this);Object.defineProperty(this,e,{enumerable:!0,configurable:!0,get:()=>o.get(e),set(t){const i=o.get(e);let s=this.fire("set:"+e,e,t,i);void 0===s&&(s=t),i===s&&o.has(e)||(o.set(e,s),this.fire("change:"+e,e,s,i))}}),this[e]=t},bind(...e){if(!e.length||!m(e))throw new s.a("observable-bind-wrong-properties",this);if(new Set(e).size!==e.length)throw new s.a("observable-bind-duplicate-properties",this);p(this);const t=this[l];e.forEach(e=>{if(t.has(e))throw new s.a("observable-bind-rebind",this)});const o=new Map;return e.forEach(e=>{const i={property:e,to:[]};t.set(e,i),o.set(e,i)}),{to:g,toMany:f,_observable:this,_bindProperties:e,_to:[],_bindings:o}},unbind(...e){if(!this[a])return;const t=this[l],o=this[c];if(e.length){if(!m(e))throw new s.a("observable-unbind-wrong-properties",this);e.forEach(e=>{const i=t.get(e);if(!i)return;let s,r,n,a;i.to.forEach(e=>{s=e[0],r=e[1],n=o.get(s),a=n[r],a.delete(i),a.size||delete n[r],Object.keys(n).length||(o.delete(s),this.stopListening(s,"change"))}),t.delete(e)})}else o.forEach((e,t)=>{this.stopListening(t,"change")}),o.clear(),t.clear()},decorate(e){const t=this[e];if(!t)throw new s.a("observablemixin-cannot-decorate-undefined",this,{object:this,methodName:e});this.on(e,(e,o)=>{e.return=t.apply(this,o)}),this[e]=function(...t){return this.fire(e,t)},this[e][u]=t,this[d]||(this[d]=[]),this[d].push(e)}};function p(e){e[a]||(Object.defineProperty(e,a,{value:new Map}),Object.defineProperty(e,c,{value:new Map}),Object.defineProperty(e,l,{value:new Map}))}function g(...e){const t=function(...e){if(!e.length)throw new s.a("observable-bind-to-parse-error",null);const t={to:[]};let o;"function"==typeof e[e.length-1]&&(t.callback=e.pop());return e.forEach(e=>{if("string"==typeof e)o.properties.push(e);else{if("object"!=typeof e)throw new s.a("observable-bind-to-parse-error",null);o={observable:e,properties:[]},t.to.push(o)}}),t}(...e),o=Array.from(this._bindings.keys()),i=o.length;if(!t.callback&&t.to.length>1)throw new s.a("observable-bind-to-no-callback",this);if(i>1&&t.callback)throw new s.a("observable-bind-to-extra-callback",this);var r;t.to.forEach(e=>{if(e.properties.length&&e.properties.length!==i)throw new s.a("observable-bind-to-properties-length",this);e.properties.length||(e.properties=this._bindProperties)}),this._to=t.to,t.callback&&(this._bindings.get(o[0]).callback=t.callback),r=this._observable,this._to.forEach(e=>{const t=r[c];let o;t.get(e.observable)||r.listenTo(e.observable,"change",(i,s)=>{o=t.get(e.observable)[s],o&&o.forEach(e=>{k(r,e.property)})})}),function(e){let t;e._bindings.forEach((o,i)=>{e._to.forEach(s=>{t=s.properties[o.callback?0:e._bindProperties.indexOf(i)],o.to.push([s.observable,t]),function(e,t,o,i){const s=e[c],r=s.get(o),n=r||{};n[i]||(n[i]=new Set);n[i].add(t),r||s.set(o,n)}(e._observable,o,s.observable,t)})})}(this),this._bindProperties.forEach(e=>{k(this._observable,e)})}function f(e,t,o){if(this._bindings.size>1)throw new s.a("observable-bind-to-many-not-one-binding",this);this.to(...function(e,t){const o=e.map(e=>[e,t]);return Array.prototype.concat.apply([],o)}(e,t),o)}function m(e){return e.every(e=>"string"==typeof e)}function k(e,t){const o=e[l].get(t);let i;o.callback?i=o.callback.apply(e,o.to.map(e=>e[0][e[1]])):(i=o.to[0],i=i[0][i[1]]),Object.prototype.hasOwnProperty.call(e,t)?e[t]=i:e.set(t,i)}Object(n.a)(h,i.c),h.stopListening=function(e,t,o){if(!e&&this[d]){for(const e of this[d])this[e]=this[e][u];delete this[d]}i.c.stopListening.call(this,e,t,o)},t.a=h},"./packages/ckeditor5-utils/src/priorities.js":function(e,t,o){"use strict";const i={get(e){return"number"!=typeof e?this[e]||this.normal:e},highest:1e5,high:1e3,normal:0,low:-1e3,lowest:-1e5};t.a=i},"./packages/ckeditor5-utils/src/toarray.js":function(e,t,o){"use strict";function i(e){return Array.isArray(e)?e:[e]}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/tomap.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-utils/src/isiterable.js");function s(e){return Object(i.a)(e)?new Map(e):function(e){const t=new Map;for(const o in e)t.set(o,e[o]);return t}(e)}},"./packages/ckeditor5-utils/src/uid.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));const i=new Array(256).fill().map((e,t)=>("0"+t.toString(16)).slice(-2));function s(){const e=4294967296*Math.random()>>>0,t=4294967296*Math.random()>>>0,o=4294967296*Math.random()>>>0,s=4294967296*Math.random()>>>0;return"e"+i[e>>0&255]+i[e>>8&255]+i[e>>16&255]+i[e>>24&255]+i[t>>0&255]+i[t>>8&255]+i[t>>16&255]+i[t>>24&255]+i[o>>0&255]+i[o>>8&255]+i[o>>16&255]+i[o>>24&255]+i[s>>0&255]+i[s>>8&255]+i[s>>16&255]+i[s>>24&255]}},"./packages/ckeditor5-utils/src/version.js":function(e,t,o){"use strict";(function(e){var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js");t.a="31.0.0";const s="object"==typeof window?window:e;if(s.CKEDITOR_VERSION)throw new i.a("ckeditor-duplicated-modules",null);s.CKEDITOR_VERSION="31.0.0"}).call(this,o("./node_modules/webpack/buildin/global.js"))},"./packages/ckeditor5-widget/src/utils.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return p})),o.d(t,"b",(function(){return g})),o.d(t,"e",(function(){return f})),o.d(t,"h",(function(){return m})),o.d(t,"f",(function(){return _})),o.d(t,"g",(function(){return w})),o.d(t,"d",(function(){return v})),o.d(t,"i",(function(){return y})),o.d(t,"c",(function(){return j})),o.d(t,"j",(function(){return x}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./packages/ckeditor5-utils/src/toarray.js"),r=o("./packages/ckeditor5-utils/src/emittermixin.js"),n=o("./packages/ckeditor5-utils/src/mix.js");class a{constructor(){this._stack=[]}add(e,t){const o=this._stack,i=o[0];this._insertDescriptor(e);const s=o[0];i===s||c(i,s)||this.fire("change:top",{oldDescriptor:i,newDescriptor:s,writer:t})}remove(e,t){const o=this._stack,i=o[0];this._removeDescriptor(e);const s=o[0];i===s||c(i,s)||this.fire("change:top",{oldDescriptor:i,newDescriptor:s,writer:t})}_insertDescriptor(e){const t=this._stack,o=t.findIndex(t=>t.id===e.id);if(c(e,t[o]))return;o>-1&&t.splice(o,1);let i=0;for(;t[i]&&l(t[i],e);)i++;t.splice(i,0,e)}_removeDescriptor(e){const t=this._stack,o=t.findIndex(t=>t.id===e);o>-1&&t.splice(o,1)}}function c(e,t){return e&&t&&e.priority==t.priority&&d(e.classes)==d(t.classes)}function l(e,t){return e.priority>t.priority||!(e.priority<t.priority)&&d(e.classes)>d(t.classes)}function d(e){return Array.isArray(e)?e.sort().join(","):e}Object(n.a)(a,r.c);var u=o("./packages/ckeditor5-widget/src/widgettypearound/utils.js"),h=o("./packages/ckeditor5-ui/src/icon/iconview.js");const p="ck-widget",g="ck-widget_selected";function f(e){return!!e.is("element")&&!!e.getCustomProperty("widget")}function m(e,t,o={}){if(!e.is("containerElement"))throw new i.a("widget-to-widget-wrong-element-type",null,{element:e});return t.setAttribute("contenteditable","false",e),t.addClass(p,e),t.setCustomProperty("widget",!0,e),e.getFillerOffset=P,o.label&&w(e,o.label,t),o.hasSelectionHandle&&function(e,t){const o=t.createUIElement("div",{class:"ck ck-widget__selection-handle"},(function(e){const t=this.toDomElement(e),o=new h.a;return o.set("content",'<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M4 0v1H1v3H0V.5A.5.5 0 0 1 .5 0H4zm8 0h3.5a.5.5 0 0 1 .5.5V4h-1V1h-3V0zM4 16H.5a.5.5 0 0 1-.5-.5V12h1v3h3v1zm8 0v-1h3v-3h1v3.5a.5.5 0 0 1-.5.5H12z"/><path fill-opacity=".256" d="M1 1h14v14H1z"/><g class="ck-icon__selected-indicator"><path d="M7 0h2v1H7V0zM0 7h1v2H0V7zm15 0h1v2h-1V7zm-8 8h2v1H7v-1z"/><path fill-opacity=".254" d="M1 1h14v14H1z"/></g></svg>'),o.render(),t.appendChild(o.element),t}));t.insert(t.createPositionAt(e,0),o),t.addClass(["ck-widget_with-selection-handle"],e)}(e,t),_(e,t),e}function k(e,t,o){if(t.classes&&o.addClass(Object(s.a)(t.classes),e),t.attributes)for(const i in t.attributes)o.setAttribute(i,t.attributes[i],e)}function b(e,t,o){if(t.classes&&o.removeClass(Object(s.a)(t.classes),e),t.attributes)for(const i in t.attributes)o.removeAttribute(i,e)}function _(e,t,o=k,i=b){const s=new a;s.on("change:top",(t,s)=>{s.oldDescriptor&&i(e,s.oldDescriptor,s.writer),s.newDescriptor&&o(e,s.newDescriptor,s.writer)}),t.setCustomProperty("addHighlight",(e,t,o)=>s.add(t,o),e),t.setCustomProperty("removeHighlight",(e,t,o)=>s.remove(t,o),e)}function w(e,t,o){o.setCustomProperty("widgetLabel",t,e)}function v(e){const t=e.getCustomProperty("widgetLabel");return t?"function"==typeof t?t():t:""}function y(e,t){return t.addClass(["ck-editor__editable","ck-editor__nested-editable"],e),t.setAttribute("contenteditable",e.isReadOnly?"false":"true",e),e.on("change:isReadOnly",(o,i,s)=>{t.setAttribute("contenteditable",s?"false":"true",e)}),e.on("change:isFocused",(o,i,s)=>{s?t.addClass("ck-editor__nested-editable_focused",e):t.removeClass("ck-editor__nested-editable_focused",e)}),_(e,t),e}function j(e,t){const o=e.getSelectedElement();if(o){const i=Object(u.e)(e);if(i)return t.createRange(t.createPositionAt(o,i));if(t.schema.isObject(o)&&!t.schema.isInline(o))return t.createRangeOn(o)}const i=e.getSelectedBlocks().next().value;if(i){if(i.isEmpty)return t.createRange(t.createPositionAt(i,0));const o=t.createPositionAfter(i);return e.focus.isTouching(o)?t.createRange(o):t.createRange(t.createPositionBefore(i))}return t.createRange(e.focus)}function x(e,t){return(o,i)=>{const{mapper:s,viewPosition:r}=i,n=s.findMappedViewAncestor(r);if(!t(n))return;const a=s.toModelElement(n);i.modelPosition=e.createPositionAt(a,r.isAtStart?"before":"after")}}function P(){return null}},"./packages/ckeditor5-widget/src/widget.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return g}));var i=o("./packages/ckeditor5-core/src/plugin.js"),s=o("./packages/ckeditor5-engine/src/view/observer/mouseobserver.js"),r=o("./packages/ckeditor5-widget/src/widgettypearound/widgettypearound.js"),n=o("./packages/ckeditor5-typing/src/delete.js"),a=o("./packages/ckeditor5-utils/src/env.js"),c=o("./packages/ckeditor5-utils/src/keyboard.js"),l=o("./packages/ckeditor5-utils/src/dom/rect.js");function d(e){const t=e.model;return(o,i)=>{const s=i.keyCode==c.f.arrowup,r=i.keyCode==c.f.arrowdown,n=i.shiftKey,a=t.document.selection;if(!s&&!r)return;const d=r;if(n&&function(e,t){return!e.isCollapsed&&e.isBackward==t}(a,d))return;const p=function(e,t,o){const i=e.model;if(o){const e=t.isCollapsed?t.focus:t.getLastPosition(),o=u(i,e,"forward");if(!o)return null;const s=i.createRange(e,o),r=h(i.schema,s,"backward");return r?i.createRange(e,r):null}{const e=t.isCollapsed?t.focus:t.getFirstPosition(),o=u(i,e,"backward");if(!o)return null;const s=i.createRange(o,e),r=h(i.schema,s,"forward");return r?i.createRange(r,e):null}}(e,a,d);if(p){if(p.isCollapsed){if(a.isCollapsed)return;if(n)return}(p.isCollapsed||function(e,t,o){const i=e.model,s=e.view.domConverter;if(o){const e=i.createSelection(t.start);i.modifySelection(e),e.focus.isAtEnd||t.start.isEqual(e.focus)||(t=i.createRange(e.focus,t.end))}const r=e.mapper.toViewRange(t),n=s.viewRangeToDom(r),a=l.a.getDomRangeRects(n);let c;for(const e of a)if(void 0!==c){if(Math.round(e.top)>=c)return!1;c=Math.max(c,Math.round(e.bottom))}else c=Math.round(e.bottom);return!0}(e,p,d))&&(t.change(e=>{const o=d?p.end:p.start;if(n){const i=t.createSelection(a.anchor);i.setFocus(o),e.setSelection(i)}else e.setSelection(o)}),o.stop(),i.preventDefault(),i.stopPropagation())}}}function u(e,t,o){const i=e.schema,s=e.createRangeIn(t.root),r="forward"==o?"elementStart":"elementEnd";for(const{previousPosition:e,item:n,type:a}of s.getWalker({startPosition:t,direction:o})){if(i.isLimit(n)&&!i.isInline(n))return e;if(a==r&&i.isBlock(n))return null}return null}function h(e,t,o){const i="backward"==o?t.end:t.start;if(e.checkChild(i,"$text"))return i;for(const{nextPosition:i}of t.getWalker({direction:o}))if(e.checkChild(i,"$text"))return i;return null}var p=o("./packages/ckeditor5-widget/src/utils.js");o("./packages/ckeditor5-widget/theme/widget.css");class g extends i.a{static get pluginName(){return"Widget"}static get requires(){return[r.a,n.a]}init(){const e=this.editor,t=e.editing.view,o=t.document;this._previouslySelected=new Set,this.editor.editing.downcastDispatcher.on("selection",(t,o,i)=>{const s=i.writer,r=o.selection;if(r.isCollapsed)return;const n=r.getSelectedElement();if(!n)return;const a=e.editing.mapper.toViewElement(n);Object(p.e)(a)&&i.consumable.consume(r,"selection")&&s.setSelection(s.createRangeOn(a),{fake:!0,label:Object(p.d)(a)})}),this.editor.editing.downcastDispatcher.on("selection",(e,t,o)=>{this._clearPreviouslySelectedWidgets(o.writer);const i=o.writer,s=i.document.selection;let r=null;for(const e of s.getRanges())for(const t of e){const e=t.item;Object(p.e)(e)&&!f(e,r)&&(i.addClass(p.b,e),this._previouslySelected.add(e),r=e)}},{priority:"low"}),t.addObserver(s.a),this.listenTo(o,"mousedown",(...e)=>this._onMousedown(...e)),this.listenTo(o,"arrowKey",(...e)=>{this._handleSelectionChangeOnArrowKeyPress(...e)},{context:[p.e,"$text"]}),this.listenTo(o,"arrowKey",(...e)=>{this._preventDefaultOnArrowKeyPress(...e)},{context:"$root"}),this.listenTo(o,"arrowKey",d(this.editor.editing),{context:"$text"}),this.listenTo(o,"delete",(e,t)=>{this._handleDelete("forward"==t.direction)&&(t.preventDefault(),e.stop())},{context:"$root"})}_onMousedown(e,t){const o=this.editor,i=o.editing.view,s=i.document;let r=t.target;if(function(e){for(;e;){if(e.is("editableElement")&&!e.is("rootElement"))return!0;if(Object(p.e)(e))return!1;e=e.parent}return!1}(r)){if((a.a.isSafari||a.a.isGecko)&&t.domEvent.detail>=3){const e=o.editing.mapper,i=r.is("attributeElement")?r.findAncestor(e=>!e.is("attributeElement")):r,s=e.toModelElement(i);t.preventDefault(),this.editor.model.change(e=>{e.setSelection(s,"in")})}return}if(!Object(p.e)(r)&&(r=r.findAncestor(p.e),!r))return;a.a.isAndroid&&t.preventDefault(),s.isFocused||i.focus();const n=o.editing.mapper.toModelElement(r);this._setSelectionOverElement(n)}_handleSelectionChangeOnArrowKeyPress(e,t){const o=t.keyCode,i=this.editor.model,s=i.schema,r=i.document.selection,n=r.getSelectedElement(),a=Object(c.c)(o,this.editor.locale.contentLanguageDirection),l="down"==a||"right"==a,d="up"==a||"down"==a;if(n&&s.isObject(n)){const o=l?r.getLastPosition():r.getFirstPosition(),n=s.getNearestSelectionRange(o,l?"forward":"backward");return void(n&&(i.change(e=>{e.setSelection(n)}),t.preventDefault(),e.stop()))}if(!r.isCollapsed&&!t.shiftKey){const o=r.getFirstPosition(),n=r.getLastPosition(),a=o.nodeAfter,c=n.nodeBefore;return void((a&&s.isObject(a)||c&&s.isObject(c))&&(i.change(e=>{e.setSelection(l?n:o)}),t.preventDefault(),e.stop()))}if(!r.isCollapsed)return;const u=this._getObjectElementNextToSelection(l);if(u&&s.isObject(u)){if(s.isInline(u)&&d)return;this._setSelectionOverElement(u),t.preventDefault(),e.stop()}}_preventDefaultOnArrowKeyPress(e,t){const o=this.editor.model,i=o.schema,s=o.document.selection.getSelectedElement();s&&i.isObject(s)&&(t.preventDefault(),e.stop())}_handleDelete(e){if(this.editor.isReadOnly)return;const t=this.editor.model.document.selection;if(!t.isCollapsed)return;const o=this._getObjectElementNextToSelection(e);return o?(this.editor.model.change(e=>{let i=t.anchor.parent;for(;i.isEmpty;){const t=i;i=t.parent,e.remove(t)}this._setSelectionOverElement(o)}),!0):void 0}_setSelectionOverElement(e){this.editor.model.change(t=>{t.setSelection(t.createRangeOn(e))})}_getObjectElementNextToSelection(e){const t=this.editor.model,o=t.schema,i=t.document.selection,s=t.createSelection(i);if(t.modifySelection(s,{direction:e?"forward":"backward"}),s.isEqual(i))return null;const r=e?s.focus.nodeBefore:s.focus.nodeAfter;return r&&o.isObject(r)?r:null}_clearPreviouslySelectedWidgets(e){for(const t of this._previouslySelected)e.removeClass(p.b,t);this._previouslySelected.clear()}}function f(e,t){return!!t&&Array.from(e.getAncestors()).includes(t)}},"./packages/ckeditor5-widget/src/widgettypearound/utils.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s})),o.d(t,"f",(function(){return r})),o.d(t,"b",(function(){return n})),o.d(t,"d",(function(){return a})),o.d(t,"c",(function(){return c})),o.d(t,"e",(function(){return l}));var i=o("./packages/ckeditor5-widget/src/utils.js");const s="widget-type-around";function r(e,t,o){return e&&Object(i.e)(e)&&!o.isInline(t)}function n(e){return e.closest(".ck-widget__type-around__button")}function a(e){return e.classList.contains("ck-widget__type-around__button_before")?"before":"after"}function c(e,t){const o=e.closest(".ck-widget");return t.mapDomToView(o)}function l(e){return e.getAttribute(s)}},"./packages/ckeditor5-widget/src/widgettypearound/widgettypearound.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return p}));var i=o("./packages/ckeditor5-core/src/plugin.js"),s=o("./packages/ckeditor5-ui/src/template.js"),r=o("./packages/ckeditor5-enter/src/enter.js"),n=o("./packages/ckeditor5-typing/src/delete.js"),a=o("./packages/ckeditor5-utils/src/keyboard.js"),c=o("./packages/ckeditor5-widget/src/widgettypearound/utils.js"),l=o("./packages/ckeditor5-typing/src/utils/injectunsafekeystrokeshandling.js"),d=o("./packages/ckeditor5-widget/src/utils.js");o("./packages/ckeditor5-widget/theme/widgettypearound.css");const u=["before","after"],h=(new DOMParser).parseFromString('<svg viewBox="0 0 10 8" xmlns="http://www.w3.org/2000/svg"><path d="M9.055.263v3.972h-6.77M1 4.216l2-2.038m-2 2 2 2.038"/></svg>',"image/svg+xml").firstChild;class p extends i.a{static get pluginName(){return"WidgetTypeAround"}static get requires(){return[r.a,n.a]}constructor(e){super(e),this._currentFakeCaretModelElement=null}init(){const e=this.editor,t=e.editing.view;this.on("change:isEnabled",(o,i,s)=>{t.change(e=>{for(const o of t.document.roots)s?e.removeClass("ck-widget__type-around_disabled",o):e.addClass("ck-widget__type-around_disabled",o)}),s||e.model.change(e=>{e.removeSelectionAttribute(c.a)})}),this._enableTypeAroundUIInjection(),this._enableInsertingParagraphsOnButtonClick(),this._enableInsertingParagraphsOnEnterKeypress(),this._enableInsertingParagraphsOnTypingKeystroke(),this._enableTypeAroundFakeCaretActivationUsingKeyboardArrows(),this._enableDeleteIntegration(),this._enableInsertContentIntegration(),this._enableDeleteContentIntegration()}destroy(){this._currentFakeCaretModelElement=null}_insertParagraph(e,t){const o=this.editor,i=o.editing.view;o.execute("insertParagraph",{position:o.model.createPositionAt(e,t)}),i.focus(),i.scrollToTheSelection()}_listenToIfEnabled(e,t,o,i){this.listenTo(e,t,(...e)=>{this.isEnabled&&o(...e)},i)}_insertParagraphAccordingToFakeCaretPosition(){const e=this.editor.model.document.selection,t=Object(c.e)(e);if(!t)return!1;const o=e.getSelectedElement();return this._insertParagraph(o,t),!0}_enableTypeAroundUIInjection(){const e=this.editor,t=e.model.schema,o=e.locale.t,i={before:o("Insert paragraph before block"),after:o("Insert paragraph after block")};e.editing.downcastDispatcher.on("insert",(e,o,r)=>{const n=r.mapper.toViewElement(o.item);Object(c.f)(n,o.item,t)&&function(e,t,o){const i=e.createUIElement("div",{class:"ck ck-reset_all ck-widget__type-around"},(function(e){const o=this.toDomElement(e);return function(e,t){for(const o of u){const i=new s.a({tag:"div",attributes:{class:["ck","ck-widget__type-around__button","ck-widget__type-around__button_"+o],title:t[o]},children:[e.ownerDocument.importNode(h,!0)]});e.appendChild(i.render())}}(o,t),function(e){const t=new s.a({tag:"div",attributes:{class:["ck","ck-widget__type-around__fake-caret"]}});e.appendChild(t.render())}(o),o}));e.insert(e.createPositionAt(o,"end"),i)}(r.writer,i,n)},{priority:"low"})}_enableTypeAroundFakeCaretActivationUsingKeyboardArrows(){const e=this.editor,t=e.model,o=t.document.selection,i=t.schema,s=e.editing.view;function r(e){return"ck-widget_type-around_show-fake-caret_"+e}this._listenToIfEnabled(s.document,"arrowKey",(e,t)=>{this._handleArrowKeyPress(e,t)},{context:[d.e,"$text"],priority:"high"}),this._listenToIfEnabled(o,"change:range",(t,o)=>{o.directChange&&e.model.change(e=>{e.removeSelectionAttribute(c.a)})}),this._listenToIfEnabled(t.document,"change:data",()=>{const t=o.getSelectedElement();if(t){const o=e.editing.mapper.toViewElement(t);if(Object(c.f)(o,t,i))return}e.model.change(e=>{e.removeSelectionAttribute(c.a)})}),this._listenToIfEnabled(e.editing.downcastDispatcher,"selection",(e,t,o)=>{const s=o.writer;if(this._currentFakeCaretModelElement){const e=o.mapper.toViewElement(this._currentFakeCaretModelElement);e&&(s.removeClass(u.map(r),e),this._currentFakeCaretModelElement=null)}const n=t.selection.getSelectedElement();if(!n)return;const a=o.mapper.toViewElement(n);if(!Object(c.f)(a,n,i))return;const l=Object(c.e)(t.selection);l&&(s.addClass(r(l),a),this._currentFakeCaretModelElement=n)}),this._listenToIfEnabled(e.ui.focusTracker,"change:isFocused",(t,o,i)=>{i||e.model.change(e=>{e.removeSelectionAttribute(c.a)})})}_handleArrowKeyPress(e,t){const o=this.editor,i=o.model,s=i.document.selection,r=i.schema,n=o.editing.view,l=t.keyCode,d=Object(a.e)(l,o.locale.contentLanguageDirection),u=n.document.selection.getSelectedElement(),h=o.editing.mapper.toModelElement(u);let p;Object(c.f)(u,h,r)?p=this._handleArrowKeyPressOnSelectedWidget(d):s.isCollapsed?p=this._handleArrowKeyPressWhenSelectionNextToAWidget(d):t.shiftKey||(p=this._handleArrowKeyPressWhenNonCollapsedSelection(d)),p&&(t.preventDefault(),e.stop())}_handleArrowKeyPressOnSelectedWidget(e){const t=this.editor.model,o=t.document.selection,i=Object(c.e)(o);return t.change(t=>{if(!i)return t.setSelectionAttribute(c.a,e?"after":"before"),!0;if(!(i===(e?"after":"before")))return t.removeSelectionAttribute(c.a),!0;return!1})}_handleArrowKeyPressWhenSelectionNextToAWidget(e){const t=this.editor,o=t.model,i=o.schema,s=t.plugins.get("Widget"),r=s._getObjectElementNextToSelection(e),n=t.editing.mapper.toViewElement(r);return!!Object(c.f)(n,r,i)&&(o.change(t=>{s._setSelectionOverElement(r),t.setSelectionAttribute(c.a,e?"before":"after")}),!0)}_handleArrowKeyPressWhenNonCollapsedSelection(e){const t=this.editor,o=t.model,i=o.schema,s=t.editing.mapper,r=o.document.selection,n=e?r.getLastPosition().nodeBefore:r.getFirstPosition().nodeAfter,a=s.toViewElement(n);return!!Object(c.f)(a,n,i)&&(o.change(t=>{t.setSelection(n,"on"),t.setSelectionAttribute(c.a,e?"after":"before")}),!0)}_enableInsertingParagraphsOnButtonClick(){const e=this.editor,t=e.editing.view;this._listenToIfEnabled(t.document,"mousedown",(o,i)=>{const s=Object(c.b)(i.domTarget);if(!s)return;const r=Object(c.d)(s),n=Object(c.c)(s,t.domConverter),a=e.editing.mapper.toModelElement(n);this._insertParagraph(a,r),i.preventDefault(),o.stop()})}_enableInsertingParagraphsOnEnterKeypress(){const e=this.editor,t=e.model.document.selection,o=e.editing.view;this._listenToIfEnabled(o.document,"enter",(o,i)=>{if("atTarget"!=o.eventPhase)return;const s=t.getSelectedElement(),r=e.editing.mapper.toViewElement(s),n=e.model.schema;let a;this._insertParagraphAccordingToFakeCaretPosition()?a=!0:Object(c.f)(r,s,n)&&(this._insertParagraph(s,i.isSoft?"before":"after"),a=!0),a&&(i.preventDefault(),o.stop())},{context:d.e})}_enableInsertingParagraphsOnTypingKeystroke(){const e=this.editor.editing.view,t=[a.f.enter,a.f.delete,a.f.backspace];this._listenToIfEnabled(e.document,"keydown",(e,o)=>{t.includes(o.keyCode)||Object(l.b)(o)||this._insertParagraphAccordingToFakeCaretPosition()},{priority:"high"})}_enableDeleteIntegration(){const e=this.editor,t=e.editing.view,o=e.model,i=o.schema;this._listenToIfEnabled(t.document,"delete",(t,s)=>{if("atTarget"!=t.eventPhase)return;const r=Object(c.e)(o.document.selection);if(!r)return;const n=s.direction,a=o.document.selection.getSelectedElement(),l="forward"==n;if("before"===r===l)e.execute("delete",{selection:o.createSelection(a,"on")});else{const t=i.getNearestSelectionRange(o.createPositionAt(a,r),n);if(t)if(t.isCollapsed){const s=o.createSelection(t.start);if(o.modifySelection(s,{direction:n}),s.focus.isEqual(t.start)){const e=function(e,t){let o=t;for(const i of t.getAncestors({parentFirst:!0})){if(i.childCount>1||e.isLimit(i))break;o=i}return o}(i,t.start.parent);o.deleteContent(o.createSelection(e,"on"),{doNotAutoparagraph:!0})}else o.change(o=>{o.setSelection(t),e.execute(l?"deleteForward":"delete")})}else o.change(o=>{o.setSelection(t),e.execute(l?"deleteForward":"delete")})}s.preventDefault(),t.stop()},{context:d.e})}_enableInsertContentIntegration(){const e=this.editor,t=this.editor.model,o=t.document.selection;this._listenToIfEnabled(e.model,"insertContent",(e,[i,s])=>{if(s&&!s.is("documentSelection"))return;const r=Object(c.e)(o);return r?(e.stop(),t.change(e=>{const s=o.getSelectedElement(),n=t.createPositionAt(s,r),a=e.createSelection(n),c=t.insertContent(i,a);return e.setSelection(a),c})):void 0},{priority:"high"})}_enableDeleteContentIntegration(){const e=this.editor,t=this.editor.model.document.selection;this._listenToIfEnabled(e.model,"deleteContent",(e,[o])=>{if(o&&!o.is("documentSelection"))return;Object(c.e)(t)&&e.stop()},{priority:"high"})}}},"./packages/ckeditor5-widget/theme/widget.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-widget/theme/widget.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-widget/theme/widgetresize.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-widget/theme/widgetresize.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./packages/ckeditor5-widget/theme/widgettypearound.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),s=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-widget/theme/widgettypearound.css");"string"==typeof(s=s.__esModule?s.default:s)&&(s=[[e.i,s,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(s,r);e.exports=s.locals||{}},"./src/clipboard.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Clipboard",(function(){return j})),o.d(t,"ClipboardPipeline",(function(){return l})),o.d(t,"DragDrop",(function(){return k})),o.d(t,"PastePlainText",(function(){return y}));var i=o("./packages/ckeditor5-core/src/plugin.js"),s=o("./packages/ckeditor5-utils/src/eventinfo.js"),r=o("./packages/ckeditor5-engine/src/view/observer/domeventobserver.js");class n{constructor(e){this.files=function(e){const t=Array.from(e.files||[]),o=Array.from(e.items||[]);if(t.length)return t;return o.filter(e=>"file"===e.kind).map(e=>e.getAsFile())}(e),this._native=e}get types(){return this._native.types}getData(e){return this._native.getData(e)}setData(e,t){this._native.setData(e,t)}set effectAllowed(e){this._native.effectAllowed=e}get effectAllowed(){return this._native.effectAllowed}set dropEffect(e){this._native.dropEffect=e}get dropEffect(){return this._native.dropEffect}get isCanceled(){return"none"==this._native.dropEffect||!!this._native.mozUserCancelled}}class a extends r.a{constructor(e){super(e);const t=this.document;function o(e){return(o,i)=>{i.preventDefault();const r=i.dropRange?[i.dropRange]:null,n=new s.a(t,e);t.fire(n,{dataTransfer:i.dataTransfer,method:o.name,targetRanges:r,target:i.target}),n.stop.called&&i.stopPropagation()}}this.domEventType=["paste","copy","cut","drop","dragover","dragstart","dragend","dragenter","dragleave"],this.listenTo(t,"paste",o("clipboardInput"),{priority:"low"}),this.listenTo(t,"drop",o("clipboardInput"),{priority:"low"}),this.listenTo(t,"dragover",o("dragging"),{priority:"low"})}onDomEvent(e){const t={dataTransfer:new n(e.clipboardData?e.clipboardData:e.dataTransfer)};"drop"!=e.type&&"dragover"!=e.type||(t.dropRange=function(e,t){const o=t.target.ownerDocument,i=t.clientX,s=t.clientY;let r;o.caretRangeFromPoint&&o.caretRangeFromPoint(i,s)?r=o.caretRangeFromPoint(i,s):t.rangeParent&&(r=o.createRange(),r.setStart(t.rangeParent,t.rangeOffset),r.collapse(!0));if(r)return e.domConverter.domRangeToView(r);return null}(this.view,e)),this.fire(e.type,e,t)}}const c=["figcaption","li"];class l extends i.a{static get pluginName(){return"ClipboardPipeline"}init(){this.editor.editing.view.addObserver(a),this._setupPasteDrop(),this._setupCopyCut()}_setupPasteDrop(){const e=this.editor,t=e.model,o=e.editing.view,i=o.document;this.listenTo(i,"clipboardInput",t=>{e.isReadOnly&&t.stop()},{priority:"highest"}),this.listenTo(i,"clipboardInput",(e,t)=>{const i=t.dataTransfer;let r=t.content||"";var n;r||(i.getData("text/html")?r=function(e){return e.replace(/<span(?: class="Apple-converted-space"|)>(\s+)<\/span>/g,(e,t)=>1==t.length?" ":t).replace(/<!--[\s\S]*?-->/g,"")}(i.getData("text/html")):i.getData("text/plain")&&(((n=(n=i.getData("text/plain")).replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r?\n\r?\n/g,"</p><p>").replace(/\r?\n/g,"<br>").replace(/^\s/,"&nbsp;").replace(/\s$/,"&nbsp;").replace(/\s\s/g," &nbsp;")).includes("</p><p>")||n.includes("<br>"))&&(n=`<p>${n}</p>`),r=n),r=this.editor.data.htmlProcessor.toView(r));const a=new s.a(this,"inputTransformation");this.fire(a,{content:r,dataTransfer:i,targetRanges:t.targetRanges,method:t.method}),a.stop.called&&e.stop(),o.scrollToTheSelection()},{priority:"low"}),this.listenTo(this,"inputTransformation",(e,o)=>{if(o.content.isEmpty)return;const i=this.editor.data.toModel(o.content,"$clipboardHolder");0!=i.childCount&&(e.stop(),t.change(()=>{this.fire("contentInsertion",{content:i,method:o.method,dataTransfer:o.dataTransfer,targetRanges:o.targetRanges})}))},{priority:"low"}),this.listenTo(this,"contentInsertion",(e,o)=>{o.resultRange=t.insertContent(o.content)},{priority:"low"})}_setupCopyCut(){const e=this.editor,t=e.model.document,o=e.editing.view.document;function i(i,s){const r=s.dataTransfer;s.preventDefault();const n=e.data.toView(e.model.getSelectedContent(t.selection));o.fire("clipboardOutput",{dataTransfer:r,content:n,method:i.name})}this.listenTo(o,"copy",i,{priority:"low"}),this.listenTo(o,"cut",(t,o)=>{e.isReadOnly?o.preventDefault():i(t,o)},{priority:"low"}),this.listenTo(o,"clipboardOutput",(o,i)=>{i.content.isEmpty||(i.dataTransfer.setData("text/html",this.editor.data.htmlProcessor.toData(i.content)),i.dataTransfer.setData("text/plain",function e(t){let o="";if(t.is("$text")||t.is("$textProxy"))o=t.data;else if(t.is("element","img")&&t.hasAttribute("alt"))o=t.getAttribute("alt");else if(t.is("element","br"))o="\n";else{let i=null;for(const s of t.getChildren()){const t=e(s);i&&(i.is("containerElement")||s.is("containerElement"))&&(c.includes(i.name)||c.includes(s.name)?o+="\n":o+="\n\n"),o+=t,i=s}}return o}(i.content))),"cut"==i.method&&e.model.deleteContent(t.selection)},{priority:"low"})}}var d=o("./packages/ckeditor5-engine/src/model/liverange.js"),u=o("./packages/ckeditor5-engine/src/view/observer/mouseobserver.js"),h=o("./packages/ckeditor5-widget/src/widget.js"),p=o("./packages/ckeditor5-utils/src/uid.js"),g=o("./packages/ckeditor5-utils/src/env.js"),f=o("./packages/ckeditor5-widget/src/utils.js"),m=o("./node_modules/lodash-es/throttle.js");o("./packages/ckeditor5-clipboard/theme/clipboard.css");class k extends i.a{static get pluginName(){return"DragDrop"}static get requires(){return[l,h.a]}init(){const e=this.editor,t=e.editing.view;this._draggedRange=null,this._draggingUid="",this._draggableElement=null,this._updateDropMarkerThrottled=Object(m.a)(e=>this._updateDropMarker(e),40),this._removeDropMarkerDelayed=w(()=>this._removeDropMarker(),40),this._clearDraggableAttributesDelayed=w(()=>this._clearDraggableAttributes(),40),t.addObserver(a),t.addObserver(u.a),this._setupDragging(),this._setupContentInsertionIntegration(),this._setupClipboardInputIntegration(),this._setupDropMarker(),this._setupDraggableAttributeHandling(),this.listenTo(e,"change:isReadOnly",(e,t,o)=>{o?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")}),this.on("change:isEnabled",(e,t,o)=>{o||this._finalizeDragging(!1)}),g.a.isAndroid&&this.forceDisabled("noAndroidSupport")}destroy(){return this._draggedRange&&(this._draggedRange.detach(),this._draggedRange=null),this._updateDropMarkerThrottled.cancel(),this._removeDropMarkerDelayed.cancel(),this._clearDraggableAttributesDelayed.cancel(),super.destroy()}_setupDragging(){const e=this.editor,t=e.model,o=t.document,i=e.editing.view,s=i.document;this.listenTo(s,"dragstart",(i,r)=>{const n=o.selection;if(r.target&&r.target.is("editableElement"))return void r.preventDefault();const a=r.target?v(r.target):null;if(a){const o=e.editing.mapper.toModelElement(a);this._draggedRange=d.a.fromRange(t.createRangeOn(o)),e.plugins.has("WidgetToolbarRepository")&&e.plugins.get("WidgetToolbarRepository").forceDisabled("dragDrop")}else if(!s.selection.isCollapsed){const e=s.selection.getSelectedElement();e&&Object(f.e)(e)||(this._draggedRange=d.a.fromRange(n.getFirstRange()))}if(!this._draggedRange)return void r.preventDefault();this._draggingUid=Object(p.a)(),r.dataTransfer.effectAllowed=this.isEnabled?"copyMove":"copy",r.dataTransfer.setData("application/ckeditor5-dragging-uid",this._draggingUid);const c=t.createSelection(this._draggedRange.toRange()),l=e.data.toView(t.getSelectedContent(c));s.fire("clipboardOutput",{dataTransfer:r.dataTransfer,content:l,method:i.name}),this.isEnabled||(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="")},{priority:"low"}),this.listenTo(s,"dragend",(e,t)=>{this._finalizeDragging(!t.dataTransfer.isCanceled&&"move"==t.dataTransfer.dropEffect)},{priority:"low"}),this.listenTo(s,"dragenter",()=>{this.isEnabled&&i.focus()}),this.listenTo(s,"dragleave",()=>{this._removeDropMarkerDelayed()}),this.listenTo(s,"dragging",(t,o)=>{if(!this.isEnabled)return void(o.dataTransfer.dropEffect="none");this._removeDropMarkerDelayed.cancel();const i=b(e,o.targetRanges,o.target);this._draggedRange||(o.dataTransfer.dropEffect="copy"),g.a.isGecko||("copy"==o.dataTransfer.effectAllowed?o.dataTransfer.dropEffect="copy":["all","copyMove"].includes(o.dataTransfer.effectAllowed)&&(o.dataTransfer.dropEffect="move")),i&&this._updateDropMarkerThrottled(i)},{priority:"low"})}_setupClipboardInputIntegration(){const e=this.editor,t=e.editing.view.document;this.listenTo(t,"clipboardInput",(t,o)=>{if("drop"!=o.method)return;const i=b(e,o.targetRanges,o.target);if(this._removeDropMarker(),!i)return this._finalizeDragging(!1),void t.stop();this._draggedRange&&this._draggingUid!=o.dataTransfer.getData("application/ckeditor5-dragging-uid")&&(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="");if("move"==_(o.dataTransfer)&&this._draggedRange&&this._draggedRange.containsRange(i,!0))return this._finalizeDragging(!1),void t.stop();o.targetRanges=[e.editing.mapper.toViewRange(i)]},{priority:"high"})}_setupContentInsertionIntegration(){const e=this.editor.plugins.get(l);e.on("contentInsertion",(e,t)=>{if(!this.isEnabled||"drop"!==t.method)return;const o=t.targetRanges.map(e=>this.editor.editing.mapper.toModelRange(e));this.editor.model.change(e=>e.setSelection(o))},{priority:"high"}),e.on("contentInsertion",(e,t)=>{if(!this.isEnabled||"drop"!==t.method)return;const o="move"==_(t.dataTransfer),i=!t.resultRange||!t.resultRange.isCollapsed;this._finalizeDragging(i&&o)},{priority:"lowest"})}_setupDraggableAttributeHandling(){const e=this.editor,t=e.editing.view,o=t.document;this.listenTo(o,"mousedown",(i,s)=>{if(g.a.isAndroid||!s)return;this._clearDraggableAttributesDelayed.cancel();let r=v(s.target);if(g.a.isBlink&&!e.isReadOnly&&!r&&!o.selection.isCollapsed){const e=o.selection.getSelectedElement();e&&Object(f.e)(e)||(r=o.selection.editableElement)}r&&(t.change(e=>{e.setAttribute("draggable","true",r)}),this._draggableElement=e.editing.mapper.toModelElement(r))}),this.listenTo(o,"mouseup",()=>{g.a.isAndroid||this._clearDraggableAttributesDelayed()})}_clearDraggableAttributes(){const e=this.editor.editing;e.view.change(t=>{this._draggableElement&&"$graveyard"!=this._draggableElement.root.rootName&&t.removeAttribute("draggable",e.mapper.toViewElement(this._draggableElement)),this._draggableElement=null})}_setupDropMarker(){const e=this.editor;e.conversion.for("editingDowncast").markerToHighlight({model:"drop-target",view:{classes:["ck-clipboard-drop-target-range"]}}),e.conversion.for("editingDowncast").markerToElement({model:"drop-target",view:(t,{writer:o})=>{if(e.model.schema.checkChild(t.markerRange.start,"$text"))return o.createUIElement("span",{class:"ck ck-clipboard-drop-target-position"},(function(e){const t=this.toDomElement(e);return t.innerHTML="&NoBreak;<span></span>&NoBreak;",t}))}})}_updateDropMarker(e){const t=this.editor,o=t.model.markers;t.model.change(t=>{o.has("drop-target")?o.get("drop-target").getRange().isEqual(e)||t.updateMarker("drop-target",{range:e}):t.addMarker("drop-target",{range:e,usingOperation:!1,affectsData:!1})})}_removeDropMarker(){const e=this.editor.model;this._removeDropMarkerDelayed.cancel(),this._updateDropMarkerThrottled.cancel(),e.markers.has("drop-target")&&e.change(e=>{e.removeMarker("drop-target")})}_finalizeDragging(e){const t=this.editor,o=t.model;this._removeDropMarker(),this._clearDraggableAttributes(),t.plugins.has("WidgetToolbarRepository")&&t.plugins.get("WidgetToolbarRepository").clearForceDisabled("dragDrop"),this._draggingUid="",this._draggedRange&&(e&&this.isEnabled&&o.deleteContent(o.createSelection(this._draggedRange),{doNotAutoparagraph:!0}),this._draggedRange.detach(),this._draggedRange=null)}}function b(e,t,o){const i=e.model,s=e.editing.mapper;let r=null;const n=t?t[0].start:null;if(o.is("uiElement")&&(o=o.parent),r=function(e,t){const o=e.model,i=e.editing.mapper;if(Object(f.e)(t))return o.createRangeOn(i.toModelElement(t));if(!t.is("editableElement")){const e=t.findAncestor(e=>Object(f.e)(e)||e.is("editableElement"));if(Object(f.e)(e))return o.createRangeOn(i.toModelElement(e))}return null}(e,o),r)return r;const a=function(e,t){const o=e.editing.mapper,i=e.editing.view,s=o.toModelElement(t);if(s)return s;const r=i.createPositionBefore(t),n=o.findMappedViewAncestor(r);return o.toModelElement(n)}(e,o),c=n?s.toModelPosition(n):null;return c?(r=function(e,t,o){const i=e.model;if(!i.schema.checkChild(o,"$block"))return null;const s=i.createPositionAt(o,0),r=t.path.slice(0,s.path.length),n=i.createPositionFromPath(t.root,r).nodeAfter;if(n&&i.schema.isObject(n))return i.createRangeOn(n);return null}(e,c,a),r||(r=i.schema.getNearestSelectionRange(c,g.a.isGecko?"forward":"backward"),r||function(e,t){const o=e.model;for(;t;){if(o.schema.isObject(t))return o.createRangeOn(t);t=t.parent}}(e,c.parent))):function(e,t){const o=e.model,i=o.schema,s=o.createPositionAt(t,0);return i.getNearestSelectionRange(s,"forward")}(e,a)}function _(e){return g.a.isGecko?e.dropEffect:["all","copyMove"].includes(e.effectAllowed)?"move":"copy"}function w(e,t){let o;function i(...s){i.cancel(),o=setTimeout(()=>e(...s),t)}return i.cancel=()=>{clearTimeout(o)},i}function v(e){if(e.is("editableElement"))return null;if(e.hasClass("ck-widget__selection-handle"))return e.findAncestor(f.e);if(Object(f.e)(e))return e;const t=e.findAncestor(e=>Object(f.e)(e)||e.is("editableElement"));return Object(f.e)(t)?t:null}class y extends i.a{static get pluginName(){return"PastePlainText"}static get requires(){return[l]}init(){const e=this.editor,t=e.model,o=e.editing.view,i=o.document,s=t.document.selection;let r=!1;o.addObserver(a),this.listenTo(i,"keydown",(e,t)=>{r=t.shiftKey}),e.plugins.get(l).on("contentInsertion",(e,o)=>{(r||function(e,t){if(e.childCount>1)return!1;const o=e.getChild(0);if(t.isObject(o))return!1;return 0==[...o.getAttributeKeys()].length}(o.content,t.schema))&&t.change(e=>{const i=Array.from(s.getAttributes()).filter(([e])=>t.schema.getAttributeProperties(e).isFormatting);s.isCollapsed||t.deleteContent(s,{doNotAutoparagraph:!0}),i.push(...s.getAttributes());const r=e.createRangeIn(o.content);for(const t of r.getItems())t.is("$textProxy")&&e.setAttributes(i,t)})})}}class j extends i.a{static get pluginName(){return"Clipboard"}static get requires(){return[l,k,y]}}},"./src/core.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Plugin",(function(){return i.a})),o.d(t,"Command",(function(){return s.a})),o.d(t,"MultiCommand",(function(){return r})),o.d(t,"Context",(function(){return b})),o.d(t,"ContextPlugin",(function(){return _.a})),o.d(t,"Editor",(function(){return C})),o.d(t,"EditorUI",(function(){return M})),o.d(t,"attachToForm",(function(){return I})),o.d(t,"DataApiMixin",(function(){return z})),o.d(t,"ElementApiMixin",(function(){return D})),o.d(t,"secureSourceElement",(function(){return B})),o.d(t,"PendingActions",(function(){return F.a})),o.d(t,"icons",(function(){return H}));var i=o("./packages/ckeditor5-core/src/plugin.js"),s=o("./packages/ckeditor5-core/src/command.js");class r extends s.a{constructor(e){super(e),this._childCommands=[]}refresh(){}execute(...e){const t=this._getFirstEnabledCommand();return null!=t&&t.execute(e)}registerChildCommand(e){this._childCommands.push(e),e.on("change:isEnabled",()=>this._checkEnabled()),this._checkEnabled()}_checkEnabled(){this.isEnabled=!!this._getFirstEnabledCommand()}_getFirstEnabledCommand(){return this._childCommands.find(e=>e.isEnabled)}}var n=o("./node_modules/lodash-es/isPlainObject.js"),a=o("./node_modules/lodash-es/cloneDeepWith.js"),c=o("./node_modules/lodash-es/isElement.js");class l{constructor(e,t){this._config={},t&&this.define(d(t)),e&&this._setObjectToTarget(this._config,e)}set(e,t){this._setToTarget(this._config,e,t)}define(e,t){this._setToTarget(this._config,e,t,!0)}get(e){return this._getFromSource(this._config,e)}*names(){for(const e of Object.keys(this._config))yield e}_setToTarget(e,t,o,i=!1){if(Object(n.a)(t))return void this._setObjectToTarget(e,t,i);const s=t.split(".");t=s.pop();for(const t of s)Object(n.a)(e[t])||(e[t]={}),e=e[t];if(Object(n.a)(o))return Object(n.a)(e[t])||(e[t]={}),e=e[t],void this._setObjectToTarget(e,o,i);i&&void 0!==e[t]||(e[t]=o)}_getFromSource(e,t){const o=t.split(".");t=o.pop();for(const t of o){if(!Object(n.a)(e[t])){e=null;break}e=e[t]}return e?d(e[t]):void 0}_setObjectToTarget(e,t,o){Object.keys(t).forEach(i=>{this._setToTarget(e,i,t[i],o)})}}function d(e){return Object(a.a)(e,u)}function u(e){return Object(c.a)(e)?e:void 0}var h=o("./packages/ckeditor5-utils/src/collection.js"),p=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),g=o("./packages/ckeditor5-utils/src/emittermixin.js"),f=o("./packages/ckeditor5-utils/src/mix.js");class m{constructor(e,t=[],o=[]){this._context=e,this._plugins=new Map,this._availablePlugins=new Map;for(const e of t)e.pluginName&&this._availablePlugins.set(e.pluginName,e);this._contextPlugins=new Map;for(const[e,t]of o)this._contextPlugins.set(e,t),this._contextPlugins.set(t,e),e.pluginName&&this._availablePlugins.set(e.pluginName,e)}*[Symbol.iterator](){for(const e of this._plugins)"function"==typeof e[0]&&(yield e)}get(e){const t=this._plugins.get(e);if(!t){let t=e;throw"function"==typeof e&&(t=e.pluginName||e.name),new p.a("plugincollection-plugin-not-loaded",this._context,{plugin:t})}return t}has(e){return this._plugins.has(e)}init(e,t=[],o=[]){const i=this,s=this._context;!function e(t,o=new Set){t.forEach(t=>{a(t)&&(o.has(t)||(o.add(t),t.pluginName&&!i._availablePlugins.has(t.pluginName)&&i._availablePlugins.set(t.pluginName,t),t.requires&&e(t.requires,o)))})}(e),u(e);const r=[...function e(t,o=new Set){return t.map(e=>a(e)?e:i._availablePlugins.get(e)).reduce((t,i)=>o.has(i)?t:(o.add(i),i.requires&&(u(i.requires,i),e(i.requires,o).forEach(e=>t.add(e))),t.add(i)),new Set)}(e.filter(e=>!l(e,t)))];!function(e,t){for(const o of t){if("function"!=typeof o)throw new p.a("plugincollection-replace-plugin-invalid-type",null,{pluginItem:o});const t=o.pluginName;if(!t)throw new p.a("plugincollection-replace-plugin-missing-name",null,{pluginItem:o});if(o.requires&&o.requires.length)throw new p.a("plugincollection-plugin-for-replacing-cannot-have-dependencies",null,{pluginName:t});const s=i._availablePlugins.get(t);if(!s)throw new p.a("plugincollection-plugin-for-replacing-not-exist",null,{pluginName:t});const r=e.indexOf(s);if(-1===r){if(i._contextPlugins.has(s))return;throw new p.a("plugincollection-plugin-for-replacing-not-loaded",null,{pluginName:t})}if(s.requires&&s.requires.length)throw new p.a("plugincollection-replaced-plugin-cannot-have-dependencies",null,{pluginName:t});e.splice(r,1,o),i._availablePlugins.set(t,o)}}(r,o);const n=function(e){return e.map(e=>{const t=i._contextPlugins.get(e)||new e(s);return i._add(e,t),t})}(r);return h(n,"init").then(()=>h(n,"afterInit")).then(()=>n);function a(e){return"function"==typeof e}function c(e){return a(e)&&e.isContextPlugin}function l(e,t){return t.some(t=>t===e||(d(e)===t||d(t)===e))}function d(e){return a(e)?e.pluginName||e.name:e}function u(e,o=null){e.map(e=>a(e)?e:i._availablePlugins.get(e)||e).forEach(e=>{!function(e,t){if(a(e))return;if(t)throw new p.a("plugincollection-soft-required",s,{missingPlugin:e,requiredBy:d(t)});throw new p.a("plugincollection-plugin-not-found",s,{plugin:e})}(e,o),function(e,t){if(!c(t))return;if(c(e))return;throw new p.a("plugincollection-context-required",s,{plugin:d(e),requiredBy:d(t)})}(e,o),function(e,o){if(!o)return;if(!l(e,t))return;throw new p.a("plugincollection-required",s,{plugin:d(e),requiredBy:d(o)})}(e,o)})}function h(e,t){return e.reduce((e,o)=>o[t]?i._contextPlugins.has(o)?e:e.then(o[t].bind(o)):e,Promise.resolve())}}destroy(){const e=[];for(const[,t]of this)"function"!=typeof t.destroy||this._contextPlugins.has(t)||e.push(t.destroy());return Promise.all(e)}_add(e,t){this._plugins.set(e,t);const o=e.pluginName;if(o){if(this._plugins.has(o))throw new p.a("plugincollection-plugin-name-conflict",null,{pluginName:o,plugin1:this._plugins.get(o).constructor,plugin2:e});this._plugins.set(o,t)}}}Object(f.a)(m,g.c);var k=o("./packages/ckeditor5-utils/src/locale.js");class b{constructor(e){this.config=new l(e,this.constructor.defaultConfig);const t=this.constructor.builtinPlugins;this.config.define("plugins",t),this.plugins=new m(this,t);const o=this.config.get("language")||{};this.locale=new k.a({uiLanguage:"string"==typeof o?o:o.ui,contentLanguage:this.config.get("language.content")}),this.t=this.locale.t,this.editors=new h.a,this._contextOwner=null}initPlugins(){const e=this.config.get("plugins")||[],t=this.config.get("substitutePlugins")||[];for(const o of e.concat(t)){if("function"!=typeof o)throw new p.a("context-initplugins-constructor-only",null,{Plugin:o});if(!0!==o.isContextPlugin)throw new p.a("context-initplugins-invalid-plugin",null,{Plugin:o})}return this.plugins.init(e,[],t)}destroy(){return Promise.all(Array.from(this.editors,e=>e.destroy())).then(()=>this.plugins.destroy())}_addEditor(e,t){if(this._contextOwner)throw new p.a("context-addeditor-private-context");this.editors.add(e),t&&(this._contextOwner=e)}_removeEditor(e){return this.editors.has(e)&&this.editors.remove(e),this._contextOwner===e?this.destroy():Promise.resolve()}_getEditorConfig(){const e={};for(const t of this.config.names())["plugins","removePlugins","extraPlugins"].includes(t)||(e[t]=this.config.get(t));return e}static create(e){return new Promise(t=>{const o=new this(e);t(o.initPlugins().then(()=>o))})}}var _=o("./packages/ckeditor5-core/src/contextplugin.js"),w=o("./packages/ckeditor5-engine/src/controller/editingcontroller.js");class v{constructor(){this._commands=new Map}add(e,t){this._commands.set(e,t)}get(e){return this._commands.get(e)}execute(e,...t){const o=this.get(e);if(!o)throw new p.a("commandcollection-command-not-found",this,{commandName:e});return o.execute(...t)}*names(){yield*this._commands.keys()}*commands(){yield*this._commands.values()}[Symbol.iterator](){return this._commands[Symbol.iterator]()}destroy(){for(const e of this.commands())e.destroy()}}var y=o("./packages/ckeditor5-engine/src/controller/datacontroller.js"),j=o("./packages/ckeditor5-engine/src/conversion/conversion.js"),x=o("./packages/ckeditor5-engine/src/model/model.js"),P=o("./packages/ckeditor5-utils/src/keystrokehandler.js");class O extends P.a{constructor(e){super(),this.editor=e}set(e,t,o={}){if("string"==typeof t){const e=t;t=(t,o)=>{this.editor.execute(e),o()}}super.set(e,t,o)}}var A=o("./packages/ckeditor5-utils/src/observablemixin.js"),T=o("./packages/ckeditor5-engine/src/view/stylesmap.js");class C{constructor(e={}){this._context=e.context||new b({language:e.language}),this._context._addEditor(this,!e.context);const t=Array.from(this.constructor.builtinPlugins||[]);this.config=new l(e,this.constructor.defaultConfig),this.config.define("plugins",t),this.config.define(this._context._getEditorConfig()),this.plugins=new m(this,t,this._context.plugins),this.locale=this._context.locale,this.t=this.locale.t,this.commands=new v,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 x.a;const o=new T.a;this.data=new y.a(this.model,o),this.editing=new w.a(this.model,o),this.editing.view.document.bind("isReadOnly").to(this),this.conversion=new j.a([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 O(this),this.keystrokes.listenTo(this.editing.view.document)}initPlugins(){const e=this.config,t=e.get("plugins"),o=e.get("removePlugins")||[],i=e.get("extraPlugins")||[],s=e.get("substitutePlugins")||[];return this.plugins.init(t.concat(i),o,s)}destroy(){let e=Promise.resolve();return"initializing"==this.state&&(e=new Promise(e=>this.once("ready",e))),e.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(...e){try{return this.commands.execute(...e)}catch(e){p.a.rethrowUnexpectedError(e,this)}}focus(){this.editing.view.focus()}}Object(f.a)(C,A.a);class E{constructor(e){this.editor=e,this._components=new Map}*names(){for(const e of this._components.values())yield e.originalName}add(e,t){this._components.set(S(e),{callback:t,originalName:e})}create(e){if(!this.has(e))throw new p.a("componentfactory-item-missing",this,{name:e});return this._components.get(S(e)).callback(this.editor.locale)}has(e){return this._components.has(S(e))}}function S(e){return String(e).toLowerCase()}var R=o("./packages/ckeditor5-utils/src/focustracker.js");class M{constructor(e){this.editor=e,this.componentFactory=new E(e),this.focusTracker=new R.a,this.set("viewportOffset",this._readViewportOffsetFromConfig()),this._editableElementsMap=new Map,this.listenTo(e.editing.view.document,"layoutChanged",()=>this.update())}get element(){return null}update(){this.fire("update")}destroy(){this.stopListening(),this.focusTracker.destroy();for(const e of this._editableElementsMap.values())e.ckeditorInstance=null;this._editableElementsMap=new Map}setEditableElement(e,t){this._editableElementsMap.set(e,t),t.ckeditorInstance||(t.ckeditorInstance=this.editor)}getEditableElement(e="main"){return this._editableElementsMap.get(e)}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}_readViewportOffsetFromConfig(){const e=this.editor,t=e.config.get("ui.viewportOffset");if(t)return t;const o=e.config.get("toolbar.viewportTopOffset");return o?(console.warn("editor-ui-deprecated-viewport-offset-config: The `toolbar.vieportTopOffset` configuration option is deprecated. It will be removed from future CKEditor versions. Use `ui.viewportOffset.top` instead."),{top:o}):{top:0}}}Object(f.a)(M,A.a);var N=o("./node_modules/lodash-es/isFunction.js");function I(e){if(!Object(N.a)(e.updateSourceElement))throw new p.a("attachtoform-missing-elementapi-interface",e);const t=e.sourceElement;if(t&&"textarea"===t.tagName.toLowerCase()&&t.form){let o;const i=t.form,s=()=>e.updateSourceElement();Object(N.a)(i.submit)&&(o=i.submit,i.submit=()=>{s(),o.apply(i)}),i.addEventListener("submit",s),e.on("destroy",()=>{i.removeEventListener("submit",s),o&&(i.submit=o)})}}var z={setData(e){this.data.set(e)},getData(e){return this.data.get(e)}},V=o("./packages/ckeditor5-utils/src/dom/setdatainelement.js");var D={updateSourceElement(){if(!this.sourceElement)throw new p.a("editor-missing-sourceelement",this);Object(V.a)(this.sourceElement,this.data.get())}};function B(e){const t=e.sourceElement;if(t){if(t.ckeditorInstance)throw new p.a("editor-source-element-already-used",e);t.ckeditorInstance=e,e.once("destroy",()=>{delete t.ckeditorInstance})}}var F=o("./packages/ckeditor5-core/src/pendingactions.js"),L=o("./packages/ckeditor5-core/theme/icons/pilcrow.svg"),W=o("./packages/ckeditor5-core/theme/icons/three-vertical-dots.svg");const H={cancel:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.591 10.177 4.243 4.242a1 1 0 0 1-1.415 1.415l-4.242-4.243-4.243 4.243a1 1 0 0 1-1.414-1.415l4.243-4.242L4.52 5.934A1 1 0 0 1 5.934 4.52l4.243 4.243 4.242-4.243a1 1 0 1 1 1.415 1.414l-4.243 4.243z"/></svg>',caption:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 16h9a1 1 0 0 1 0 2H2a1 1 0 0 1 0-2z"/><path d="M17 1a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h14zm0 1.5H3a.5.5 0 0 0-.492.41L2.5 3v9a.5.5 0 0 0 .41.492L3 12.5h14a.5.5 0 0 0 .492-.41L17.5 12V3a.5.5 0 0 0-.41-.492L17 2.5z" fill-opacity=".6"/></svg>',check:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.972 16.615a.997.997 0 0 1-.744-.292l-4.596-4.596a1 1 0 1 1 1.414-1.414l3.926 3.926 9.937-9.937a1 1 0 0 1 1.414 1.415L7.717 16.323a.997.997 0 0 1-.745.292z"/></svg>',cog:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.333 2 .19 2.263a5.899 5.899 0 0 1 1.458.604L14.714 3.4 16.6 5.286l-1.467 1.733c.263.452.468.942.605 1.46L18 8.666v2.666l-2.263.19a5.899 5.899 0 0 1-.604 1.458l1.467 1.733-1.886 1.886-1.733-1.467a5.899 5.899 0 0 1-1.46.605L11.334 18H8.667l-.19-2.263a5.899 5.899 0 0 1-1.458-.604L5.286 16.6 3.4 14.714l1.467-1.733a5.899 5.899 0 0 1-.604-1.458L2 11.333V8.667l2.262-.189a5.899 5.899 0 0 1 .605-1.459L3.4 5.286 5.286 3.4l1.733 1.467a5.899 5.899 0 0 1 1.46-.605L8.666 2h2.666zM10 6.267a3.733 3.733 0 1 0 0 7.466 3.733 3.733 0 0 0 0-7.466z"/></svg>',eraser:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m8.636 9.531-2.758 3.94a.5.5 0 0 0 .122.696l3.224 2.284h1.314l2.636-3.736L8.636 9.53zm.288 8.451L5.14 15.396a2 2 0 0 1-.491-2.786l6.673-9.53a2 2 0 0 1 2.785-.49l3.742 2.62a2 2 0 0 1 .491 2.785l-7.269 10.053-2.147-.066z"/><path d="M4 18h5.523v-1H4zm-2 0h1v-1H2z"/></svg>',lowVision:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M5.085 6.22 2.943 4.078a.75.75 0 1 1 1.06-1.06l2.592 2.59A11.094 11.094 0 0 1 10 5.068c4.738 0 8.578 3.101 8.578 5.083 0 1.197-1.401 2.803-3.555 3.887l1.714 1.713a.75.75 0 0 1-.09 1.138.488.488 0 0 1-.15.084.75.75 0 0 1-.821-.16L6.17 7.304c-.258.11-.51.233-.757.365l6.239 6.24-.006.005.78.78c-.388.094-.78.166-1.174.215l-1.11-1.11h.011L4.55 8.197a7.2 7.2 0 0 0-.665.514l-.112.098 4.897 4.897-.005.006 1.276 1.276a10.164 10.164 0 0 1-1.477-.117l-.479-.479-.009.009-4.863-4.863-.022.031a2.563 2.563 0 0 0-.124.2c-.043.077-.08.158-.108.241a.534.534 0 0 0-.028.133.29.29 0 0 0 .008.072.927.927 0 0 0 .082.226c.067.133.145.26.234.379l3.242 3.365.025.01.59.623c-3.265-.918-5.59-3.155-5.59-4.668 0-1.194 1.448-2.838 3.663-3.93zm7.07.531a4.632 4.632 0 0 1 1.108 5.992l.345.344.046-.018a9.313 9.313 0 0 0 2-1.112c.256-.187.5-.392.727-.613.137-.134.27-.277.392-.431.072-.091.141-.185.203-.286.057-.093.107-.19.148-.292a.72.72 0 0 0 .036-.12.29.29 0 0 0 .008-.072.492.492 0 0 0-.028-.133.999.999 0 0 0-.036-.096 2.165 2.165 0 0 0-.071-.145 2.917 2.917 0 0 0-.125-.2 3.592 3.592 0 0 0-.263-.335 5.444 5.444 0 0 0-.53-.523 7.955 7.955 0 0 0-1.054-.768 9.766 9.766 0 0 0-1.879-.891c-.337-.118-.68-.219-1.027-.301zm-2.85.21-.069.002a.508.508 0 0 0-.254.097.496.496 0 0 0-.104.679.498.498 0 0 0 .326.199l.045.005c.091.003.181.003.272.012a2.45 2.45 0 0 1 2.017 1.513c.024.061.043.125.069.185a.494.494 0 0 0 .45.287h.008a.496.496 0 0 0 .35-.158.482.482 0 0 0 .13-.335.638.638 0 0 0-.048-.219 3.379 3.379 0 0 0-.36-.723 3.438 3.438 0 0 0-2.791-1.543l-.028-.001h-.013z"/></svg>',image:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.91 10.54c.26-.23.64-.21.88.03l3.36 3.14 2.23-2.06a.64.64 0 0 1 .87 0l2.52 2.97V4.5H3.2v10.12l3.71-4.08zm10.27-7.51c.6 0 1.09.47 1.09 1.05v11.84c0 .59-.49 1.06-1.09 1.06H2.79c-.6 0-1.09-.47-1.09-1.06V4.08c0-.58.49-1.05 1.1-1.05h14.38zm-5.22 5.56a1.96 1.96 0 1 1 3.4-1.96 1.96 1.96 0 0 1-3.4 1.96z"/></svg>',alignBottom:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m9.239 13.938-2.88-1.663a.75.75 0 0 1 .75-1.3L9 12.067V4.75a.75.75 0 1 1 1.5 0v7.318l1.89-1.093a.75.75 0 0 1 .75 1.3l-2.879 1.663a.752.752 0 0 1-.511.187.752.752 0 0 1-.511-.187zM4.25 17a.75.75 0 1 1 0-1.5h10.5a.75.75 0 0 1 0 1.5H4.25z"/></svg>',alignMiddle:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M9.75 11.875a.752.752 0 0 1 .508.184l2.883 1.666a.75.75 0 0 1-.659 1.344l-.091-.044-1.892-1.093.001 4.318a.75.75 0 1 1-1.5 0v-4.317l-1.89 1.092a.75.75 0 0 1-.75-1.3l2.879-1.663a.752.752 0 0 1 .51-.187zM15.25 9a.75.75 0 1 1 0 1.5H4.75a.75.75 0 1 1 0-1.5h10.5zM9.75.375a.75.75 0 0 1 .75.75v4.318l1.89-1.093.092-.045a.75.75 0 0 1 .659 1.344l-2.883 1.667a.752.752 0 0 1-.508.184.752.752 0 0 1-.511-.187L6.359 5.65a.75.75 0 0 1 .75-1.299L9 5.442V1.125a.75.75 0 0 1 .75-.75z"/></svg>',alignTop:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m10.261 7.062 2.88 1.663a.75.75 0 0 1-.75 1.3L10.5 8.933v7.317a.75.75 0 1 1-1.5 0V8.932l-1.89 1.093a.75.75 0 0 1-.75-1.3l2.879-1.663a.752.752 0 0 1 .511-.187.752.752 0 0 1 .511.187zM15.25 4a.75.75 0 1 1 0 1.5H4.75a.75.75 0 0 1 0-1.5h10.5z"/></svg>',alignLeft:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>',alignCenter:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm2.286 4c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75z"/></svg>',alignRight:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M18 3.75a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 8a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 4a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75zm0-8a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75z"/></svg>',alignJustify:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>',objectLeft:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm11.5 9H18v1.5h-4.5zm0-3H18v1.5h-4.5zm0-3H18v1.5h-4.5zM2 15h16v1.5H2z"/><path d="M12.003 7v5.5a1 1 0 0 1-1 1H2.996a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h8.007a1 1 0 0 1 1 1zm-1.506.5H3.5V12h6.997V7.5z"/></svg>',objectCenter:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm0 12h16v1.5H2z"/><path d="M15.003 7v5.5a1 1 0 0 1-1 1H5.996a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h8.007a1 1 0 0 1 1 1zm-1.506.5H6.5V12h6.997V7.5z"/></svg>',objectRight:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm0 12h16v1.5H2zm0-9h5v1.5H2zm0 3h5v1.5H2zm0 3h5v1.5H2z"/><path d="M18.003 7v5.5a1 1 0 0 1-1 1H8.996a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h8.007a1 1 0 0 1 1 1zm-1.506.5H9.5V12h6.997V7.5z"/></svg>',objectFullWidth:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm0 12h16v1.5H2z"/><path d="M18 7v5.5a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1zm-1.505.5H3.504V12h12.991V7.5z"/></svg>',objectInline:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm11.5 9H18v1.5h-4.5zM2 15h16v1.5H2z"/><path d="M12.003 7v5.5a1 1 0 0 1-1 1H2.996a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h8.007a1 1 0 0 1 1 1zm-1.506.5H3.5V12h6.997V7.5z"/></svg>',objectBlockLeft:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm0 12h16v1.5H2z"/><path d="M12.003 7v5.5a1 1 0 0 1-1 1H2.996a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h8.007a1 1 0 0 1 1 1zm-1.506.5H3.5V12h6.997V7.5z"/></svg>',objectBlockRight:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm0 12h16v1.5H2z"/><path d="M18.003 7v5.5a1 1 0 0 1-1 1H8.996a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h8.007a1 1 0 0 1 1 1zm-1.506.5H9.5V12h6.997V7.5z"/></svg>',objectSizeFull:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M18.095 2H1.905C.853 2 0 2.895 0 4v12c0 1.105.853 2 1.905 2h16.19C19.147 18 20 17.105 20 16V4c0-1.105-.853-2-1.905-2zm0 1.5c.263 0 .476.224.476.5v12c0 .276-.213.5-.476.5H1.905a.489.489 0 0 1-.476-.5V4c0-.276.213-.5.476-.5h16.19z"/></svg>',objectSizeLarge:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M13 6H2a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2zm0 1.5a.5.5 0 0 1 .5.5v8a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5V8a.5.5 0 0 1 .5-.5h11z"/></svg>',objectSizeSmall:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M7 10H2a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h5a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2zm0 1.5a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5v-4a.5.5 0 0 1 .5-.5h5z"/></svg>',objectSizeMedium:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M10 8H2a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2zm0 1.5a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5v-6a.5.5 0 0 1 .5-.5h8z"/></svg>',pencil:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m7.3 17.37-.061.088a1.518 1.518 0 0 1-.934.535l-4.178.663-.806-4.153a1.495 1.495 0 0 1 .187-1.058l.056-.086L8.77 2.639c.958-1.351 2.803-1.076 4.296-.03 1.497 1.047 2.387 2.693 1.433 4.055L7.3 17.37zM9.14 4.728l-5.545 8.346 3.277 2.294 5.544-8.346L9.14 4.728zM6.07 16.512l-3.276-2.295.53 2.73 2.746-.435zM9.994 3.506 13.271 5.8c.316-.452-.16-1.333-1.065-1.966-.905-.634-1.895-.78-2.212-.328zM8 18.5 9.375 17H19v1.5H8z"/></svg>',pilcrow:L.a,quote:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 10.423a6.5 6.5 0 0 1 6.056-6.408l.038.67C6.448 5.423 5.354 7.663 5.22 10H9c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574zm8 0a6.5 6.5 0 0 1 6.056-6.408l.038.67c-2.646.739-3.74 2.979-3.873 5.315H17c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574z"/></svg>',threeVerticalDots:W.a}},"./src/engine.js":function(e,t,o){"use strict";o.r(t),o.d(t,"enablePlaceholder",(function(){return s})),o.d(t,"disablePlaceholder",(function(){return r})),o.d(t,"showPlaceholder",(function(){return n})),o.d(t,"hidePlaceholder",(function(){return a})),o.d(t,"needsPlaceholder",(function(){return c})),o.d(t,"EditingController",(function(){return h.a})),o.d(t,"DataController",(function(){return p.a})),o.d(t,"Conversion",(function(){return g.a})),o.d(t,"HtmlDataProcessor",(function(){return f.a})),o.d(t,"InsertOperation",(function(){return m.a})),o.d(t,"MarkerOperation",(function(){return k.a})),o.d(t,"OperationFactory",(function(){return b.a})),o.d(t,"transformSets",(function(){return _.a})),o.d(t,"DocumentSelection",(function(){return w.a})),o.d(t,"Range",(function(){return v.a})),o.d(t,"LiveRange",(function(){return y.a})),o.d(t,"LivePosition",(function(){return j.a})),o.d(t,"Model",(function(){return x.a})),o.d(t,"TreeWalker",(function(){return P.a})),o.d(t,"Element",(function(){return O.a})),o.d(t,"DomConverter",(function(){return A.a})),o.d(t,"Renderer",(function(){return T.a})),o.d(t,"ViewDocument",(function(){return C.a})),o.d(t,"getFillerOffset",(function(){return E.b})),o.d(t,"Observer",(function(){return S.a})),o.d(t,"ClickObserver",(function(){return M})),o.d(t,"DomEventObserver",(function(){return R.a})),o.d(t,"MouseObserver",(function(){return N.a})),o.d(t,"DowncastWriter",(function(){return I.a})),o.d(t,"UpcastWriter",(function(){return H})),o.d(t,"Matcher",(function(){return q.a})),o.d(t,"DomEventData",(function(){return $.a})),o.d(t,"StylesProcessor",(function(){return U.a})),o.d(t,"addBackgroundRules",(function(){return _e})),o.d(t,"addBorderRules",(function(){return ve})),o.d(t,"addMarginRules",(function(){return Re})),o.d(t,"addPaddingRules",(function(){return Me})),o.d(t,"isColor",(function(){return Q})),o.d(t,"isLineStyle",(function(){return te})),o.d(t,"isLength",(function(){return ie})),o.d(t,"isPercentage",(function(){return re})),o.d(t,"isRepeat",(function(){return ae})),o.d(t,"isPosition",(function(){return le})),o.d(t,"isAttachment",(function(){return ue})),o.d(t,"isURL",(function(){return pe})),o.d(t,"getBoxSidesValues",(function(){return ge})),o.d(t,"getBoxSidesValueReducer",(function(){return fe})),o.d(t,"getBoxSidesShorthandValue",(function(){return me})),o.d(t,"getPositionShorthandNormalizer",(function(){return ke})),o.d(t,"getShorthandValues",(function(){return be}));o("./packages/ckeditor5-engine/theme/placeholder.css");const i=new WeakMap;function s(e){const{view:t,element:o,text:s,isDirectHost:r=!0,keepOnFocus:n=!1}=e,a=t.document;i.has(a)||(i.set(a,new Map),a.registerPostFixer(e=>l(a,e))),i.get(a).set(o,{text:s,isDirectHost:r,keepOnFocus:n,hostElement:r?o:null}),t.change(e=>l(a,e))}function r(e,t){const o=t.document;e.change(e=>{if(!i.has(o))return;const s=i.get(o),r=s.get(t);e.removeAttribute("data-placeholder",r.hostElement),a(e,r.hostElement),s.delete(t)})}function n(e,t){return!t.hasClass("ck-placeholder")&&(e.addClass("ck-placeholder",t),!0)}function a(e,t){return!!t.hasClass("ck-placeholder")&&(e.removeClass("ck-placeholder",t),!0)}function c(e,t){if(!e.isAttached())return!1;if(Array.from(e.getChildren()).some(e=>!e.is("uiElement")))return!1;if(t)return!0;const o=e.document;if(!o.isFocused)return!0;const i=o.selection.anchor;return i&&i.parent!==e}function l(e,t){const o=i.get(e),s=[];let r=!1;for(const[e,i]of o)i.isDirectHost&&(s.push(e),d(t,e,i)&&(r=!0));for(const[e,i]of o){if(i.isDirectHost)continue;const o=u(e);o&&(s.includes(o)||(i.hostElement=o,d(t,e,i)&&(r=!0)))}return r}function d(e,t,o){const{text:i,isDirectHost:s,hostElement:r}=o;let l=!1;r.getAttribute("data-placeholder")!==i&&(e.setAttribute("data-placeholder",i,r),l=!0);return(s||1==t.childCount)&&c(r,o.keepOnFocus)?n(e,r)&&(l=!0):a(e,r)&&(l=!0),l}function u(e){if(e.childCount){const t=e.getChild(0);if(t.is("element")&&!t.is("uiElement"))return t}return null}var h=o("./packages/ckeditor5-engine/src/controller/editingcontroller.js"),p=o("./packages/ckeditor5-engine/src/controller/datacontroller.js"),g=o("./packages/ckeditor5-engine/src/conversion/conversion.js"),f=o("./packages/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js"),m=o("./packages/ckeditor5-engine/src/model/operation/insertoperation.js"),k=o("./packages/ckeditor5-engine/src/model/operation/markeroperation.js"),b=o("./packages/ckeditor5-engine/src/model/operation/operationfactory.js"),_=o("./packages/ckeditor5-engine/src/model/operation/transform.js"),w=o("./packages/ckeditor5-engine/src/model/documentselection.js"),v=o("./packages/ckeditor5-engine/src/model/range.js"),y=o("./packages/ckeditor5-engine/src/model/liverange.js"),j=o("./packages/ckeditor5-engine/src/model/liveposition.js"),x=o("./packages/ckeditor5-engine/src/model/model.js"),P=o("./packages/ckeditor5-engine/src/model/treewalker.js"),O=o("./packages/ckeditor5-engine/src/model/element.js"),A=o("./packages/ckeditor5-engine/src/view/domconverter.js"),T=o("./packages/ckeditor5-engine/src/view/renderer.js"),C=o("./packages/ckeditor5-engine/src/view/document.js"),E=o("./packages/ckeditor5-engine/src/view/containerelement.js"),S=o("./packages/ckeditor5-engine/src/view/observer/observer.js"),R=o("./packages/ckeditor5-engine/src/view/observer/domeventobserver.js");class M extends R.a{constructor(e){super(e),this.domEventType="click"}onDomEvent(e){this.fire(e.type,e)}}var N=o("./packages/ckeditor5-engine/src/view/observer/mouseobserver.js"),I=o("./packages/ckeditor5-engine/src/view/downcastwriter.js"),z=o("./packages/ckeditor5-engine/src/view/documentfragment.js"),V=o("./packages/ckeditor5-engine/src/view/element.js"),D=o("./packages/ckeditor5-engine/src/view/text.js"),B=o("./node_modules/lodash-es/isPlainObject.js"),F=o("./packages/ckeditor5-engine/src/view/position.js"),L=o("./packages/ckeditor5-engine/src/view/range.js"),W=o("./packages/ckeditor5-engine/src/view/selection.js");class H{constructor(e){this.document=e}createDocumentFragment(e){return new z.a(this.document,e)}createElement(e,t,o){return new V.a(this.document,e,t,o)}createText(e){return new D.a(this.document,e)}clone(e,t=!1){return e._clone(t)}appendChild(e,t){return t._appendChild(e)}insertChild(e,t,o){return o._insertChild(e,t)}removeChildren(e,t,o){return o._removeChildren(e,t)}remove(e){const t=e.parent;return t?this.removeChildren(t.getChildIndex(e),1,t):[]}replace(e,t){const o=e.parent;if(o){const i=o.getChildIndex(e);return this.removeChildren(i,1,o),this.insertChild(i,t,o),!0}return!1}unwrapElement(e){const t=e.parent;if(t){const o=t.getChildIndex(e);this.remove(e),this.insertChild(o,e.getChildren(),t)}}rename(e,t){const o=new V.a(this.document,e,t.getAttributes(),t.getChildren());return this.replace(t,o)?o:null}setAttribute(e,t,o){o._setAttribute(e,t)}removeAttribute(e,t){t._removeAttribute(e)}addClass(e,t){t._addClass(e)}removeClass(e,t){t._removeClass(e)}setStyle(e,t,o){Object(B.a)(e)&&void 0===o&&(o=t),o._setStyle(e,t)}removeStyle(e,t){t._removeStyle(e)}setCustomProperty(e,t,o){o._setCustomProperty(e,t)}removeCustomProperty(e,t){return t._removeCustomProperty(e)}createPositionAt(e,t){return F.a._createAt(e,t)}createPositionAfter(e){return F.a._createAfter(e)}createPositionBefore(e){return F.a._createBefore(e)}createRange(e,t){return new L.a(e,t)}createRangeOn(e){return L.a._createOn(e)}createRangeIn(e){return L.a._createIn(e)}createSelection(e,t,o){return new W.a(e,t,o)}}var q=o("./packages/ckeditor5-engine/src/view/matcher.js"),$=o("./packages/ckeditor5-engine/src/view/observer/domeventdata.js"),U=o("./packages/ckeditor5-engine/src/view/stylesmap.js");const K=/^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i,G=/^rgb\([ ]?([0-9]{1,3}[ %]?,[ ]?){2,3}[0-9]{1,3}[ %]?\)$/i,J=/^rgba\([ ]?([0-9]{1,3}[ %]?,[ ]?){3}(1|[0-9]+%|[0]?\.?[0-9]+)\)$/i,Y=/^hsl\([ ]?([0-9]{1,3}[ %]?[,]?[ ]*){3}(1|[0-9]+%|[0]?\.?[0-9]+)?\)$/i,X=/^hsla\([ ]?([0-9]{1,3}[ %]?,[ ]?){2,3}(1|[0-9]+%|[0]?\.?[0-9]+)\)$/i,Z=new Set(["black","silver","gray","white","maroon","red","purple","fuchsia","green","lime","olive","yellow","navy","blue","teal","aqua","orange","aliceblue","antiquewhite","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","gainsboro","ghostwhite","gold","goldenrod","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","limegreen","linen","magenta","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","oldlace","olivedrab","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellowgreen","activeborder","activecaption","appworkspace","background","buttonface","buttonhighlight","buttonshadow","buttontext","captiontext","graytext","highlight","highlighttext","inactiveborder","inactivecaption","inactivecaptiontext","infobackground","infotext","menu","menutext","scrollbar","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","window","windowframe","windowtext","rebeccapurple","currentcolor","transparent"]);function Q(e){return e.startsWith("#")?K.test(e):e.startsWith("rgb")?G.test(e)||J.test(e):e.startsWith("hsl")?Y.test(e)||X.test(e):Z.has(e.toLowerCase())}const ee=["none","hidden","dotted","dashed","solid","double","groove","ridge","inset","outset"];function te(e){return ee.includes(e)}const oe=/^([+-]?[0-9]*([.][0-9]+)?(px|cm|mm|in|pc|pt|ch|em|ex|rem|vh|vw|vmin|vmax)|0)$/;function ie(e){return oe.test(e)}const se=/^[+-]?[0-9]*([.][0-9]+)?%$/;function re(e){return se.test(e)}const ne=["repeat-x","repeat-y","repeat","space","round","no-repeat"];function ae(e){return ne.includes(e)}const ce=["center","top","bottom","left","right"];function le(e){return ce.includes(e)}const de=["fixed","scroll","local"];function ue(e){return de.includes(e)}const he=/^url\(/;function pe(e){return he.test(e)}function ge(e=""){if(""===e)return{top:void 0,right:void 0,bottom:void 0,left:void 0};const t=be(e),o=t[0],i=t[2]||o,s=t[1]||o;return{top:o,bottom:i,right:s,left:t[3]||s}}function fe(e){return t=>{const{top:o,right:i,bottom:s,left:r}=t,n=[];return[o,i,r,s].every(e=>!!e)?n.push([e,me(t)]):(o&&n.push([e+"-top",o]),i&&n.push([e+"-right",i]),s&&n.push([e+"-bottom",s]),r&&n.push([e+"-left",r])),n}}function me({top:e,right:t,bottom:o,left:i}){const s=[];return i!==t?s.push(e,t,o,i):o!==e?s.push(e,t,o):t!==e?s.push(e,t):s.push(e),s.join(" ")}function ke(e){return t=>({path:e,value:ge(t)})}function be(e){return e.replace(/, /g,",").split(" ").map(e=>e.replace(/,/g,", "))}function _e(e){e.setNormalizer("background",we),e.setNormalizer("background-color",e=>({path:"background.color",value:e})),e.setReducer("background",e=>{const t=[];return t.push(["background-color",e.color]),t}),e.setStyleRelation("background",["background-color"])}function we(e){const t={},o=be(e);for(const e of o)ae(e)?(t.repeat=t.repeat||[],t.repeat.push(e)):le(e)?(t.position=t.position||[],t.position.push(e)):ue(e)?t.attachment=e:Q(e)?t.color=e:pe(e)&&(t.image=e);return{path:"background",value:t}}function ve(e){e.setNormalizer("border",ye),e.setNormalizer("border-top",je("top")),e.setNormalizer("border-right",je("right")),e.setNormalizer("border-bottom",je("bottom")),e.setNormalizer("border-left",je("left")),e.setNormalizer("border-color",xe("color")),e.setNormalizer("border-width",xe("width")),e.setNormalizer("border-style",xe("style")),e.setNormalizer("border-top-color",Oe("color","top")),e.setNormalizer("border-top-style",Oe("style","top")),e.setNormalizer("border-top-width",Oe("width","top")),e.setNormalizer("border-right-color",Oe("color","right")),e.setNormalizer("border-right-style",Oe("style","right")),e.setNormalizer("border-right-width",Oe("width","right")),e.setNormalizer("border-bottom-color",Oe("color","bottom")),e.setNormalizer("border-bottom-style",Oe("style","bottom")),e.setNormalizer("border-bottom-width",Oe("width","bottom")),e.setNormalizer("border-left-color",Oe("color","left")),e.setNormalizer("border-left-style",Oe("style","left")),e.setNormalizer("border-left-width",Oe("width","left")),e.setExtractor("border-top",Ae("top")),e.setExtractor("border-right",Ae("right")),e.setExtractor("border-bottom",Ae("bottom")),e.setExtractor("border-left",Ae("left")),e.setExtractor("border-top-color","border.color.top"),e.setExtractor("border-right-color","border.color.right"),e.setExtractor("border-bottom-color","border.color.bottom"),e.setExtractor("border-left-color","border.color.left"),e.setExtractor("border-top-width","border.width.top"),e.setExtractor("border-right-width","border.width.right"),e.setExtractor("border-bottom-width","border.width.bottom"),e.setExtractor("border-left-width","border.width.left"),e.setExtractor("border-top-style","border.style.top"),e.setExtractor("border-right-style","border.style.right"),e.setExtractor("border-bottom-style","border.style.bottom"),e.setExtractor("border-left-style","border.style.left"),e.setReducer("border-color",fe("border-color")),e.setReducer("border-style",fe("border-style")),e.setReducer("border-width",fe("border-width")),e.setReducer("border-top",Ee("top")),e.setReducer("border-right",Ee("right")),e.setReducer("border-bottom",Ee("bottom")),e.setReducer("border-left",Ee("left")),e.setReducer("border",function(){return t=>{const o=Te(t,"top"),i=Te(t,"right"),s=Te(t,"bottom"),r=Te(t,"left"),n=[o,i,s,r],a={width:e(n,"width"),style:e(n,"style"),color:e(n,"color")},c=Se(a,"all");if(c.length)return c;return[...Object.entries(a).reduce((e,[t,o])=>(o&&(e.push(["border-"+t,o]),n.forEach(e=>e[t]=null)),e),[]),...Se(o,"top"),...Se(i,"right"),...Se(s,"bottom"),...Se(r,"left")]};function e(e,t){return e.map(e=>e[t]).reduce((e,t)=>e==t?e:null)}}()),e.setStyleRelation("border",["border-color","border-style","border-width","border-top","border-right","border-bottom","border-left","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","border-top-width","border-right-width","border-bottom-width","border-left-width"]),e.setStyleRelation("border-color",["border-top-color","border-right-color","border-bottom-color","border-left-color"]),e.setStyleRelation("border-style",["border-top-style","border-right-style","border-bottom-style","border-left-style"]),e.setStyleRelation("border-width",["border-top-width","border-right-width","border-bottom-width","border-left-width"]),e.setStyleRelation("border-top",["border-top-color","border-top-style","border-top-width"]),e.setStyleRelation("border-right",["border-right-color","border-right-style","border-right-width"]),e.setStyleRelation("border-bottom",["border-bottom-color","border-bottom-style","border-bottom-width"]),e.setStyleRelation("border-left",["border-left-color","border-left-style","border-left-width"])}function ye(e){const{color:t,style:o,width:i}=Ce(e);return{path:"border",value:{color:ge(t),style:ge(o),width:ge(i)}}}function je(e){return t=>{const{color:o,style:i,width:s}=Ce(t),r={};return void 0!==o&&(r.color={[e]:o}),void 0!==i&&(r.style={[e]:i}),void 0!==s&&(r.width={[e]:s}),{path:"border",value:r}}}function xe(e){return t=>({path:"border",value:Pe(t,e)})}function Pe(e,t){return{[t]:ge(e)}}function Oe(e,t){return o=>({path:"border",value:{[e]:{[t]:o}}})}function Ae(e){return(t,o)=>{if(o.border)return Te(o.border,e)}}function Te(e,t){const o={};return e.width&&e.width[t]&&(o.width=e.width[t]),e.style&&e.style[t]&&(o.style=e.style[t]),e.color&&e.color[t]&&(o.color=e.color[t]),o}function Ce(e){const t={},o=be(e);for(const e of o)ie(e)||/thin|medium|thick/.test(e)?t.width=e:te(e)?t.style=e:t.color=e;return t}function Ee(e){return t=>Se(t,e)}function Se(e,t){const o=[];if(e&&e.width&&o.push("width"),e&&e.style&&o.push("style"),e&&e.color&&o.push("color"),3==o.length){const i=o.map(t=>e[t]).join(" ");return["all"==t?["border",i]:["border-"+t,i]]}return"all"==t?[]:o.map(o=>[`border-${t}-${o}`,e[o]])}function Re(e){e.setNormalizer("margin",ke("margin")),e.setNormalizer("margin-top",e=>({path:"margin.top",value:e})),e.setNormalizer("margin-right",e=>({path:"margin.right",value:e})),e.setNormalizer("margin-bottom",e=>({path:"margin.bottom",value:e})),e.setNormalizer("margin-left",e=>({path:"margin.left",value:e})),e.setReducer("margin",fe("margin")),e.setStyleRelation("margin",["margin-top","margin-right","margin-bottom","margin-left"])}function Me(e){e.setNormalizer("padding",ke("padding")),e.setNormalizer("padding-top",e=>({path:"padding.top",value:e})),e.setNormalizer("padding-right",e=>({path:"padding.right",value:e})),e.setNormalizer("padding-bottom",e=>({path:"padding.bottom",value:e})),e.setNormalizer("padding-left",e=>({path:"padding.left",value:e})),e.setReducer("padding",fe("padding")),e.setStyleRelation("padding",["padding-top","padding-right","padding-bottom","padding-left"])}},"./src/enter.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Enter",(function(){return i.a})),o.d(t,"ShiftEnter",(function(){return u}));var i=o("./packages/ckeditor5-enter/src/enter.js"),s=o("./packages/ckeditor5-core/src/command.js"),r=o("./packages/ckeditor5-enter/src/utils.js");class n extends s.a{execute(){const e=this.editor.model,t=e.document;e.change(o=>{!function(e,t,o){const i=o.isCollapsed,s=o.getFirstRange(),n=s.start.parent,c=s.end.parent,l=n==c;if(i){const i=Object(r.a)(e.schema,o.getAttributes());a(e,t,s.end),t.removeSelectionAttribute(o.getAttributeKeys()),t.setSelectionAttribute(i)}else{const i=!(s.start.isAtStart&&s.end.isAtEnd);e.deleteContent(o,{leaveUnmerged:i}),l?a(e,t,o.focus):i&&t.setSelection(c,0)}}(e,o,t.selection),this.fire("afterExecute",{writer:o})})}refresh(){const e=this.editor.model,t=e.document;this.isEnabled=function(e,t){if(t.rangeCount>1)return!1;const o=t.anchor;if(!o||!e.checkChild(o,"softBreak"))return!1;const i=t.getFirstRange(),s=i.start.parent,r=i.end.parent;if((c(s,e)||c(r,e))&&s!==r)return!1;return!0}(e.schema,t.selection)}}function a(e,t,o){const i=t.createElement("softBreak");e.insertContent(i,o),t.setSelection(i,"after")}function c(e,t){return!e.is("rootElement")&&(t.isLimit(e)||c(e.parent,t))}var l=o("./packages/ckeditor5-enter/src/enterobserver.js"),d=o("./packages/ckeditor5-core/src/plugin.js");class u extends d.a{static get pluginName(){return"ShiftEnter"}init(){const e=this.editor,t=e.model.schema,o=e.conversion,i=e.editing.view,s=i.document;t.register("softBreak",{allowWhere:"$text",isInline:!0}),o.for("upcast").elementToElement({model:"softBreak",view:"br"}),o.for("downcast").elementToElement({model:"softBreak",view:(e,{writer:t})=>t.createEmptyElement("br")}),i.addObserver(l.a),e.commands.add("shiftEnter",new n(e)),this.listenTo(s,"enter",(t,o)=>{o.preventDefault(),o.isSoft&&(e.execute("shiftEnter"),i.scrollToTheSelection())},{priority:"low"})}}},"./src/paragraph.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Paragraph",(function(){return l})),o.d(t,"ParagraphButtonUI",(function(){return u}));var i=o("./packages/ckeditor5-core/src/command.js"),s=o("./packages/ckeditor5-utils/src/first.js");class r extends i.a{refresh(){const e=this.editor.model,t=e.document,o=Object(s.a)(t.selection.getSelectedBlocks());this.value=!!o&&o.is("element","paragraph"),this.isEnabled=!!o&&n(o,e.schema)}execute(e={}){const t=this.editor.model,o=t.document;t.change(i=>{const s=(e.selection||o.selection).getSelectedBlocks();for(const e of s)!e.is("element","paragraph")&&n(e,t.schema)&&i.rename(e,"paragraph")})}}function n(e,t){return t.checkChild(e.parent,"paragraph")&&!t.isObject(e)}class a extends i.a{execute(e){const t=this.editor.model;let o=e.position;t.change(e=>{const i=e.createElement("paragraph");if(!t.schema.checkChild(o.parent,i)){const s=t.schema.findAllowedParent(o,i);if(!s)return;o=e.split(o,s).position}t.insertContent(i,o),e.setSelection(i,"in")})}}var c=o("./packages/ckeditor5-core/src/plugin.js");class l extends c.a{static get pluginName(){return"Paragraph"}init(){const e=this.editor,t=e.model;e.commands.add("paragraph",new r(e)),e.commands.add("insertParagraph",new a(e)),t.schema.register("paragraph",{inheritAllFrom:"$block"}),e.conversion.elementToElement({model:"paragraph",view:"p"}),e.conversion.for("upcast").elementToElement({model:(e,{writer:t})=>l.paragraphLikeElements.has(e.name)?e.isEmpty?null:t.createElement("paragraph"):null,view:/.+/,converterPriority:"low"})}}l.paragraphLikeElements=new Set(["blockquote","dd","div","dt","h1","h2","h3","h4","h5","h6","li","p","td","th"]);var d=o("./packages/ckeditor5-ui/src/button/buttonview.js");class u extends c.a{init(){const e=this.editor,t=e.t;e.ui.componentFactory.add("paragraph",o=>{const i=new d.a(o),s=e.commands.get("paragraph");return i.label=t("Paragraph"),i.icon='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.5 5.5H7v5h3.5a2.5 2.5 0 1 0 0-5zM5 3h6.5v.025a5 5 0 0 1 0 9.95V13H7v4a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z"/></svg>',i.tooltip=!0,i.isToggleable=!0,i.bind("isEnabled").to(s),i.bind("isOn").to(s,"value"),i.on("execute",()=>{e.execute("paragraph")}),i})}}},"./src/select-all.js":function(e,t,o){"use strict";o.r(t),o.d(t,"SelectAll",(function(){return h})),o.d(t,"SelectAllEditing",(function(){return l})),o.d(t,"SelectAllUI",(function(){return u}));var i=o("./packages/ckeditor5-core/src/plugin.js"),s=o("./packages/ckeditor5-utils/src/keyboard.js"),r=o("./packages/ckeditor5-core/src/command.js");class n extends r.a{constructor(e){super(e),this.affectsData=!1}execute(){const e=this.editor.model,t=e.document.selection;let o=e.schema.getLimitElement(t);if(t.containsEntireContent(o)||!a(e.schema,o))do{if(o=o.parent,!o)return}while(!a(e.schema,o));e.change(e=>{e.setSelection(o,"in")})}}function a(e,t){return e.isLimit(t)&&(e.checkChild(t,"$text")||e.checkChild(t,"paragraph"))}const c=Object(s.g)("Ctrl+A");class l extends i.a{static get pluginName(){return"SelectAllEditing"}init(){const e=this.editor,t=e.editing.view.document;e.commands.add("selectAll",new n(e)),this.listenTo(t,"keydown",(t,o)=>{Object(s.a)(o)===c&&(e.execute("selectAll"),o.preventDefault())})}}var d=o("./packages/ckeditor5-ui/src/button/buttonview.js");class u extends i.a{static get pluginName(){return"SelectAllUI"}init(){const e=this.editor;e.ui.componentFactory.add("selectAll",t=>{const o=e.commands.get("selectAll"),i=new d.a(t),s=t.t;return i.set({label:s("Select all"),icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M.75 15.5a.75.75 0 0 1 .75.75V18l.008.09A.5.5 0 0 0 2 18.5h1.75a.75.75 0 1 1 0 1.5H1.5l-.144-.007a1.5 1.5 0 0 1-1.35-1.349L0 18.5v-2.25a.75.75 0 0 1 .75-.75zm18.5 0a.75.75 0 0 1 .75.75v2.25l-.007.144a1.5 1.5 0 0 1-1.349 1.35L18.5 20h-2.25a.75.75 0 1 1 0-1.5H18a.5.5 0 0 0 .492-.41L18.5 18v-1.75a.75.75 0 0 1 .75-.75zm-10.45 3c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2H7.2a.2.2 0 0 1-.2-.2v-1.1c0-.11.09-.2.2-.2h1.6zm4 0c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2h-1.6a.2.2 0 0 1-.2-.2v-1.1c0-.11.09-.2.2-.2h1.6zm.45-5.5a.75.75 0 1 1 0 1.5h-8.5a.75.75 0 1 1 0-1.5h8.5zM1.3 11c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2H.2a.2.2 0 0 1-.2-.2v-1.6c0-.11.09-.2.2-.2h1.1zm18.5 0c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2h-1.1a.2.2 0 0 1-.2-.2v-1.6c0-.11.09-.2.2-.2h1.1zm-4.55-2a.75.75 0 1 1 0 1.5H4.75a.75.75 0 1 1 0-1.5h10.5zM1.3 7c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2H.2a.2.2 0 0 1-.2-.2V7.2c0-.11.09-.2.2-.2h1.1zm18.5 0c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2h-1.1a.2.2 0 0 1-.2-.2V7.2c0-.11.09-.2.2-.2h1.1zm-4.55-2a.75.75 0 1 1 0 1.5h-2.5a.75.75 0 1 1 0-1.5h2.5zm-5 0a.75.75 0 1 1 0 1.5h-5.5a.75.75 0 0 1 0-1.5h5.5zm-6.5-5a.75.75 0 0 1 0 1.5H2a.5.5 0 0 0-.492.41L1.5 2v1.75a.75.75 0 0 1-1.5 0V1.5l.007-.144A1.5 1.5 0 0 1 1.356.006L1.5 0h2.25zM18.5 0l.144.007a1.5 1.5 0 0 1 1.35 1.349L20 1.5v2.25a.75.75 0 1 1-1.5 0V2l-.008-.09A.5.5 0 0 0 18 1.5h-1.75a.75.75 0 1 1 0-1.5h2.25zM8.8 0c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2H7.2a.2.2 0 0 1-.2-.2V.2c0-.11.09-.2.2-.2h1.6zm4 0c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2h-1.6a.2.2 0 0 1-.2-.2V.2c0-.11.09-.2.2-.2h1.6z"/></svg>',keystroke:"Ctrl+A",tooltip:!0}),i.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(i,"execute",()=>{e.execute("selectAll"),e.editing.view.focus()}),i})}}class h extends i.a{static get requires(){return[l,u]}static get pluginName(){return"SelectAll"}}},"./src/typing.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Typing",(function(){return k})),o.d(t,"Input",(function(){return f})),o.d(t,"Delete",(function(){return m.a})),o.d(t,"TextWatcher",(function(){return v})),o.d(t,"TwoStepCaretMovement",(function(){return j})),o.d(t,"TextTransformation",(function(){return I})),o.d(t,"inlineHighlight",(function(){return W})),o.d(t,"findAttributeRange",(function(){return F})),o.d(t,"getLastTextLine",(function(){return w})),o.d(t,"isNonTypingKeystroke",(function(){return a.b}));var i=o("./packages/ckeditor5-core/src/plugin.js"),s=o("./packages/ckeditor5-core/src/command.js"),r=o("./packages/ckeditor5-typing/src/utils/changebuffer.js");class n extends s.a{constructor(e,t){super(e),this._buffer=new r.a(e.model,t),this._batches=new WeakSet}get buffer(){return this._buffer}destroy(){super.destroy(),this._buffer.destroy()}execute(e={}){const t=this.editor.model,o=t.document,i=e.text||"",s=i.length,r=e.range?t.createSelection(e.range):o.selection,n=e.resultRange;t.enqueueChange(this._buffer.batch,e=>{this._buffer.lock(),this._batches.add(this._buffer.batch),t.deleteContent(r),i&&t.insertContent(e.createText(i,o.selection.getAttributes()),r),n?e.setSelection(n):r.is("documentSelection")||e.setSelection(r),this._buffer.unlock(),this._buffer.input(s)})}}var a=o("./packages/ckeditor5-typing/src/utils/injectunsafekeystrokeshandling.js"),c=o("./packages/ckeditor5-utils/src/diff.js"),l=o("./packages/ckeditor5-engine/src/view/domconverter.js");function d(e){if(e.newChildren.length-e.oldChildren.length!=1)return;const t=function(e,t){const o=[];let i,s=0;return e.forEach(e=>{"equal"==e?(r(),s++):"insert"==e?(n("insert")?i.values.push(t[s]):(r(),i={type:"insert",index:s,values:[t[s]]}),s++):n("delete")?i.howMany++:(r(),i={type:"delete",index:s,howMany:1})}),r(),o;function r(){i&&(o.push(i),i=null)}function n(e){return i&&i.type==e}}(Object(c.a)(e.oldChildren,e.newChildren,u),e.newChildren);if(t.length>1)return;const o=t[0];return o.values[0]&&o.values[0].is("$text")?o:void 0}function u(e,t){return e&&e.is("$text")&&t&&t.is("$text")?e.data===t.data:e===t}class h{constructor(e){this.editor=e,this.editing=this.editor.editing}handle(e,t){if(function(e){if(0==e.length)return!1;for(const t of e)if("children"===t.type&&!d(t))return!0;return!1}(e))this._handleContainerChildrenMutations(e,t);else for(const o of e)this._handleTextMutation(o,t),this._handleTextNodeInsertion(o)}_handleContainerChildrenMutations(e,t){const o=function(e){const t=e.map(e=>e.node).reduce((e,t)=>e.getCommonAncestor(t,{includeSelf:!0}));if(!t)return;return t.getAncestors({includeSelf:!0,parentFirst:!0}).find(e=>e.is("containerElement")||e.is("rootElement"))}(e);if(!o)return;const i=this.editor.editing.view.domConverter.mapViewToDom(o),s=new l.a(this.editor.editing.view.document),r=this.editor.data.toModel(s.domToView(i)).getChild(0),n=this.editor.editing.mapper.toModelElement(o);if(!n)return;const a=Array.from(r.getChildren()),d=Array.from(n.getChildren()),u=a[a.length-1],h=d[d.length-1],f=u&&u.is("element","softBreak"),m=h&&!h.is("element","softBreak");f&&m&&a.pop();const k=this.editor.model.schema;if(!p(a,k)||!p(d,k))return;const b=a.map(e=>e.is("$text")?e.data:"@").join("").replace(/\u00A0/g," "),_=d.map(e=>e.is("$text")?e.data:"@").join("").replace(/\u00A0/g," ");if(_===b)return;const w=Object(c.a)(_,b),{firstChangeAt:v,insertions:y,deletions:j}=g(w);let x=null;t&&(x=this.editing.mapper.toModelRange(t.getFirstRange()));const P=b.substr(v,y),O=this.editor.model.createRange(this.editor.model.createPositionAt(n,v),this.editor.model.createPositionAt(n,v+j));this.editor.execute("input",{text:P,range:O,resultRange:x})}_handleTextMutation(e,t){if("text"!=e.type)return;const o=e.newText.replace(/\u00A0/g," "),i=e.oldText.replace(/\u00A0/g," ");if(i===o)return;const s=Object(c.a)(i,o),{firstChangeAt:r,insertions:n,deletions:a}=g(s);let l=null;t&&(l=this.editing.mapper.toModelRange(t.getFirstRange()));const d=this.editing.view.createPositionAt(e.node,r),u=this.editing.mapper.toModelPosition(d),h=this.editor.model.createRange(u,u.getShiftedBy(a)),p=o.substr(r,n);this.editor.execute("input",{text:p,range:h,resultRange:l})}_handleTextNodeInsertion(e){if("children"!=e.type)return;const t=d(e),o=this.editing.view.createPositionAt(e.node,t.index),i=this.editing.mapper.toModelPosition(o),s=t.values[0].data;this.editor.execute("input",{text:s.replace(/\u00A0/g," "),range:this.editor.model.createRange(i)})}}function p(e,t){return e.every(e=>t.isInline(e))}function g(e){let t=null,o=null;for(let i=0;i<e.length;i++){"equal"!=e[i]&&(t=null===t?i:t,o=i)}let i=0,s=0;for(let r=t;r<=o;r++)"insert"!=e[r]&&i++,"delete"!=e[r]&&s++;return{insertions:s,deletions:i,firstChangeAt:t}}class f extends i.a{static get pluginName(){return"Input"}init(){const e=this.editor,t=new n(e,e.config.get("typing.undoStep")||20);e.commands.add("input",t),Object(a.a)(e),function(e){e.editing.view.document.on("mutations",(t,o,i)=>{new h(e).handle(o,i)})}(e)}isInput(e){return this.editor.commands.get("input")._batches.has(e)}}var m=o("./packages/ckeditor5-typing/src/delete.js");class k extends i.a{static get requires(){return[f,m.a]}static get pluginName(){return"Typing"}}var b=o("./packages/ckeditor5-utils/src/mix.js"),_=o("./packages/ckeditor5-utils/src/observablemixin.js");function w(e,t){let o=e.start;return{text:Array.from(e.getItems()).reduce((e,i)=>i.is("$text")||i.is("$textProxy")?e+i.data:(o=t.createPositionAfter(i),""),""),range:t.createRange(o,e.end)}}class v{constructor(e,t){this.model=e,this.testCallback=t,this.hasMatch=!1,this.set("isEnabled",!0),this.on("change:isEnabled",()=>{this.isEnabled?this._startListening():(this.stopListening(e.document.selection),this.stopListening(e.document))}),this._startListening()}_startListening(){const e=this.model.document;this.listenTo(e.selection,"change:range",(t,{directChange:o})=>{o&&(e.selection.isCollapsed?this._evaluateTextBeforeSelection("selection"):this.hasMatch&&(this.fire("unmatched"),this.hasMatch=!1))}),this.listenTo(e,"change:data",(e,t)=>{"transparent"!=t.type&&this._evaluateTextBeforeSelection("data",{batch:t})})}_evaluateTextBeforeSelection(e,t={}){const o=this.model,i=o.document.selection,s=o.createRange(o.createPositionAt(i.focus.parent,0),i.focus),{text:r,range:n}=w(s,o),a=this.testCallback(r);if(!a&&this.hasMatch&&this.fire("unmatched"),this.hasMatch=!!a,a){const o=Object.assign(t,{text:r,range:n});"object"==typeof a&&Object.assign(o,a),this.fire("matched:"+e,o)}}}Object(b.a)(v,_.a);var y=o("./packages/ckeditor5-utils/src/keyboard.js");class j extends i.a{static get pluginName(){return"TwoStepCaretMovement"}constructor(e){super(e),this.attributes=new Set,this._overrideUid=null}init(){const e=this.editor,t=e.model,o=e.editing.view,i=e.locale,s=t.document.selection;this.listenTo(o.document,"arrowKey",(e,t)=>{if(!s.isCollapsed)return;if(t.shiftKey||t.altKey||t.ctrlKey)return;const o=t.keyCode==y.f.arrowright,r=t.keyCode==y.f.arrowleft;if(!o&&!r)return;const n=i.contentLanguageDirection;let a=!1;a="ltr"===n&&o||"rtl"===n&&r?this._handleForwardMovement(t):this._handleBackwardMovement(t),!0===a&&e.stop()},{context:"$text",priority:"highest"}),this._isNextGravityRestorationSkipped=!1,this.listenTo(s,"change:range",(e,t)=>{this._isNextGravityRestorationSkipped?this._isNextGravityRestorationSkipped=!1:this._isGravityOverridden&&(!t.directChange&&A(s.getFirstPosition(),this.attributes)||this._restoreGravity())})}registerAttribute(e){this.attributes.add(e)}_handleForwardMovement(e){const t=this.attributes,o=this.editor.model.document.selection,i=o.getFirstPosition();return!this._isGravityOverridden&&((!i.isAtStart||!x(o,t))&&(A(i,t)?(O(e),this._overrideGravity(),!0):void 0))}_handleBackwardMovement(e){const t=this.attributes,o=this.editor.model,i=o.document.selection,s=i.getFirstPosition();return this._isGravityOverridden?(O(e),this._restoreGravity(),P(o,t,s),!0):s.isAtStart?!!x(i,t)&&(O(e),P(o,t,s),!0):function(e,t){return A(e.getShiftedBy(-1),t)}(s,t)?s.isAtEnd&&!x(i,t)&&A(s,t)?(O(e),P(o,t,s),!0):(this._isNextGravityRestorationSkipped=!0,this._overrideGravity(),!1):void 0}get _isGravityOverridden(){return!!this._overrideUid}_overrideGravity(){this._overrideUid=this.editor.model.change(e=>e.overrideSelectionGravity())}_restoreGravity(){this.editor.model.change(e=>{e.restoreSelectionGravity(this._overrideUid),this._overrideUid=null})}}function x(e,t){for(const o of t)if(e.hasAttribute(o))return!0;return!1}function P(e,t,o){const i=o.nodeBefore;e.change(e=>{i?e.setSelectionAttribute(i.getAttributes()):e.removeSelectionAttribute(t)})}function O(e){e.preventDefault()}function A(e,t){const{nodeBefore:o,nodeAfter:i}=e;for(const e of t){const t=o?o.getAttribute(e):void 0;if((i?i.getAttribute(e):void 0)!==t)return!0}return!1}var T=o("./node_modules/lodash-es/toString.js"),C=/[\\^$.*+?()[\]{}|]/g,E=RegExp(C.source);var S=function(e){return(e=Object(T.a)(e))&&E.test(e)?e.replace(C,"\\$&"):e};const R={copyright:{from:"(c)",to:"©"},registeredTrademark:{from:"(r)",to:"®"},trademark:{from:"(tm)",to:"™"},oneHalf:{from:/(^|[^/a-z0-9])(1\/2)([^/a-z0-9])$/i,to:[null,"½",null]},oneThird:{from:/(^|[^/a-z0-9])(1\/3)([^/a-z0-9])$/i,to:[null,"⅓",null]},twoThirds:{from:/(^|[^/a-z0-9])(2\/3)([^/a-z0-9])$/i,to:[null,"⅔",null]},oneForth:{from:/(^|[^/a-z0-9])(1\/4)([^/a-z0-9])$/i,to:[null,"¼",null]},threeQuarters:{from:/(^|[^/a-z0-9])(3\/4)([^/a-z0-9])$/i,to:[null,"¾",null]},lessThanOrEqual:{from:"<=",to:"≤"},greaterThanOrEqual:{from:">=",to:"≥"},notEqual:{from:"!=",to:"≠"},arrowLeft:{from:"<-",to:"←"},arrowRight:{from:"->",to:"→"},horizontalEllipsis:{from:"...",to:"…"},enDash:{from:/(^| )(--)( )$/,to:[null,"–",null]},emDash:{from:/(^| )(---)( )$/,to:[null,"—",null]},quotesPrimary:{from:B('"'),to:[null,"“",null,"”"]},quotesSecondary:{from:B("'"),to:[null,"‘",null,"’"]},quotesPrimaryEnGb:{from:B("'"),to:[null,"‘",null,"’"]},quotesSecondaryEnGb:{from:B('"'),to:[null,"“",null,"”"]},quotesPrimaryPl:{from:B('"'),to:[null,"„",null,"”"]},quotesSecondaryPl:{from:B("'"),to:[null,"‚",null,"’"]}},M={symbols:["copyright","registeredTrademark","trademark"],mathematical:["oneHalf","oneThird","twoThirds","oneForth","threeQuarters","lessThanOrEqual","greaterThanOrEqual","notEqual","arrowLeft","arrowRight"],typography:["horizontalEllipsis","enDash","emDash"],quotes:["quotesPrimary","quotesSecondary"]},N=["symbols","mathematical","typography","quotes"];class I extends i.a{static get requires(){return["Delete","Input"]}static get pluginName(){return"TextTransformation"}constructor(e){super(e),e.config.define("typing",{transformations:{include:N}})}init(){const e=this.editor.model.document.selection;e.on("change:range",()=>{this.isEnabled=!e.anchor.parent.is("element","codeBlock")}),this._enableTransformationWatchers()}_enableTransformationWatchers(){const e=this.editor,t=e.model,o=e.plugins.get("Input"),i=e.plugins.get("Delete"),s=function(e){const t=e.extra||[],o=e.remove||[],i=e=>!o.includes(e);return function(e){const t=new Set;for(const o of e)if(M[o])for(const e of M[o])t.add(e);else t.add(o);return Array.from(t)}(e.include.concat(t).filter(i)).filter(i).map(e=>R[e]||e).map(e=>({from:z(e.from),to:V(e.to)}))}(e.config.get("typing.transformations")),r=new v(e.model,e=>{for(const t of s){if(t.from.test(e))return{normalizedTransformation:t}}});r.on("matched:data",(e,s)=>{if(!o.isInput(s.batch))return;const{from:r,to:n}=s.normalizedTransformation,a=r.exec(s.text),c=n(a.slice(1)),l=s.range;let d=a.index;t.enqueueChange(e=>{for(let o=1;o<a.length;o++){const i=a[o],s=c[o-1];if(null==s){d+=i.length;continue}const r=l.start.getShiftedBy(d),n=t.createRange(r,r.getShiftedBy(i.length)),u=D(r);t.insertContent(e.createText(s,u),n),d+=s.length}t.enqueueChange(()=>{i.requestUndoOnBackspace()})})}),r.bind("isEnabled").to(this)}}function z(e){return"string"==typeof e?new RegExp(`(${S(e)})$`):e}function V(e){return"string"==typeof e?()=>[e]:e instanceof Array?()=>e:e}function D(e){return(e.textNode?e.textNode:e.nodeAfter).getAttributes()}function B(e){return new RegExp(`(^|\\s)(${e})([^${e}]*)(${e})$`)}function F(e,t,o,i){return i.createRange(L(e,t,o,!0,i),L(e,t,o,!1,i))}function L(e,t,o,i,s){let r=e.textNode||(i?e.nodeBefore:e.nodeAfter),n=null;for(;r&&r.getAttribute(t)==o;)n=r,r=i?r.previousSibling:r.nextSibling;return n?s.createPositionAt(n,i?"before":"after"):e}function W(e,t,o,i){const s=e.editing.view,r=new Set;s.document.registerPostFixer(s=>{const n=e.model.document.selection;let a=!1;if(n.hasAttribute(t)){const c=F(n.getFirstPosition(),t,n.getAttribute(t),e.model),l=e.editing.mapper.toViewRange(c);for(const e of l.getItems())e.is("element",o)&&!e.hasClass(i)&&(s.addClass(i,e),r.add(e),a=!0)}return a}),e.conversion.for("editingDowncast").add(e=>{function t(){s.change(e=>{for(const t of r.values())e.removeClass(i,t),r.delete(t)})}e.on("insert",t,{priority:"highest"}),e.on("remove",t,{priority:"highest"}),e.on("attribute",t,{priority:"highest"}),e.on("selection",t,{priority:"highest"})})}},"./src/ui.js":function(e,t,o){"use strict";o.r(t),o.d(t,"clickOutsideHandler",(function(){return i.a})),o.d(t,"injectCssTransitionDisabler",(function(){return s})),o.d(t,"submitHandler",(function(){return r})),o.d(t,"BodyCollection",(function(){return l})),o.d(t,"ButtonView",(function(){return d.a})),o.d(t,"SwitchButtonView",(function(){return u.a})),o.d(t,"getLocalizedColorOptions",(function(){return h})),o.d(t,"normalizeColorOptions",(function(){return p})),o.d(t,"normalizeSingleColorDefinition",(function(){return g})),o.d(t,"ColorGridView",(function(){return w})),o.d(t,"ColorTileView",(function(){return m})),o.d(t,"DropdownButtonView",(function(){return v.a})),o.d(t,"SplitButtonView",(function(){return j})),o.d(t,"createDropdown",(function(){return x.c})),o.d(t,"addToolbarToDropdown",(function(){return x.b})),o.d(t,"addListToDropdown",(function(){return x.a})),o.d(t,"EditorUIView",(function(){return P})),o.d(t,"BoxedEditorUIView",(function(){return T})),o.d(t,"InlineEditableUIView",(function(){return E})),o.d(t,"FormHeaderView",(function(){return S})),o.d(t,"FocusCycler",(function(){return b.a})),o.d(t,"IconView",(function(){return R.a})),o.d(t,"InputTextView",(function(){return M})),o.d(t,"IframeView",(function(){return N})),o.d(t,"LabelView",(function(){return A})),o.d(t,"LabeledFieldView",(function(){return I})),o.d(t,"createLabeledInputText",(function(){return z})),o.d(t,"createLabeledDropdown",(function(){return V})),o.d(t,"ListItemView",(function(){return D.a})),o.d(t,"ListView",(function(){return B.a})),o.d(t,"Notification",(function(){return L})),o.d(t,"Model",(function(){return $})),o.d(t,"BalloonPanelView",(function(){return U.a})),o.d(t,"ContextualBalloon",(function(){return K.a})),o.d(t,"StickyPanelView",(function(){return X})),o.d(t,"TooltipView",(function(){return Z.a})),o.d(t,"Template",(function(){return n.a})),o.d(t,"ToolbarView",(function(){return Q.a})),o.d(t,"ToolbarSeparatorView",(function(){return ee.a})),o.d(t,"enableToolbarKeyboardFocus",(function(){return te})),o.d(t,"normalizeToolbarConfig",(function(){return oe.a})),o.d(t,"BalloonToolbar",(function(){return ce})),o.d(t,"BlockToolbar",(function(){return fe})),o.d(t,"View",(function(){return f.a})),o.d(t,"ViewCollection",(function(){return a.a}));var i=o("./packages/ckeditor5-ui/src/bindings/clickoutsidehandler.js");function s(e){e.set("_isCssTransitionsDisabled",!1),e.disableCssTransitions=()=>{e._isCssTransitionsDisabled=!0},e.enableCssTransitions=()=>{e._isCssTransitionsDisabled=!1},e.extendTemplate({attributes:{class:[e.bindTemplate.if("_isCssTransitionsDisabled","ck-transitions-disabled")]}})}function r({view:e}){e.listenTo(e.element,"submit",(t,o)=>{o.preventDefault(),e.fire("submit")},{useCapture:!0})}var n=o("./packages/ckeditor5-ui/src/template.js"),a=o("./packages/ckeditor5-ui/src/viewcollection.js"),c=o("./packages/ckeditor5-utils/src/dom/createelement.js");class l extends a.a{constructor(e,t=[]){super(t),this.locale=e}attachToDom(){this._bodyCollectionContainer=new n.a({tag:"div",attributes:{class:["ck","ck-reset_all","ck-body","ck-rounded-corners"],dir:this.locale.uiLanguageDirection},children:this}).render();let e=document.querySelector(".ck-body-wrapper");e||(e=Object(c.a)(document,"div",{class:"ck-body-wrapper"}),document.body.appendChild(e)),e.appendChild(this._bodyCollectionContainer)}detachFromDom(){super.destroy(),this._bodyCollectionContainer&&this._bodyCollectionContainer.remove();const e=document.querySelector(".ck-body-wrapper");e&&0==e.childElementCount&&e.remove()}}var d=o("./packages/ckeditor5-ui/src/button/buttonview.js"),u=o("./packages/ckeditor5-ui/src/button/switchbuttonview.js");function h(e,t){const o=e.t,i={Black:o("Black"),"Dim grey":o("Dim grey"),Grey:o("Grey"),"Light grey":o("Light grey"),White:o("White"),Red:o("Red"),Orange:o("Orange"),Yellow:o("Yellow"),"Light green":o("Light green"),Green:o("Green"),Aquamarine:o("Aquamarine"),Turquoise:o("Turquoise"),"Light blue":o("Light blue"),Blue:o("Blue"),Purple:o("Purple")};return t.map(e=>{const t=i[e.label];return t&&t!=e.label&&(e.label=t),e})}function p(e){return e.map(g).filter(e=>!!e)}function g(e){return"string"==typeof e?{model:e,label:e,hasBorder:!1,view:{name:"span",styles:{color:e}}}:{model:e.color,label:e.label||e.color,hasBorder:void 0!==e.hasBorder&&e.hasBorder,view:{name:"span",styles:{color:""+e.color}}}}var f=o("./packages/ckeditor5-ui/src/view.js");class m extends d.a{constructor(e){super(e);const t=this.bindTemplate;this.set("color"),this.set("hasBorder"),this.icon='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path class="ck-icon__fill" d="M16.935 5.328a2 2 0 0 1 0 2.829l-7.778 7.778a2 2 0 0 1-2.829 0L3.5 13.107a1.999 1.999 0 1 1 2.828-2.829l.707.707a1 1 0 0 0 1.414 0l5.658-5.657a2 2 0 0 1 2.828 0z"/><path d="M14.814 6.035 8.448 12.4a1 1 0 0 1-1.414 0l-1.413-1.415A1 1 0 1 0 4.207 12.4l2.829 2.829a1 1 0 0 0 1.414 0l7.778-7.778a1 1 0 1 0-1.414-1.415z"/></svg>',this.extendTemplate({attributes:{style:{backgroundColor:t.to("color")},class:["ck","ck-color-grid__tile",t.if("hasBorder","ck-color-table__color-tile_bordered")]}})}render(){super.render(),this.iconView.fillColor="hsl(0, 0%, 100%)"}}var k=o("./packages/ckeditor5-utils/src/focustracker.js"),b=o("./packages/ckeditor5-ui/src/focuscycler.js"),_=o("./packages/ckeditor5-utils/src/keystrokehandler.js");o("./packages/ckeditor5-ui/theme/components/colorgrid/colorgrid.css");class w extends f.a{constructor(e,t){super(e);const o=t&&t.colorDefinitions||[],i={};t&&t.columns&&(i.gridTemplateColumns=`repeat( ${t.columns}, 1fr)`),this.set("selectedColor"),this.items=this.createCollection(),this.focusTracker=new k.a,this.keystrokes=new _.a,this._focusCycler=new b.a({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowleft",focusNext:"arrowright"}}),this.items.on("add",(e,t)=>{t.isOn=t.color===this.selectedColor}),o.forEach(e=>{const t=new m;t.set({color:e.color,label:e.label,tooltip:!0,hasBorder:e.options.hasBorder}),t.on("execute",()=>{this.fire("execute",{value:e.color,hasBorder:e.options.hasBorder,label:e.label})}),this.items.add(t)}),this.setTemplate({tag:"div",children:this.items,attributes:{class:["ck","ck-color-grid"],style:i}}),this.on("change:selectedColor",(e,t,o)=>{for(const e of this.items)e.isOn=e.color===o})}focus(){this.items.length&&this.items.first.focus()}focusLast(){this.items.length&&this.items.last.focus()}render(){super.render();for(const e of this.items)this.focusTracker.add(e.element);this.items.on("add",(e,t)=>{this.focusTracker.add(t.element)}),this.items.on("remove",(e,t)=>{this.focusTracker.remove(t.element)}),this.keystrokes.listenTo(this.element)}}var v=o("./packages/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js"),y=o("./packages/ckeditor5-ui/theme/icons/dropdown-arrow.svg");o("./packages/ckeditor5-ui/theme/components/dropdown/splitbutton.css");class j extends f.a{constructor(e){super(e);const t=this.bindTemplate;this.set("class"),this.set("icon"),this.set("isEnabled",!0),this.set("isOn",!1),this.set("isToggleable",!1),this.set("isVisible",!0),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.children=this.createCollection(),this.actionView=this._createActionView(),this.arrowView=this._createArrowView(),this.keystrokes=new _.a,this.focusTracker=new k.a,this.setTemplate({tag:"div",attributes:{class:["ck","ck-splitbutton",t.to("class"),t.if("isVisible","ck-hidden",e=>!e),this.arrowView.bindTemplate.if("isOn","ck-splitbutton_open")]},children:this.children})}render(){super.render(),this.children.add(this.actionView),this.children.add(this.arrowView),this.focusTracker.add(this.actionView.element),this.focusTracker.add(this.arrowView.element),this.keystrokes.listenTo(this.element),this.keystrokes.set("arrowright",(e,t)=>{this.focusTracker.focusedElement===this.actionView.element&&(this.arrowView.focus(),t())}),this.keystrokes.set("arrowleft",(e,t)=>{this.focusTracker.focusedElement===this.arrowView.element&&(this.actionView.focus(),t())})}focus(){this.actionView.focus()}_createActionView(){const e=new d.a;return e.bind("icon","isEnabled","isOn","isToggleable","keystroke","label","tabindex","tooltip","tooltipPosition","type","withText").to(this),e.extendTemplate({attributes:{class:"ck-splitbutton__action"}}),e.delegate("execute").to(this),e}_createArrowView(){const e=new d.a,t=e.bindTemplate;return e.icon=y.a,e.extendTemplate({attributes:{class:"ck-splitbutton__arrow","aria-haspopup":!0,"aria-expanded":t.to("isOn",e=>String(e))}}),e.bind("isEnabled").to(this),e.delegate("execute").to(this,"open"),e}}var x=o("./packages/ckeditor5-ui/src/dropdown/utils.js");o("./packages/ckeditor5-ui/theme/components/editorui/editorui.css");class P extends f.a{constructor(e){super(e),this.body=new l(e)}render(){super.render(),this.body.attachToDom()}destroy(){return this.body.detachFromDom(),super.destroy()}}var O=o("./packages/ckeditor5-utils/src/uid.js");o("./packages/ckeditor5-ui/theme/components/label/label.css");class A extends f.a{constructor(e){super(e),this.set("text"),this.set("for"),this.id="ck-editor__label_"+Object(O.a)();const t=this.bindTemplate;this.setTemplate({tag:"label",attributes:{class:["ck","ck-label"],id:this.id,for:t.to("for")},children:[{text:t.to("text")}]})}}class T extends P{constructor(e){super(e),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:e.uiLanguageDirection,lang:e.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 e=this.t,t=new A;return t.text=e("Rich Text Editor"),t.extendTemplate({attributes:{class:"ck-voice-label"}}),t}}class C extends f.a{constructor(e,t,o){super(e),this.setTemplate({tag:"div",attributes:{class:["ck","ck-content","ck-editor__editable","ck-rounded-corners"],lang:e.contentLanguage,dir:e.contentLanguageDirection}}),this.name=null,this.set("isFocused",!1),this._editableElement=o,this._hasExternalElement=!!this._editableElement,this._editingView=t}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 e=this._editingView;function t(t){e.change(o=>{const i=e.document.getRoot(t.name);o.addClass(t.isFocused?"ck-focused":"ck-blurred",i),o.removeClass(t.isFocused?"ck-blurred":"ck-focused",i)})}e.isRenderingInProgress?function o(i){e.once("change:isRenderingInProgress",(e,s,r)=>{r?o(i):t(i)})}(this):t(this)}}class E extends C{constructor(e,t,o){super(e,t,o),this.extendTemplate({attributes:{role:"textbox",class:"ck-editor__editable_inline"}})}render(){super.render();const e=this._editingView,t=this.t;e.change(o=>{const i=e.document.getRoot(this.name);o.setAttribute("aria-label",t("Rich Text Editor, %0",this.name),i)})}}o("./packages/ckeditor5-ui/theme/components/formheader/formheader.css");class S extends f.a{constructor(e,t={}){super(e);const o=this.bindTemplate;this.set("label",t.label||""),this.set("class",t.class||null),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__header",o.to("class")]},children:this.children});const i=new f.a(e);i.setTemplate({tag:"span",attributes:{class:["ck","ck-form__header__label"]},children:[{text:o.to("label")}]}),this.children.add(i)}}var R=o("./packages/ckeditor5-ui/src/icon/iconview.js");o("./packages/ckeditor5-ui/theme/components/inputtext/inputtext.css");class M extends f.a{constructor(e){super(e),this.set("value"),this.set("id"),this.set("placeholder"),this.set("isReadOnly",!1),this.set("hasError",!1),this.set("ariaDescribedById"),this.focusTracker=new k.a,this.bind("isFocused").to(this.focusTracker),this.set("isEmpty",!0);const t=this.bindTemplate;this.setTemplate({tag:"input",attributes:{type:"text",class:["ck","ck-input","ck-input-text",t.if("isFocused","ck-input_focused"),t.if("isEmpty","ck-input-text_empty"),t.if("hasError","ck-error")],id:t.to("id"),placeholder:t.to("placeholder"),readonly:t.to("isReadOnly"),"aria-invalid":t.if("hasError",!0),"aria-describedby":t.to("ariaDescribedById")},on:{input:t.to((...e)=>{this.fire("input",...e),this._updateIsEmpty()}),change:t.to(this._updateIsEmpty.bind(this))}})}render(){super.render(),this.focusTracker.add(this.element),this._setDomElementValue(this.value),this._updateIsEmpty(),this.on("change:value",(e,t,o)=>{this._setDomElementValue(o),this._updateIsEmpty()})}select(){this.element.select()}focus(){this.element.focus()}_updateIsEmpty(){this.isEmpty=!this.element.value}_setDomElementValue(e){this.element.value=e||0===e?e:""}}class N extends f.a{constructor(e){super(e);const t=this.bindTemplate;this.setTemplate({tag:"iframe",attributes:{class:["ck","ck-reset_all"],sandbox:"allow-same-origin allow-scripts"},on:{load:t.to("loaded")}})}render(){return new Promise(e=>{this.on("loaded",e),super.render()})}}o("./packages/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css");class I extends f.a{constructor(e,t){super(e);const o="ck-labeled-field-view-"+Object(O.a)(),i="ck-labeled-field-view-status-"+Object(O.a)();this.fieldView=t(this,o,i),this.set("label"),this.set("isEnabled",!0),this.set("isEmpty",!0),this.set("isFocused",!1),this.set("errorText",null),this.set("infoText",null),this.set("class"),this.set("placeholder"),this.labelView=this._createLabelView(o),this.statusView=this._createStatusView(i),this.bind("_statusText").to(this,"errorText",this,"infoText",(e,t)=>e||t);const s=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view",s.to("class"),s.if("isEnabled","ck-disabled",e=>!e),s.if("isEmpty","ck-labeled-field-view_empty"),s.if("isFocused","ck-labeled-field-view_focused"),s.if("placeholder","ck-labeled-field-view_placeholder"),s.if("errorText","ck-error")]},children:[{tag:"div",attributes:{class:["ck","ck-labeled-field-view__input-wrapper"]},children:[this.fieldView,this.labelView]},this.statusView]})}_createLabelView(e){const t=new A(this.locale);return t.for=e,t.bind("text").to(this,"label"),t}_createStatusView(e){const t=new f.a(this.locale),o=this.bindTemplate;return t.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view__status",o.if("errorText","ck-labeled-field-view__status_error"),o.if("_statusText","ck-hidden",e=>!e)],id:e,role:o.if("errorText","alert")},children:[{text:o.to("_statusText")}]}),t}focus(){this.fieldView.focus()}}function z(e,t,o){const i=new M(e.locale);return i.set({id:t,ariaDescribedById:o}),i.bind("isReadOnly").to(e,"isEnabled",e=>!e),i.bind("hasError").to(e,"errorText",e=>!!e),i.on("input",()=>{e.errorText=null}),e.bind("isEmpty","isFocused","placeholder").to(i),i}function V(e,t,o){const i=Object(x.c)(e.locale);return i.set({id:t,ariaDescribedById:o}),i.bind("isEnabled").to(e),i}var D=o("./packages/ckeditor5-ui/src/list/listitemview.js"),B=o("./packages/ckeditor5-ui/src/list/listview.js"),F=o("./packages/ckeditor5-core/src/contextplugin.js");class L extends F.a{static get pluginName(){return"Notification"}init(){this.on("show:warning",(e,t)=>{window.alert(t.message)},{priority:"lowest"})}showSuccess(e,t={}){this._showNotification({message:e,type:"success",namespace:t.namespace,title:t.title})}showInfo(e,t={}){this._showNotification({message:e,type:"info",namespace:t.namespace,title:t.title})}showWarning(e,t={}){this._showNotification({message:e,type:"warning",namespace:t.namespace,title:t.title})}_showNotification(e){const t="show:"+e.type+(e.namespace?":"+e.namespace:"");this.fire(t,{message:e.message,type:e.type,title:e.title||""})}}var W=o("./packages/ckeditor5-utils/src/mix.js"),H=o("./packages/ckeditor5-utils/src/observablemixin.js"),q=o("./node_modules/lodash-es/assignIn.js");class ${constructor(e,t){t&&Object(q.a)(this,t),e&&this.set(e)}}Object(W.a)($,H.a);var U=o("./packages/ckeditor5-ui/src/panel/balloon/balloonpanelview.js"),K=o("./packages/ckeditor5-ui/src/panel/balloon/contextualballoon.js"),G=o("./packages/ckeditor5-utils/src/dom/global.js"),J=o("./packages/ckeditor5-utils/src/dom/tounit.js");o("./packages/ckeditor5-ui/theme/components/panel/stickypanel.css");const Y=Object(J.a)("px");class X extends f.a{constructor(e){super(e);const t=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 n.a({tag:"div",attributes:{class:["ck","ck-sticky-panel__placeholder"],style:{display:t.to("isSticky",e=>e?"block":"none"),height:t.to("isSticky",e=>e?Y(this._panelRect.height):null)}}}).render(),this._contentPanel=new n.a({tag:"div",attributes:{class:["ck","ck-sticky-panel__content",t.if("isSticky","ck-sticky-panel__content_sticky"),t.if("_isStickyToTheLimiter","ck-sticky-panel__content_sticky_bottom-limit")],style:{width:t.to("isSticky",e=>e?Y(this._contentPanelPlaceholder.getBoundingClientRect().width):null),top:t.to("_hasViewportTopOffset",e=>e?Y(this.viewportTopOffset):null),bottom:t.to("_isStickyToTheLimiter",e=>e?Y(this.limiterBottomOffset):null),marginLeft:t.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(G.a.window,"scroll",()=>{this._checkIfShouldBeSticky()}),this.listenTo(this,"change:isActive",()=>{this._checkIfShouldBeSticky()})}_checkIfShouldBeSticky(){const e=this._panelRect=this._contentPanel.getBoundingClientRect();let t;this.limiterElement?(t=this._limiterRect=this.limiterElement.getBoundingClientRect(),this.isSticky=this.isActive&&t.top<this.viewportTopOffset&&this._panelRect.height+this.limiterBottomOffset<t.height):this.isSticky=!1,this.isSticky?(this._isStickyToTheLimiter=t.bottom<e.height+this.limiterBottomOffset+this.viewportTopOffset,this._hasViewportTopOffset=!this._isStickyToTheLimiter&&!!this.viewportTopOffset,this._marginLeft=this._isStickyToTheLimiter?null:Y(-G.a.window.scrollX)):(this._isStickyToTheLimiter=!1,this._hasViewportTopOffset=!1,this._marginLeft=null)}}var Z=o("./packages/ckeditor5-ui/src/tooltip/tooltipview.js"),Q=o("./packages/ckeditor5-ui/src/toolbar/toolbarview.js"),ee=o("./packages/ckeditor5-ui/src/toolbar/toolbarseparatorview.js");function te({origin:e,originKeystrokeHandler:t,originFocusTracker:o,toolbar:i,beforeFocus:s,afterBlur:r}){o.add(i.element),t.set("Alt+F10",(e,t)=>{o.isFocused&&!i.focusTracker.isFocused&&(s&&s(),i.focus(),t())}),i.keystrokes.set("Esc",(t,o)=>{i.focusTracker.isFocused&&(e.focus(),r&&r(),o())})}var oe=o("./packages/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.js"),ie=o("./packages/ckeditor5-core/src/plugin.js"),se=o("./packages/ckeditor5-utils/src/dom/rect.js"),re=o("./node_modules/lodash-es/debounce.js"),ne=o("./packages/ckeditor5-utils/src/dom/resizeobserver.js");const ae=Object(J.a)("px");class ce extends ie.a{static get pluginName(){return"BalloonToolbar"}static get requires(){return[K.a]}constructor(e){super(e),this._balloonConfig=Object(oe.a)(e.config.get("balloonToolbar")),this.toolbarView=this._createToolbarView(),this.focusTracker=new k.a,e.ui.once("ready",()=>{this.focusTracker.add(e.ui.getEditableElement()),this.focusTracker.add(this.toolbarView.element)}),this._resizeObserver=null,this._balloon=e.plugins.get(K.a),this._fireSelectionChangeDebounced=Object(re.a)(()=>this.fire("_selectionChangeDebounced"),200),this.decorate("show")}init(){const e=this.editor,t=e.model.document.selection;this.listenTo(this.focusTracker,"change:isFocused",(e,t,o)=>{const i=this._balloon.visibleView===this.toolbarView;!o&&i?this.hide():o&&this.show()}),this.listenTo(t,"change:range",(e,o)=>{(o.directChange||t.isCollapsed)&&this.hide(),this._fireSelectionChangeDebounced()}),this.listenTo(this,"_selectionChangeDebounced",()=>{this.editor.editing.view.document.isFocused&&this.show()}),this._balloonConfig.shouldNotGroupWhenFull||this.listenTo(e,"ready",()=>{const t=e.ui.view.editable.element;this._resizeObserver=new ne.a(t,()=>{this.toolbarView.maxWidth=ae(.9*new se.a(t).width)})}),this.listenTo(this.toolbarView,"groupedItemsUpdate",()=>{this._updatePosition()})}afterInit(){const e=this.editor.ui.componentFactory;this.toolbarView.fillFromConfig(this._balloonConfig,e)}_createToolbarView(){const e=!this._balloonConfig.shouldNotGroupWhenFull,t=new Q.a(this.editor.locale,{shouldGroupWhenFull:e,isFloating:!0});return t.render(),t}show(){const e=this.editor,t=e.model.document.selection,o=e.model.schema;this._balloon.hasView(this.toolbarView)||t.isCollapsed||function(e,t){if(1===e.rangeCount)return!1;return[...e.getRanges()].every(e=>{const o=e.getContainedElement();return o&&t.isSelectable(o)})}(t,o)||Array.from(this.toolbarView.items).every(e=>void 0!==e.isEnabled&&!e.isEnabled)||(this.listenTo(this.editor.ui,"update",()=>{this._updatePosition()}),this._balloon.add({view:this.toolbarView,position:this._getBalloonPositionData(),balloonClassName:"ck-toolbar-container"}))}hide(){this._balloon.hasView(this.toolbarView)&&(this.stopListening(this.editor.ui,"update"),this._balloon.remove(this.toolbarView))}_getBalloonPositionData(){const e=this.editor.editing.view,t=e.document,o=t.selection,i=t.selection.isBackward;return{target:()=>{const t=i?o.getFirstRange():o.getLastRange(),s=se.a.getDomRangeRects(e.domConverter.viewRangeToDom(t));return i?s[0]:(s.length>1&&0===s[s.length-1].width&&s.pop(),s[s.length-1])},positions:le(i)}}_updatePosition(){this._balloon.updatePosition(this._getBalloonPositionData())}destroy(){super.destroy(),this.stopListening(),this._fireSelectionChangeDebounced.cancel(),this.toolbarView.destroy(),this.focusTracker.destroy(),this._resizeObserver&&this._resizeObserver.destroy()}}function le(e){const t=U.a.defaultPositions;return e?[t.northWestArrowSouth,t.northWestArrowSouthWest,t.northWestArrowSouthEast,t.northWestArrowSouthMiddleEast,t.northWestArrowSouthMiddleWest,t.southWestArrowNorth,t.southWestArrowNorthWest,t.southWestArrowNorthEast,t.southWestArrowNorthMiddleWest,t.southWestArrowNorthMiddleEast]:[t.southEastArrowNorth,t.southEastArrowNorthEast,t.southEastArrowNorthWest,t.southEastArrowNorthMiddleEast,t.southEastArrowNorthMiddleWest,t.northEastArrowSouth,t.northEastArrowSouthEast,t.northEastArrowSouthWest,t.northEastArrowSouthMiddleEast,t.northEastArrowSouthMiddleWest]}var de=o("./packages/ckeditor5-core/theme/icons/pilcrow.svg");o("./packages/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css");const ue=Object(J.a)("px");class he extends d.a{constructor(e){super(e);const t=this.bindTemplate;this.isVisible=!1,this.isToggleable=!0,this.set("top",0),this.set("left",0),this.extendTemplate({attributes:{class:"ck-block-toolbar-button",style:{top:t.to("top",e=>ue(e)),left:t.to("left",e=>ue(e))}}})}}var pe=o("./packages/ckeditor5-utils/src/dom/position.js");const ge=Object(J.a)("px");class fe extends ie.a{static get pluginName(){return"BlockToolbar"}constructor(e){super(e),this._blockToolbarConfig=Object(oe.a)(this.editor.config.get("blockToolbar")),this.toolbarView=this._createToolbarView(),this.panelView=this._createPanelView(),this.buttonView=this._createButtonView(),this._resizeObserver=null,Object(i.a)({emitter:this.panelView,contextElements:[this.panelView.element,this.buttonView.element],activator:()=>this.panelView.isVisible,callback:()=>this._hidePanel()})}init(){const e=this.editor;this.listenTo(e.model.document.selection,"change:range",(e,t)=>{t.directChange&&this._hidePanel()}),this.listenTo(e.ui,"update",()=>this._updateButton()),this.listenTo(e,"change:isReadOnly",()=>this._updateButton(),{priority:"low"}),this.listenTo(e.ui.focusTracker,"change:isFocused",()=>this._updateButton()),this.listenTo(this.buttonView,"change:isVisible",(e,t,o)=>{o?this.buttonView.listenTo(window,"resize",()=>this._updateButton()):(this.buttonView.stopListening(window,"resize"),this._hidePanel())})}afterInit(){const e=this.editor.ui.componentFactory,t=this._blockToolbarConfig;this.toolbarView.fillFromConfig(t,e);for(const e of this.toolbarView.items)e.on("execute",()=>this._hidePanel(!0),{priority:"high"});t.shouldNotGroupWhenFull||this.listenTo(this.editor,"ready",()=>{const e=this.editor.ui.view.editable.element;this._resizeObserver=new ne.a(e,()=>{this.toolbarView.maxWidth=this._getToolbarMaxWidth()})})}destroy(){super.destroy(),this.panelView.destroy(),this.buttonView.destroy(),this.toolbarView.destroy(),this._resizeObserver&&this._resizeObserver.destroy()}_createToolbarView(){const e=!this._blockToolbarConfig.shouldNotGroupWhenFull,t=new Q.a(this.editor.locale,{shouldGroupWhenFull:e,isFloating:!0});return t.focusTracker.on("change:isFocused",(e,t,o)=>{o||this._hidePanel()}),t}_createPanelView(){const e=this.editor,t=new U.a(e.locale);return t.content.add(this.toolbarView),t.class="ck-toolbar-container",e.ui.view.body.add(t),e.ui.focusTracker.add(t.element),this.toolbarView.keystrokes.set("Esc",(e,t)=>{this._hidePanel(!0),t()}),t}_createButtonView(){const e=this.editor,t=e.t,o=new he(e.locale);return o.set({label:t("Edit block"),icon:de.a,withText:!1}),o.bind("isOn").to(this.panelView,"isVisible"),o.bind("tooltip").to(this.panelView,"isVisible",e=>!e),this.listenTo(o,"execute",()=>{this.panelView.isVisible?this._hidePanel(!0):this._showPanel()}),e.ui.view.body.add(o),e.ui.focusTracker.add(o.element),o}_updateButton(){const e=this.editor,t=e.model,o=e.editing.view;if(!e.ui.focusTracker.isFocused)return void this._hideButton();if(e.isReadOnly)return void this._hideButton();const i=Array.from(t.document.selection.getSelectedBlocks())[0];if(!i||Array.from(this.toolbarView.items).every(e=>!e.isEnabled))return void this._hideButton();const s=o.domConverter.mapViewToDom(e.editing.mapper.toViewElement(i));this.buttonView.isVisible=!0,this._attachButtonToElement(s),this.panelView.isVisible&&this._showPanel()}_hideButton(){this.buttonView.isVisible=!1}_showPanel(){const e=this.panelView.isVisible;this.panelView.show(),this.toolbarView.maxWidth=this._getToolbarMaxWidth(),this.panelView.pin({target:this.buttonView.element,limiter:this.editor.ui.getEditableElement()}),e||this.toolbarView.items.get(0).focus()}_hidePanel(e){this.panelView.isVisible=!1,e&&this.editor.editing.view.focus()}_attachButtonToElement(e){const t=window.getComputedStyle(e),o=new se.a(this.editor.ui.getEditableElement()),i=parseInt(t.paddingTop,10),s=parseInt(t.lineHeight,10)||1.2*parseInt(t.fontSize,10),r=Object(pe.a)({element:this.buttonView.element,target:e,positions:[(e,t)=>{let r;return r="ltr"===this.editor.locale.uiLanguageDirection?o.left-t.width:o.right,{top:e.top+i+(s-t.height)/2,left:r}}]});this.buttonView.top=r.top,this.buttonView.left=r.left}_getToolbarMaxWidth(){const e=this.editor.ui.view.editable.element,t=new se.a(e),o=new se.a(this.buttonView.element),i="rtl"===this.editor.locale.uiLanguageDirection?o.left-t.right+o.width:t.left-o.left;return ge(t.width+i)}}},"./src/undo.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Undo",(function(){return m})),o.d(t,"UndoEditing",(function(){return u})),o.d(t,"UndoUi",(function(){return f}));var i=o("./packages/ckeditor5-core/src/plugin.js"),s=o("./packages/ckeditor5-core/src/command.js"),r=o("./packages/ckeditor5-engine/src/model/operation/transform.js");class n extends s.a{constructor(e){super(e),this._stack=[],this._createdBatches=new WeakSet,this.refresh(),this.listenTo(e.data,"set",(e,t)=>{t[1]={...t[1]};const o=t[1];o.batchType||(o.batchType="transparent")},{priority:"high"}),this.listenTo(e.data,"set",(e,t)=>{"transparent"===t[1].batchType&&this.clearStack()})}refresh(){this.isEnabled=this._stack.length>0}addBatch(e){const t=this.editor.model.document.selection,o={ranges:t.hasOwnRange?Array.from(t.getRanges()):[],isBackward:t.isBackward};this._stack.push({batch:e,selection:o}),this.refresh()}clearStack(){this._stack=[],this.refresh()}_restoreSelection(e,t,o){const i=this.editor.model,s=i.document,r=[],n=e.map(e=>e.getTransformedByOperations(o)),l=n.flat();for(const e of n){const t=e.filter(e=>e.root!=s.graveyard).filter(e=>!c(e,l));t.length&&(a(t),r.push(t[0]))}r.length&&i.change(e=>{e.setSelection(r,{backward:t})})}_undo(e,t){const o=this.editor.model,i=o.document;this._createdBatches.add(t);const s=e.operations.slice().filter(e=>e.isDocumentOperation);s.reverse();for(const e of s){const s=e.baseVersion+1,n=Array.from(i.history.getOperations(s)),a=Object(r.a)([e.getReversed()],n,{useRelations:!0,document:this.editor.model.document,padWithNoOps:!1,forceWeakRemove:!0}).operationsA;for(const s of a)t.addOperation(s),o.applyOperation(s),i.history.setOperationAsUndone(e,s)}}}function a(e){e.sort((e,t)=>e.start.isBefore(t.start)?-1:1);for(let t=1;t<e.length;t++){const o=e[t-1].getJoined(e[t],!0);o&&(t--,e.splice(t,2,o))}}function c(e,t){return t.some(t=>t!==e&&t.containsRange(e,!0))}class l extends n{execute(e=null){const t=e?this._stack.findIndex(t=>t.batch==e):this._stack.length-1,o=this._stack.splice(t,1)[0],i=this.editor.model.createBatch("transparent");this.editor.model.enqueueChange(i,()=>{this._undo(o.batch,i);const e=this.editor.model.document.history.getOperations(o.batch.baseVersion);this._restoreSelection(o.selection.ranges,o.selection.isBackward,e),this.fire("revert",o.batch,i)}),this.refresh()}}class d extends n{execute(){const e=this._stack.pop(),t=this.editor.model.createBatch("transparent");this.editor.model.enqueueChange(t,()=>{const o=e.batch.operations[e.batch.operations.length-1].baseVersion+1,i=this.editor.model.document.history.getOperations(o);this._restoreSelection(e.selection.ranges,e.selection.isBackward,i),this._undo(e.batch,t)}),this.refresh()}}class u extends i.a{static get pluginName(){return"UndoEditing"}constructor(e){super(e),this._batchRegistry=new WeakSet}init(){const e=this.editor;this._undoCommand=new l(e),this._redoCommand=new d(e),e.commands.add("undo",this._undoCommand),e.commands.add("redo",this._redoCommand),this.listenTo(e.model,"applyOperation",(e,t)=>{const o=t[0];if(!o.isDocumentOperation)return;const i=o.batch,s=this._redoCommand._createdBatches.has(i),r=this._undoCommand._createdBatches.has(i);this._batchRegistry.has(i)||"transparent"==i.type&&!s&&!r||(s?this._undoCommand.addBatch(i):r||(this._undoCommand.addBatch(i),this._redoCommand.clearStack()),this._batchRegistry.add(i))},{priority:"highest"}),this.listenTo(this._undoCommand,"revert",(e,t,o)=>{this._redoCommand.addBatch(o)}),e.keystrokes.set("CTRL+Z","undo"),e.keystrokes.set("CTRL+Y","redo"),e.keystrokes.set("CTRL+SHIFT+Z","redo")}}var h=o("./packages/ckeditor5-ui/src/button/buttonview.js"),p='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m5.042 9.367 2.189 1.837a.75.75 0 0 1-.965 1.149l-3.788-3.18a.747.747 0 0 1-.21-.284.75.75 0 0 1 .17-.945L6.23 4.762a.75.75 0 1 1 .964 1.15L4.863 7.866h8.917A.75.75 0 0 1 14 7.9a4 4 0 1 1-1.477 7.718l.344-1.489a2.5 2.5 0 1 0 1.094-4.73l.008-.032H5.042z"/></svg>',g='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m14.958 9.367-2.189 1.837a.75.75 0 0 0 .965 1.149l3.788-3.18a.747.747 0 0 0 .21-.284.75.75 0 0 0-.17-.945L13.77 4.762a.75.75 0 1 0-.964 1.15l2.331 1.955H6.22A.75.75 0 0 0 6 7.9a4 4 0 1 0 1.477 7.718l-.344-1.489A2.5 2.5 0 1 1 6.039 9.4l-.008-.032h8.927z"/></svg>';class f extends i.a{static get pluginName(){return"UndoUI"}init(){const e=this.editor,t=e.locale,o=e.t,i="ltr"==t.uiLanguageDirection?p:g,s="ltr"==t.uiLanguageDirection?g:p;this._addButton("undo",o("Undo"),"CTRL+Z",i),this._addButton("redo",o("Redo"),"CTRL+Y",s)}_addButton(e,t,o,i){const s=this.editor;s.ui.componentFactory.add(e,r=>{const n=s.commands.get(e),a=new h.a(r);return a.set({label:t,icon:i,keystroke:o,tooltip:!0}),a.bind("isEnabled").to(n,"isEnabled"),this.listenTo(a,"execute",()=>{s.execute(e),s.editing.view.focus()}),a})}}class m extends i.a{static get requires(){return[u,f]}static get pluginName(){return"Undo"}}},"./src/upload.js":function(e,t,o){"use strict";o.r(t),o.d(t,"FileRepository",(function(){return u})),o.d(t,"FileDialogButtonView",(function(){return f})),o.d(t,"Base64UploadAdapter",(function(){return k})),o.d(t,"SimpleUploadAdapter",(function(){return _}));var i=o("./packages/ckeditor5-core/src/plugin.js"),s=o("./packages/ckeditor5-core/src/pendingactions.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-utils/src/observablemixin.js"),a=o("./packages/ckeditor5-utils/src/collection.js"),c=o("./packages/ckeditor5-utils/src/mix.js");class l{constructor(){const e=new window.FileReader;this._reader=e,this._data=void 0,this.set("loaded",0),e.onprogress=e=>{this.loaded=e.loaded}}get error(){return this._reader.error}get data(){return this._data}read(e){const t=this._reader;return this.total=e.size,new Promise((o,i)=>{t.onload=()=>{const e=t.result;this._data=e,o(e)},t.onerror=()=>{i("error")},t.onabort=()=>{i("aborted")},this._reader.readAsDataURL(e)})}abort(){this._reader.abort()}}Object(c.a)(l,n.a);var d=o("./packages/ckeditor5-utils/src/uid.js");class u extends i.a{static get pluginName(){return"FileRepository"}static get requires(){return[s.a]}init(){this.loaders=new a.a,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",(e,t)=>t?e/t*100:0)}getLoader(e){return this._loadersMap.get(e)||null}createLoader(e){if(!this.createUploadAdapter)return Object(r.c)("filerepository-no-upload-adapter"),null;const t=new h(Promise.resolve(e),this.createUploadAdapter);return this.loaders.add(t),this._loadersMap.set(e,t),e instanceof Promise&&t.file.then(e=>{this._loadersMap.set(e,t)}).catch(()=>{}),t.on("change:uploaded",()=>{let e=0;for(const t of this.loaders)e+=t.uploaded;this.uploaded=e}),t.on("change:uploadTotal",()=>{let e=0;for(const t of this.loaders)t.uploadTotal&&(e+=t.uploadTotal);this.uploadTotal=e}),t}destroyLoader(e){const t=e instanceof h?e:this.getLoader(e);t._destroy(),this.loaders.remove(t),this._loadersMap.forEach((e,o)=>{e===t&&this._loadersMap.delete(o)})}_updatePendingAction(){const e=this.editor.plugins.get(s.a);if(this.loaders.length){if(!this._pendingAction){const t=this.editor.t,o=e=>`${t("Upload in progress")} ${parseInt(e)}%.`;this._pendingAction=e.add(o(this.uploadedPercent)),this._pendingAction.bind("message").to(this,"uploadedPercent",o)}}else e.remove(this._pendingAction),this._pendingAction=null}}Object(c.a)(u,n.a);class h{constructor(e,t){this.id=Object(d.a)(),this._filePromiseWrapper=this._createFilePromiseWrapper(e),this._adapter=t(this),this._reader=new l,this.set("status","idle"),this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",(e,t)=>t?e/t*100:0),this.set("uploadResponse",null)}get file(){return this._filePromiseWrapper?this._filePromiseWrapper.promise.then(e=>this._filePromiseWrapper?e:null):Promise.resolve(null)}get data(){return this._reader.data}read(){if("idle"!=this.status)throw new r.a("filerepository-read-wrong-status",this);return this.status="reading",this.file.then(e=>this._reader.read(e)).then(e=>{if("reading"!==this.status)throw this.status;return this.status="idle",e}).catch(e=>{if("aborted"===e)throw this.status="aborted","aborted";throw this.status="error",this._reader.error?this._reader.error:e})}upload(){if("idle"!=this.status)throw new r.a("filerepository-upload-wrong-status",this);return this.status="uploading",this.file.then(()=>this._adapter.upload()).then(e=>(this.uploadResponse=e,this.status="idle",e)).catch(e=>{if("aborted"===this.status)throw"aborted";throw this.status="error",e})}abort(){const e=this.status;this.status="aborted",this._filePromiseWrapper.isFulfilled?"reading"==e?this._reader.abort():"uploading"==e&&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(e){const t={};return t.promise=new Promise((o,i)=>{t.rejecter=i,t.isFulfilled=!1,e.then(e=>{t.isFulfilled=!0,o(e)}).catch(e=>{t.isFulfilled=!0,i(e)})}),t}}Object(c.a)(h,n.a);var p=o("./packages/ckeditor5-ui/src/button/buttonview.js"),g=o("./packages/ckeditor5-ui/src/view.js");class f extends g.a{constructor(e){super(e),this.buttonView=new p.a(e),this._fileInputView=new m(e),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 m extends g.a{constructor(e){super(e),this.set("acceptedType"),this.set("allowMultipleFiles",!1);const t=this.bindTemplate;this.setTemplate({tag:"input",attributes:{class:["ck-hidden"],type:"file",tabindex:"-1",accept:t.to("acceptedType"),multiple:t.to("allowMultipleFiles")},on:{change:t.to(()=>{this.element&&this.element.files&&this.element.files.length&&this.fire("done",this.element.files),this.element.value=""})}})}open(){this.element.click()}}class k extends i.a{static get requires(){return[u]}static get pluginName(){return"Base64UploadAdapter"}init(){this.editor.plugins.get(u).createUploadAdapter=e=>new b(e)}}class b{constructor(e){this.loader=e}upload(){return new Promise((e,t)=>{const o=this.reader=new window.FileReader;o.addEventListener("load",()=>{e({default:o.result})}),o.addEventListener("error",e=>{t(e)}),o.addEventListener("abort",()=>{t()}),this.loader.file.then(e=>{o.readAsDataURL(e)})})}abort(){this.reader.abort()}}class _ extends i.a{static get requires(){return[u]}static get pluginName(){return"SimpleUploadAdapter"}init(){const e=this.editor.config.get("simpleUpload");e&&(e.uploadUrl?this.editor.plugins.get(u).createUploadAdapter=t=>new w(t,e):Object(r.c)("simple-upload-adapter-missing-uploadurl"))}}class w{constructor(e,t){this.loader=e,this.options=t}upload(){return this.loader.file.then(e=>new Promise((t,o)=>{this._initRequest(),this._initListeners(t,o,e),this._sendRequest(e)}))}abort(){this.xhr&&this.xhr.abort()}_initRequest(){const e=this.xhr=new XMLHttpRequest;e.open("POST",this.options.uploadUrl,!0),e.responseType="json"}_initListeners(e,t,o){const i=this.xhr,s=this.loader,r=`Couldn't upload file: ${o.name}.`;i.addEventListener("error",()=>t(r)),i.addEventListener("abort",()=>t()),i.addEventListener("load",()=>{const o=i.response;if(!o||o.error)return t(o&&o.error&&o.error.message?o.error.message:r);const s=o.url?{default:o.url}:o.urls;e({...o,urls:s})}),i.upload&&i.upload.addEventListener("progress",e=>{e.lengthComputable&&(s.uploadTotal=e.total,s.uploaded=e.loaded)})}_sendRequest(e){const t=this.options.headers||{},o=this.options.withCredentials||!1;for(const e of Object.keys(t))this.xhr.setRequestHeader(e,t[e]);this.xhr.withCredentials=o;const i=new FormData;i.append("upload",e),this.xhr.send(i)}}},"./src/utils.js":function(e,t,o){"use strict";o.r(t);var i=o("./packages/ckeditor5-utils/src/index.js");o.d(t,"env",(function(){return i.n})),o.d(t,"diff",(function(){return i.m})),o.d(t,"mix",(function(){return i.A})),o.d(t,"EmitterMixin",(function(){return i.e})),o.d(t,"ObservableMixin",(function(){return i.i})),o.d(t,"CKEditorError",(function(){return i.a})),o.d(t,"logError",(function(){return i.y})),o.d(t,"logWarning",(function(){return i.z})),o.d(t,"ElementReplacer",(function(){return i.d})),o.d(t,"createElement",(function(){return i.l})),o.d(t,"DomEmitterMixin",(function(){return i.c})),o.d(t,"global",(function(){return i.u})),o.d(t,"getDataFromElement",(function(){return i.q})),o.d(t,"Rect",(function(){return i.j})),o.d(t,"ResizeObserver",(function(){return i.k})),o.d(t,"setDataInElement",(function(){return i.D})),o.d(t,"toUnit",(function(){return i.G})),o.d(t,"keyCodes",(function(){return i.x})),o.d(t,"getCode",(function(){return i.p})),o.d(t,"parseKeystroke",(function(){return i.B})),o.d(t,"getEnvKeystrokeText",(function(){return i.r})),o.d(t,"isArrowKeyCode",(function(){return i.v})),o.d(t,"getLocalizedArrowKeyCodeDirection",(function(){return i.t})),o.d(t,"isForwardArrowKeyCode",(function(){return i.w})),o.d(t,"getLanguageDirection",(function(){return i.s})),o.d(t,"Locale",(function(){return i.h})),o.d(t,"Collection",(function(){return i.b})),o.d(t,"first",(function(){return i.o})),o.d(t,"FocusTracker",(function(){return i.f})),o.d(t,"KeystrokeHandler",(function(){return i.g})),o.d(t,"toArray",(function(){return i.E})),o.d(t,"toMap",(function(){return i.F})),o.d(t,"priorities",(function(){return i.C})),o.d(t,"uid",(function(){return i.H})),o.d(t,"version",(function(){return i.I}))},"./src/widget.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Widget",(function(){return i.a})),o.d(t,"WidgetToolbarRepository",(function(){return d})),o.d(t,"WidgetResize",(function(){return O})),o.d(t,"WidgetTypeAround",(function(){return A.a})),o.d(t,"WIDGET_CLASS_NAME",(function(){return c.a})),o.d(t,"WIDGET_SELECTED_CLASS_NAME",(function(){return c.b})),o.d(t,"isWidget",(function(){return c.e})),o.d(t,"toWidget",(function(){return c.h})),o.d(t,"setHighlightHandling",(function(){return c.f})),o.d(t,"setLabel",(function(){return c.g})),o.d(t,"getLabel",(function(){return c.d})),o.d(t,"toWidgetEditable",(function(){return c.i})),o.d(t,"findOptimalInsertionRange",(function(){return c.c})),o.d(t,"viewToModelPositionOutsideModelElement",(function(){return c.j}));var i=o("./packages/ckeditor5-widget/src/widget.js"),s=o("./packages/ckeditor5-core/src/plugin.js"),r=o("./packages/ckeditor5-ui/src/panel/balloon/contextualballoon.js"),n=o("./packages/ckeditor5-ui/src/toolbar/toolbarview.js"),a=o("./packages/ckeditor5-ui/src/panel/balloon/balloonpanelview.js"),c=o("./packages/ckeditor5-widget/src/utils.js"),l=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class d extends s.a{static get requires(){return[r.a]}static get pluginName(){return"WidgetToolbarRepository"}init(){const e=this.editor;if(e.plugins.has("BalloonToolbar")){const t=e.plugins.get("BalloonToolbar");this.listenTo(t,"show",t=>{(function(e){const t=e.getSelectedElement();return!(!t||!Object(c.e)(t))})(e.editing.view.document.selection)&&t.stop()},{priority:"high"})}this._toolbarDefinitions=new Map,this._balloon=this.editor.plugins.get("ContextualBalloon"),this.on("change:isEnabled",()=>{this._updateToolbarsVisibility()}),this.listenTo(e.ui,"update",()=>{this._updateToolbarsVisibility()}),this.listenTo(e.ui.focusTracker,"change:isFocused",()=>{this._updateToolbarsVisibility()},{priority:"low"})}destroy(){super.destroy();for(const e of this._toolbarDefinitions.values())e.view.destroy()}register(e,{ariaLabel:t,items:o,getRelatedElement:i,balloonClassName:s="ck-toolbar-container"}){if(!o.length)return void Object(l.c)("widget-toolbar-no-items",{toolbarId:e});const r=this.editor,a=r.t,c=new n.a(r.locale);if(c.ariaLabel=t||a("Widget toolbar"),this._toolbarDefinitions.has(e))throw new l.a("widget-toolbar-duplicated",this,{toolbarId:e});c.fillFromConfig(o,r.ui.componentFactory),this._toolbarDefinitions.set(e,{view:c,getRelatedElement:i,balloonClassName:s})}_updateToolbarsVisibility(){let e=0,t=null,o=null;for(const i of this._toolbarDefinitions.values()){const s=i.getRelatedElement(this.editor.editing.view.document.selection);if(this.isEnabled&&s)if(this.editor.ui.focusTracker.isFocused){const r=s.getAncestors().length;r>e&&(e=r,t=s,o=i)}else this._isToolbarVisible(i)&&this._hideToolbar(i);else this._isToolbarInBalloon(i)&&this._hideToolbar(i)}o&&this._showToolbar(o,t)}_hideToolbar(e){this._balloon.remove(e.view),this.stopListening(this._balloon,"change:visibleView")}_showToolbar(e,t){this._isToolbarVisible(e)?u(this.editor,t):this._isToolbarInBalloon(e)||(this._balloon.add({view:e.view,position:h(this.editor,t),balloonClassName:e.balloonClassName}),this.listenTo(this._balloon,"change:visibleView",()=>{for(const e of this._toolbarDefinitions.values())if(this._isToolbarVisible(e)){const t=e.getRelatedElement(this.editor.editing.view.document.selection);u(this.editor,t)}}))}_isToolbarVisible(e){return this._balloon.visibleView===e.view}_isToolbarInBalloon(e){return this._balloon.hasView(e.view)}}function u(e,t){const o=e.plugins.get("ContextualBalloon"),i=h(e,t);o.updatePosition(i)}function h(e,t){const o=e.editing.view,i=a.a.defaultPositions;return{target:o.domConverter.mapViewToDom(t),positions:[i.northArrowSouth,i.northArrowSouthWest,i.northArrowSouthEast,i.southArrowNorth,i.southArrowNorthWest,i.southArrowNorthEast,i.viewportStickyNorth]}}var p=o("./packages/ckeditor5-ui/src/template.js"),g=o("./packages/ckeditor5-utils/src/dom/rect.js"),f=o("./packages/ckeditor5-utils/src/comparearrays.js"),m=o("./packages/ckeditor5-utils/src/observablemixin.js"),k=o("./packages/ckeditor5-utils/src/mix.js");class b{constructor(e){this.set("activeHandlePosition",null),this.set("proposedWidthPercents",null),this.set("proposedWidth",null),this.set("proposedHeight",null),this.set("proposedHandleHostWidth",null),this.set("proposedHandleHostHeight",null),this._options=e,this._referenceCoordinates=null}begin(e,t,o){const i=new g.a(t);this.activeHandlePosition=function(e){const t=["top-left","top-right","bottom-right","bottom-left"];for(const o of t)if(e.classList.contains("ck-widget__resizer__handle-"+o))return o}(e),this._referenceCoordinates=function(e,t){const o=new g.a(e),i=t.split("-"),s={x:"right"==i[1]?o.right:o.left,y:"bottom"==i[0]?o.bottom:o.top};return s.x+=e.ownerDocument.defaultView.scrollX,s.y+=e.ownerDocument.defaultView.scrollY,s}(t,function(e){const t=e.split("-"),o={top:"bottom",bottom:"top",left:"right",right:"left"};return`${o[t[0]]}-${o[t[1]]}`}(this.activeHandlePosition)),this.originalWidth=i.width,this.originalHeight=i.height,this.aspectRatio=i.width/i.height;const s=o.style.width;s&&s.match(/^\d+(\.\d*)?%$/)?this.originalWidthPercents=parseFloat(s):this.originalWidthPercents=function(e,t){const o=e.parentElement,i=parseFloat(o.ownerDocument.defaultView.getComputedStyle(o).width);return t.width/i*100}(o,i)}update(e){this.proposedWidth=e.width,this.proposedHeight=e.height,this.proposedWidthPercents=e.widthPercents,this.proposedHandleHostWidth=e.handleHostWidth,this.proposedHandleHostHeight=e.handleHostHeight}}Object(k.a)(b,m.a);var _=o("./packages/ckeditor5-ui/src/view.js");class w extends _.a{constructor(){super();const e=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-size-view",e.to("_viewPosition",e=>e?"ck-orientation-"+e:"")],style:{display:e.if("_isVisible","none",e=>!e)}},children:[{text:e.to("_label")}]})}_bindToState(e,t){this.bind("_isVisible").to(t,"proposedWidth",t,"proposedHeight",(e,t)=>null!==e&&null!==t),this.bind("_label").to(t,"proposedHandleHostWidth",t,"proposedHandleHostHeight",t,"proposedWidthPercents",(t,o,i)=>"px"===e.unit?`${t}×${o}`:i+"%"),this.bind("_viewPosition").to(t,"activeHandlePosition",t,"proposedHandleHostWidth",t,"proposedHandleHostHeight",(e,t,o)=>t<50||o<50?"above-center":e)}_dismiss(){this.unbind(),this._isVisible=!1}}class v{constructor(e){this._options=e,this._viewResizerWrapper=null,this.set("isEnabled",!0),this.decorate("begin"),this.decorate("cancel"),this.decorate("commit"),this.decorate("updateSize"),this.on("commit",e=>{this.state.proposedWidth||this.state.proposedWidthPercents||(this._cleanup(),e.stop())},{priority:"high"}),this.on("change:isEnabled",()=>{this.isEnabled&&this.redraw()})}attach(){const e=this,t=this._options.viewElement;this._options.editor.editing.view.change(o=>{const i=o.createUIElement("div",{class:"ck ck-reset_all ck-widget__resizer"},(function(t){const o=this.toDomElement(t);return e._appendHandles(o),e._appendSizeUI(o),e.on("change:isEnabled",(e,t,i)=>{o.style.display=i?"":"none"}),o.style.display=e.isEnabled?"":"none",o}));o.insert(o.createPositionAt(t,"end"),i),o.addClass("ck-widget_with-resizer",t),this._viewResizerWrapper=i})}begin(e){this.state=new b(this._options),this._sizeView._bindToState(this._options,this.state),this._initialViewWidth=this._options.viewElement.getStyle("width"),this.state.begin(e,this._getHandleHost(),this._getResizeHost())}updateSize(e){const t=this._proposeNewSize(e);this._options.editor.editing.view.change(e=>{const o=this._options.unit||"%",i=("%"===o?t.widthPercents:t.width)+o;e.setStyle("width",i,this._options.viewElement)});const o=this._getHandleHost(),i=new g.a(o);t.handleHostWidth=Math.round(i.width),t.handleHostHeight=Math.round(i.height);const s=new g.a(o);t.width=Math.round(s.width),t.height=Math.round(s.height),this.redraw(i),this.state.update(t)}commit(){const e=this._options.unit||"%",t=("%"===e?this.state.proposedWidthPercents:this.state.proposedWidth)+e;this._options.editor.editing.view.change(()=>{this._cleanup(),this._options.onCommit(t)})}cancel(){this._cleanup()}destroy(){this.cancel()}redraw(e){const t=this._domResizerWrapper;if(!((o=t)&&o.ownerDocument&&o.ownerDocument.contains(o)))return;var o;const i=t.parentElement,s=this._getHandleHost(),r=this._viewResizerWrapper,n=[r.getStyle("width"),r.getStyle("height"),r.getStyle("left"),r.getStyle("top")];let a;if(i.isSameNode(s)){const t=e||new g.a(s);a=[t.width+"px",t.height+"px",void 0,void 0]}else a=[s.offsetWidth+"px",s.offsetHeight+"px",s.offsetLeft+"px",s.offsetTop+"px"];"same"!==Object(f.a)(n,a)&&this._options.editor.editing.view.change(e=>{e.setStyle({width:a[0],height:a[1],left:a[2],top:a[3]},r)})}containsHandle(e){return this._domResizerWrapper.contains(e)}static isResizeHandle(e){return e.classList.contains("ck-widget__resizer__handle")}_cleanup(){this._sizeView._dismiss();this._options.editor.editing.view.change(e=>{e.setStyle("width",this._initialViewWidth,this._options.viewElement)})}_proposeNewSize(e){const t=this.state,o={x:(i=e).pageX,y:i.pageY};var i;const s=!this._options.isCentered||this._options.isCentered(this),r={x:t._referenceCoordinates.x-(o.x+t.originalWidth),y:o.y-t.originalHeight-t._referenceCoordinates.y};s&&t.activeHandlePosition.endsWith("-right")&&(r.x=o.x-(t._referenceCoordinates.x+t.originalWidth)),s&&(r.x*=2);const n={width:Math.abs(t.originalWidth+r.x),height:Math.abs(t.originalHeight+r.y)};n.dominant=n.width/t.aspectRatio>n.height?"width":"height",n.max=n[n.dominant];const a={width:n.width,height:n.height};return"width"==n.dominant?a.height=a.width/t.aspectRatio:a.width=a.height*t.aspectRatio,{width:Math.round(a.width),height:Math.round(a.height),widthPercents:Math.min(Math.round(t.originalWidthPercents/t.originalWidth*a.width*100)/100,100)}}_getResizeHost(){const e=this._domResizerWrapper.parentElement;return this._options.getResizeHost(e)}_getHandleHost(){const e=this._domResizerWrapper.parentElement;return this._options.getHandleHost(e)}get _domResizerWrapper(){return this._options.editor.editing.view.domConverter.mapViewToDom(this._viewResizerWrapper)}_appendHandles(e){const t=["top-left","top-right","bottom-right","bottom-left"];for(const i of t)e.appendChild(new p.a({tag:"div",attributes:{class:"ck-widget__resizer__handle "+(o=i,"ck-widget__resizer__handle-"+o)}}).render());var o}_appendSizeUI(e){this._sizeView=new w,this._sizeView.render(),e.appendChild(this._sizeView.element)}}Object(k.a)(v,m.a);var y=o("./packages/ckeditor5-utils/src/dom/emittermixin.js"),j=o("./packages/ckeditor5-utils/src/dom/global.js"),x=o("./packages/ckeditor5-engine/src/view/observer/mouseobserver.js"),P=o("./node_modules/lodash-es/throttle.js");o("./packages/ckeditor5-widget/theme/widgetresize.css");class O extends s.a{static get pluginName(){return"WidgetResize"}init(){const e=this.editor.editing,t=j.a.window.document;this.set("visibleResizer",null),this.set("_activeResizer",null),this._resizers=new Map,e.view.addObserver(x.a),this._observer=Object.create(y.a),this.listenTo(e.view.document,"mousedown",this._mouseDownListener.bind(this),{priority:"high"}),this._observer.listenTo(t,"mousemove",this._mouseMoveListener.bind(this)),this._observer.listenTo(t,"mouseup",this._mouseUpListener.bind(this));const o=()=>{this.visibleResizer&&this.visibleResizer.redraw()};this._redrawFocusedResizerThrottled=Object(P.a)(o,200),this.on("change:visibleResizer",o),this.editor.ui.on("update",this._redrawFocusedResizerThrottled),this.editor.model.document.on("change",()=>{for(const[e,t]of this._resizers)e.isAttached()||(this._resizers.delete(e),t.destroy())},{priority:"lowest"}),this._observer.listenTo(j.a.window,"resize",this._redrawFocusedResizerThrottled);const i=this.editor.editing.view.document.selection;i.on("change",()=>{const e=i.getSelectedElement();this.visibleResizer=this.getResizerByViewElement(e)||null})}destroy(){this._observer.stopListening();for(const e of this._resizers.values())e.destroy();this._redrawFocusedResizerThrottled.cancel()}attachTo(e){const t=new v(e),o=this.editor.plugins;if(t.attach(),o.has("WidgetToolbarRepository")){const e=o.get("WidgetToolbarRepository");t.on("begin",()=>{e.forceDisabled("resize")},{priority:"lowest"}),t.on("cancel",()=>{e.clearForceDisabled("resize")},{priority:"highest"}),t.on("commit",()=>{e.clearForceDisabled("resize")},{priority:"highest"})}this._resizers.set(e.viewElement,t);const i=this.editor.editing.view.document.selection.getSelectedElement();return this.getResizerByViewElement(i)==t&&(this.visibleResizer=t),t}getResizerByViewElement(e){return this._resizers.get(e)}_getResizerByHandle(e){for(const t of this._resizers.values())if(t.containsHandle(e))return t}_mouseDownListener(e,t){const o=t.domTarget;v.isResizeHandle(o)&&(this._activeResizer=this._getResizerByHandle(o),this._activeResizer&&(this._activeResizer.begin(o),e.stop(),t.preventDefault()))}_mouseMoveListener(e,t){this._activeResizer&&this._activeResizer.updateSize(t)}_mouseUpListener(){this._activeResizer&&(this._activeResizer.commit(),this._activeResizer=null)}}Object(k.a)(O,m.a);var A=o("./packages/ckeditor5-widget/src/widgettypearound/widgettypearound.js")},0:function(e,t,o){e.exports=o}}),function(e){e.CKEditor5=e.CKEditor5||{};const t=["utils","core","engine","ui","clipboard","enter","paragraph","select-all","typing","undo","upload","widget"];for(const o of t){const t=o.replace(/-([a-z])/g,(e,t)=>t.toUpperCase());e.CKEditor5[t]=e.CKEditor5.dll(`./src/${o}.js`)}}(window);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/editor-classic.js b/core/assets/vendor/ckeditor5/editor-classic.js
new file mode 100644
index 0000000000000000000000000000000000000000..9e83af7c8b1d7f735f470b2d5f567c6a8f8aaf24
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/editor-classic.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+window.CKEditor5=window.CKEditor5||{},window.CKEditor5.editorClassic=function(e){var t={};function r(o){if(t[o])return t[o].exports;var n=t[o]={i:o,l:!1,exports:{}};return e[o].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=t,r.d=function(e,t,o){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(r.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(o,n,function(t){return e[t]}.bind(null,n));return o},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=10)}([function(e,t,r){e.exports=r(3)("./src/ui.js")},function(e,t,r){e.exports=r(3)("./src/core.js")},function(e,t,r){e.exports=r(3)("./src/utils.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,r){e.exports=r(3)("./src/engine.js")},function(e,t,r){"use strict";(function(e){var r="object"==typeof e&&e&&e.Object===Object&&e;t.a=r}).call(this,r(9))},function(e,t,r){var o=r(7),n=r(8);"string"==typeof(n=n.__esModule?n.default:n)&&(n=[[e.i,n,""]]);var i={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};o(n,i);e.exports=n.locals||{}},function(e,t,r){"use strict";var o,n=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},i=function(){var e={};return function(t){if(void 0===e[t]){var r=document.querySelector(t);if(window.HTMLIFrameElement&&r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(e){r=null}e[t]=r}return e[t]}}(),c=[];function a(e){for(var t=-1,r=0;r<c.length;r++)if(c[r].identifier===e){t=r;break}return t}function s(e,t){for(var r={},o=[],n=0;n<e.length;n++){var i=e[n],s=t.base?i[0]+t.base:i[0],l=r[s]||0,d="".concat(s," ").concat(l);r[s]=l+1;var u=a(d),f={css:i[1],media:i[2],sourceMap:i[3]};-1!==u?(c[u].references++,c[u].updater(f)):c.push({identifier:d,updater:k(f,t),references:1}),o.push(d)}return o}function l(e){var t=document.createElement("style"),o=e.attributes||{};if(void 0===o.nonce){var n=r.nc;n&&(o.nonce=n)}if(Object.keys(o).forEach((function(e){t.setAttribute(e,o[e])})),"function"==typeof e.insert)e.insert(t);else{var c=i(e.insert||"head");if(!c)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");c.appendChild(t)}return t}var d,u=(d=[],function(e,t){return d[e]=t,d.filter(Boolean).join("\n")});function f(e,t,r,o){var n=r?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(e.styleSheet)e.styleSheet.cssText=u(t,n);else{var i=document.createTextNode(n),c=e.childNodes;c[t]&&e.removeChild(c[t]),c.length?e.insertBefore(i,c[t]):e.appendChild(i)}}function b(e,t,r){var o=r.css,n=r.media,i=r.sourceMap;if(n?e.setAttribute("media",n):e.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleSheet)e.styleSheet.cssText=o;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(o))}}var p=null,h=0;function k(e,t){var r,o,n;if(t.singleton){var i=h++;r=p||(p=l(t)),o=f.bind(null,r,i,!1),n=f.bind(null,r,i,!0)}else r=l(t),o=b.bind(null,r,t),n=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(r)};return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else n()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=n());var r=s(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var o=0;o<r.length;o++){var n=a(r[o]);c[n].references--}for(var i=s(e,t),l=0;l<r.length;l++){var d=a(r[l]);0===c[d].references&&(c[d].updater(),c.splice(d,1))}r=i}}}},function(e,t){e.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(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";r.r(t),r.d(t,"ClassicEditor",(function(){return P}));var o=r(1),n=r(2);var i=function(e){return null!=e&&"object"==typeof e},c=r(5),a="object"==typeof self&&self&&self.Object===Object&&self,s=(c.a||a||Function("return this")()).Symbol,l=Object.prototype,d=l.hasOwnProperty,u=l.toString,f=s?s.toStringTag:void 0;var b=function(e){var t=d.call(e,f),r=e[f];try{e[f]=void 0;var o=!0}catch(e){}var n=u.call(e);return o&&(t?e[f]=r:delete e[f]),n},p=Object.prototype.toString;var h=function(e){return p.call(e)},k=s?s.toStringTag:void 0;var m=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":k&&k in Object(e)?b(e):h(e)};var v=function(e,t){return function(r){return e(t(r))}}(Object.getPrototypeOf,Object),y=Function.prototype,g=Object.prototype,_=y.toString,w=g.hasOwnProperty,j=_.call(Object);var O=function(e){if(!i(e)||"[object Object]"!=m(e))return!1;var t=v(e);if(null===t)return!0;var r=w.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&_.call(r)==j};var x=function(e){return i(e)&&1===e.nodeType&&!O(e)},T=r(0),E=r(4);class C extends o.EditorUI{constructor(e,t){super(e),this.view=t,this._toolbarConfig=Object(T.normalizeToolbarConfig)(e.config.get("toolbar")),this._elementReplacer=new n.ElementReplacer}get element(){return this.view.element}init(e){const t=this.editor,r=this.view,o=t.editing.view,n=r.editable,i=o.document.getRoot();n.name=i.rootName,r.render();const c=n.element;this.setEditableElement(n.name,c),this.focusTracker.add(c),r.editable.bind("isFocused").to(this.focusTracker),o.attachDomRoot(c),e&&this._elementReplacer.replace(e,this.element),this._initPlaceholder(),this._initToolbar(),this.fire("ready")}destroy(){const e=this.view,t=this.editor.editing.view;this._elementReplacer.restore(),t.detachDomRoot(e.editable.name),e.destroy(),super.destroy()}_initToolbar(){const e=this.editor,t=this.view,r=e.editing.view;t.stickyPanel.bind("isActive").to(this.focusTracker,"isFocused"),t.stickyPanel.limiterElement=t.element,t.stickyPanel.bind("viewportTopOffset").to(this,"viewportOffset",({top:e})=>e),t.toolbar.fillFromConfig(this._toolbarConfig,this.componentFactory),Object(T.enableToolbarKeyboardFocus)({origin:r,originFocusTracker:this.focusTracker,originKeystrokeHandler:e.keystrokes,toolbar:t.toolbar})}_initPlaceholder(){const e=this.editor,t=e.editing.view,r=t.document.getRoot(),o=e.sourceElement,n=e.config.get("placeholder")||o&&"textarea"===o.tagName.toLowerCase()&&o.getAttribute("placeholder");n&&Object(E.enablePlaceholder)({view:t,element:r,text:n,isDirectHost:!1,keepOnFocus:!0})}}r(6);class S extends T.BoxedEditorUIView{constructor(e,t,r={}){super(e),this.stickyPanel=new T.StickyPanelView(e),this.toolbar=new T.ToolbarView(e,{shouldGroupWhenFull:r.shouldToolbarGroupWhenFull}),this.editable=new T.InlineEditableUIView(e,t)}render(){super.render(),this.stickyPanel.content.add(this.toolbar),this.top.add(this.stickyPanel),this.main.add(this.editable)}}class P extends o.Editor{constructor(e,t){super(t),x(e)&&(this.sourceElement=e),this.model.document.createRoot();const r=!this.config.get("toolbar.shouldNotGroupWhenFull"),n=new S(this.locale,this.editing.view,{shouldToolbarGroupWhenFull:r});this.ui=new C(this,n),Object(o.attachToForm)(this)}destroy(){return this.sourceElement&&this.updateSourceElement(),this.ui.destroy(),super.destroy()}static create(e,t={}){return new Promise(r=>{const o=new this(e,t);r(o.initPlugins().then(()=>o.ui.init(x(e)?e:null)).then(()=>{if(!x(e)&&t.initialData)throw new n.CKEditorError("editor-create-initial-data",null);const r=void 0!==t.initialData?t.initialData:function(e){return x(e)?Object(n.getDataFromElement)(e):e}(e);return o.data.init(r)}).then(()=>o.fire("ready")).then(()=>o))})}}Object(n.mix)(P,o.DataApiMixin),Object(n.mix)(P,o.ElementApiMixin)}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/editor-decoupled.js b/core/assets/vendor/ckeditor5/editor-decoupled.js
new file mode 100644
index 0000000000000000000000000000000000000000..702a29d569d29698acce8e9df3c43c841bbd3cb5
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/editor-decoupled.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+window.CKEditor5=window.CKEditor5||{},window.CKEditor5.editorDecoupled=function(t){var e={};function o(r){if(e[r])return e[r].exports;var n=e[r]={i:r,l:!1,exports:{}};return t[r].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=t,o.c=e,o.d=function(t,e,r){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=7)}([function(t,e,o){t.exports=o(3)("./src/core.js")},function(t,e,o){t.exports=o(3)("./src/ui.js")},function(t,e,o){t.exports=o(3)("./src/utils.js")},function(t,e){t.exports=CKEditor5.dll},function(t,e,o){t.exports=o(3)("./src/engine.js")},function(t,e,o){"use strict";(function(t){var o="object"==typeof t&&t&&t.Object===Object&&t;e.a=o}).call(this,o(6))},function(t,e){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(t){"object"==typeof window&&(o=window)}t.exports=o},function(t,e,o){"use strict";o.r(e),o.d(e,"DecoupledEditor",(function(){return _}));var r=o(0),n=o(2);var i=function(t){return null!=t&&"object"==typeof t},c=o(5),s="object"==typeof self&&self&&self.Object===Object&&self,l=(c.a||s||Function("return this")()).Symbol,a=Object.prototype,u=a.hasOwnProperty,d=a.toString,f=l?l.toStringTag:void 0;var b=function(t){var e=u.call(t,f),o=t[f];try{t[f]=void 0;var r=!0}catch(t){}var n=d.call(t);return r&&(e?t[f]=o:delete t[f]),n},h=Object.prototype.toString;var p=function(t){return h.call(t)},g=l?l.toStringTag:void 0;var y=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":g&&g in Object(t)?b(t):p(t)};var m=function(t,e){return function(o){return t(e(o))}}(Object.getPrototypeOf,Object),w=Function.prototype,v=Object.prototype,j=w.toString,O=v.hasOwnProperty,E=j.call(Object);var x=function(t){if(!i(t)||"[object Object]"!=y(t))return!1;var e=m(t);if(null===e)return!0;var o=O.call(e,"constructor")&&e.constructor;return"function"==typeof o&&o instanceof o&&j.call(o)==E};var T=function(t){return i(t)&&1===t.nodeType&&!x(t)},F=o(1),D=o(4);class P extends r.EditorUI{constructor(t,e){super(t),this.view=e}init(){const t=this.editor,e=this.view,o=t.editing.view,r=e.editable,n=o.document.getRoot();e.editable.name=n.rootName,e.render();const i=r.element;this.setEditableElement(r.name,i),this.focusTracker.add(i),e.editable.bind("isFocused").to(this.focusTracker),o.attachDomRoot(i),this._initPlaceholder(),this._initToolbar(),this.fire("ready")}destroy(){const t=this.view;this.editor.editing.view.detachDomRoot(t.editable.name),t.destroy(),super.destroy()}_initToolbar(){const t=this.editor,e=this.view.toolbar;e.fillFromConfig(t.config.get("toolbar"),this.componentFactory),Object(F.enableToolbarKeyboardFocus)({origin:t.editing.view,originFocusTracker:this.focusTracker,originKeystrokeHandler:t.keystrokes,toolbar:e})}_initPlaceholder(){const t=this.editor,e=t.editing.view,o=e.document.getRoot(),r=t.sourceElement,n=t.config.get("placeholder")||r&&"textarea"===r.tagName.toLowerCase()&&r.getAttribute("placeholder");n&&Object(D.enablePlaceholder)({view:e,element:o,text:n,isDirectHost:!1,keepOnFocus:!0})}}class S extends F.EditorUIView{constructor(t,e,o={}){super(t),this.toolbar=new F.ToolbarView(t,{shouldGroupWhenFull:o.shouldToolbarGroupWhenFull}),this.editable=new F.InlineEditableUIView(t,e,o.editableElement),this.toolbar.extendTemplate({attributes:{class:["ck-reset_all","ck-rounded-corners"],dir:t.uiLanguageDirection}})}render(){super.render(),this.registerChild([this.toolbar,this.editable])}}class _ extends r.Editor{constructor(t,e){super(e),T(t)&&(this.sourceElement=t,Object(r.secureSourceElement)(this)),this.model.document.createRoot();const o=!this.config.get("toolbar.shouldNotGroupWhenFull"),n=new S(this.locale,this.editing.view,{editableElement:this.sourceElement,shouldToolbarGroupWhenFull:o});this.ui=new P(this,n)}destroy(){const t=this.getData();return this.ui.destroy(),super.destroy().then(()=>{this.sourceElement&&Object(n.setDataInElement)(this.sourceElement,t)})}static create(t,e={}){return new Promise(o=>{const r=T(t);if(r&&"TEXTAREA"===t.tagName)throw new n.CKEditorError("editor-wrong-element",null);const i=new this(t,e);o(i.initPlugins().then(()=>{i.ui.init()}).then(()=>{if(!r&&e.initialData)throw new n.CKEditorError("editor-create-initial-data",null);const o=void 0!==e.initialData?e.initialData:function(t){return T(t)?Object(n.getDataFromElement)(t):t}(t);return i.data.init(o)}).then(()=>i.fire("ready")).then(()=>i))})}}Object(n.mix)(_,r.DataApiMixin)}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/essentials.js b/core/assets/vendor/ckeditor5/essentials.js
new file mode 100644
index 0000000000000000000000000000000000000000..b20455a363a328258c4abaeacaf80497ff005b73
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/essentials.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+window.CKEditor5=window.CKEditor5||{},window.CKEditor5.essentials=function(t){var e={};function r(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,r),o.l=!0,o.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)r.d(n,o,function(e){return t[e]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=7)}([function(t,e){t.exports=CKEditor5.dll},function(t,e,r){t.exports=r(0)("./src/enter.js")},function(t,e,r){t.exports=r(0)("./src/core.js")},function(t,e,r){t.exports=r(0)("./src/clipboard.js")},function(t,e,r){t.exports=r(0)("./src/select-all.js")},function(t,e,r){t.exports=r(0)("./src/typing.js")},function(t,e,r){t.exports=r(0)("./src/undo.js")},function(t,e,r){"use strict";r.r(e),r.d(e,"Essentials",(function(){return l}));var n=r(2),o=r(3),i=r(1),u=r(4),s=r(5),c=r(6);class l extends n.Plugin{static get requires(){return[o.Clipboard,i.Enter,u.SelectAll,i.ShiftEnter,s.Typing,c.Undo]}static get pluginName(){return"Essentials"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/heading.js b/core/assets/vendor/ckeditor5/heading.js
new file mode 100644
index 0000000000000000000000000000000000000000..573d17a15a918fa849e8c193b67746ed9485192b
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/heading.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Choose heading":"Choose heading",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Paragraph:"Paragraph","Type or paste your content here.":"Type or paste your content here.","Type your title":"Type your title"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.heading=function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=9)}([function(e,t,n){e.exports=n(4)("./src/core.js")},function(e,t,n){e.exports=n(4)("./src/utils.js")},function(e,t,n){e.exports=n(4)("./src/engine.js")},function(e,t,n){e.exports=n(4)("./src/ui.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,n){var i=n(7),o=n(8);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(o,a);e.exports=o.locals||{}},function(e,t,n){e.exports=n(4)("./src/paragraph.js")},function(e,t,n){"use strict";var i,o=function(){return void 0===i&&(i=Boolean(window&&document&&document.all&&!window.atob)),i},a=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),r=[];function s(e){for(var t=-1,n=0;n<r.length;n++)if(r[n].identifier===e){t=n;break}return t}function c(e,t){for(var n={},i=[],o=0;o<e.length;o++){var a=e[o],c=t.base?a[0]+t.base:a[0],d=n[c]||0,l="".concat(c," ").concat(d);n[c]=d+1;var h=s(l),u={css:a[1],media:a[2],sourceMap:a[3]};-1!==h?(r[h].references++,r[h].updater(u)):r.push({identifier:l,updater:f(u,t),references:1}),i.push(l)}return i}function d(e){var t=document.createElement("style"),i=e.attributes||{};if(void 0===i.nonce){var o=n.nc;o&&(i.nonce=o)}if(Object.keys(i).forEach((function(e){t.setAttribute(e,i[e])})),"function"==typeof e.insert)e.insert(t);else{var r=a(e.insert||"head");if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(t)}return t}var l,h=(l=[],function(e,t){return l[e]=t,l.filter(Boolean).join("\n")});function u(e,t,n,i){var o=n?"":i.media?"@media ".concat(i.media," {").concat(i.css,"}"):i.css;if(e.styleSheet)e.styleSheet.cssText=h(t,o);else{var a=document.createTextNode(o),r=e.childNodes;r[t]&&e.removeChild(r[t]),r.length?e.insertBefore(a,r[t]):e.appendChild(a)}}function g(e,t,n){var i=n.css,o=n.media,a=n.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),a&&"undefined"!=typeof btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),e.styleSheet)e.styleSheet.cssText=i;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(i))}}var m=null,p=0;function f(e,t){var n,i,o;if(t.singleton){var a=p++;n=m||(m=d(t)),i=u.bind(null,n,a,!1),o=u.bind(null,n,a,!0)}else n=d(t),i=g.bind(null,n,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};return i(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;i(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var n=c(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var i=0;i<n.length;i++){var o=s(n[i]);r[o].references--}for(var a=c(e,t),d=0;d<n.length;d++){var l=s(n[d]);0===r[l].references&&(r[l].updater(),r.splice(l,1))}n=a}}}},function(e,t){e.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(e,t,n){"use strict";n.r(t),n.d(t,"Heading",(function(){return u})),n.d(t,"HeadingEditing",(function(){return c})),n.d(t,"HeadingUI",(function(){return h})),n.d(t,"HeadingButtonsUI",(function(){return m})),n.d(t,"Title",(function(){return v}));var i=n(0),o=n(6),a=n(1);class r extends i.Command{constructor(e,t){super(e),this.modelElements=t}refresh(){const e=Object(a.first)(this.editor.model.document.selection.getSelectedBlocks());this.value=!!e&&this.modelElements.includes(e.name)&&e.name,this.isEnabled=!!e&&this.modelElements.some(t=>s(e,t,this.editor.model.schema))}execute(e){const t=this.editor.model,n=t.document,i=e.value;t.change(e=>{const o=Array.from(n.selection.getSelectedBlocks()).filter(e=>s(e,i,t.schema));for(const t of o)t.is("element",i)||e.rename(t,i)})}}function s(e,t,n){return n.checkChild(e.parent,t)&&!n.isObject(e)}class c extends i.Plugin{static get pluginName(){return"HeadingEditing"}constructor(e){super(e),e.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[o.Paragraph]}init(){const e=this.editor,t=e.config.get("heading.options"),n=[];for(const i of t)"paragraph"!==i.model&&(e.model.schema.register(i.model,{inheritAllFrom:"$block"}),e.conversion.elementToElement(i),n.push(i.model));this._addDefaultH1Conversion(e),e.commands.add("heading",new r(e,n))}afterInit(){const e=this.editor,t=e.commands.get("enter"),n=e.config.get("heading.options");t&&this.listenTo(t,"afterExecute",(t,i)=>{const o=e.model.document.selection.getFirstPosition().parent;n.some(e=>o.is("element",e.model))&&!o.is("element","paragraph")&&0===o.childCount&&i.writer.rename(o,"paragraph")})}_addDefaultH1Conversion(e){e.conversion.for("upcast").elementToElement({model:"heading1",view:"h1",converterPriority:a.priorities.get("low")+1})}}var d=n(3);function l(e){const t=e.t,n={Paragraph:t("Paragraph"),"Heading 1":t("Heading 1"),"Heading 2":t("Heading 2"),"Heading 3":t("Heading 3"),"Heading 4":t("Heading 4"),"Heading 5":t("Heading 5"),"Heading 6":t("Heading 6")};return e.config.get("heading.options").map(e=>{const t=n[e.title];return t&&t!=e.title&&(e.title=t),e})}n(5);class h extends i.Plugin{static get pluginName(){return"HeadingUI"}init(){const e=this.editor,t=e.t,n=l(e),i=t("Choose heading"),o=t("Heading");e.ui.componentFactory.add("heading",t=>{const r={},s=new a.Collection,c=e.commands.get("heading"),l=e.commands.get("paragraph"),h=[c];for(const e of n){const t={type:"button",model:new d.Model({label:e.title,class:e.class,withText:!0})};"paragraph"===e.model?(t.model.bind("isOn").to(l,"value"),t.model.set("commandName","paragraph"),h.push(l)):(t.model.bind("isOn").to(c,"value",t=>t===e.model),t.model.set({commandName:"heading",commandValue:e.model})),s.add(t),r[e.model]=e.title}const u=Object(d.createDropdown)(t);return Object(d.addListToDropdown)(u,s),u.buttonView.set({isOn:!1,withText:!0,tooltip:o}),u.extendTemplate({attributes:{class:["ck-heading-dropdown"]}}),u.bind("isEnabled").toMany(h,"isEnabled",(...e)=>e.some(e=>e)),u.buttonView.bind("label").to(c,"value",l,"value",(e,t)=>{const n=e||t&&"paragraph";return r[n]?r[n]:i}),this.listenTo(u,"execute",t=>{e.execute(t.source.commandName,t.source.commandValue?{value:t.source.commandValue}:void 0),e.editing.view.focus()}),u})}}class u extends i.Plugin{static get requires(){return[c,h]}static get pluginName(){return"Heading"}}const g={heading1:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M19 9v10h-2v-8h-2V9h4zM4 8.5h5V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v11.5a1 1 0 0 1-1 1H10a1 1 0 0 1-1-1V11H4v4.5a1 1 0 0 1-1 1h-.5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v4.5z"/></svg>',heading2:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 8.5h5V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v11.5a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1V11H3v4.5a1 1 0 0 1-1 1h-.5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1H2a1 1 0 0 1 1 1v4.5zm16.076 8.343V18.5h-6.252c.067-.626.27-1.22.61-1.78.338-.561 1.006-1.305 2.005-2.232.804-.749 1.297-1.257 1.479-1.523.245-.368.368-.732.368-1.092 0-.398-.107-.703-.32-.917-.214-.214-.51-.32-.886-.32-.372 0-.669.111-.889.336-.22.224-.347.596-.38 1.117l-1.778-.178c.106-.982.438-1.686.997-2.114.558-.427 1.257-.64 2.095-.64.918 0 1.64.247 2.164.742.525.495.787 1.11.787 1.847 0 .419-.075.818-.225 1.197-.15.378-.388.775-.714 1.19-.216.275-.605.67-1.168 1.187-.563.516-.92.859-1.07 1.028a3.11 3.11 0 0 0-.365.495h3.542z"/></svg>',heading3:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 8.5h5V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v11.5a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1V11H3v4.5a1 1 0 0 1-1 1h-.5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1H2a1 1 0 0 1 1 1v4.5zm9.989 7.53 1.726-.209c.055.44.203.777.445 1.01.24.232.533.349.876.349.368 0 .678-.14.93-.42.251-.279.377-.655.377-1.13 0-.448-.12-.803-.362-1.066a1.153 1.153 0 0 0-.882-.393c-.228 0-.501.044-.819.133l.197-1.453c.482.012.85-.092 1.105-.315.253-.222.38-.517.38-.885 0-.313-.093-.563-.279-.75-.186-.185-.434-.278-.743-.278a1.07 1.07 0 0 0-.78.317c-.216.212-.347.52-.394.927l-1.644-.28c.114-.562.287-1.012.517-1.348.231-.337.553-.601.965-.794a3.24 3.24 0 0 1 1.387-.289c.876 0 1.579.28 2.108.838.436.457.653.973.653 1.549 0 .817-.446 1.468-1.339 1.955.533.114.96.37 1.28.768.319.398.478.878.478 1.441 0 .817-.298 1.513-.895 2.088-.596.576-1.339.864-2.228.864-.842 0-1.54-.243-2.094-.727-.555-.485-.876-1.118-.965-1.901z"/></svg>',heading4:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3.5 8.5h5V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v11.5a1 1 0 0 1-1 1h-.5a1 1 0 0 1-1-1V11h-5v4.5a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v4.5zm13.55 10v-1.873h-3.81v-1.561l4.037-5.91h1.498v5.904h1.156v1.567h-1.156V18.5H17.05zm0-3.44v-3.18l-2.14 3.18h2.14z"/></svg>',heading5:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3.5 8.5h5V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v11.5a1 1 0 0 1-1 1h-.5a1 1 0 0 1-1-1V11h-5v4.5a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v4.5zm9.578 7.607 1.777-.184c.05.402.201.72.45.955a1.223 1.223 0 0 0 1.81-.101c.258-.303.387-.759.387-1.368 0-.572-.128-1-.384-1.286-.256-.285-.59-.428-1-.428-.512 0-.971.226-1.377.679l-1.448-.21.915-4.843h4.716v1.67H15.56l-.28 1.58a2.697 2.697 0 0 1 1.219-.298 2.68 2.68 0 0 1 2.012.863c.55.576.825 1.323.825 2.241a3.36 3.36 0 0 1-.666 2.05c-.605.821-1.445 1.232-2.52 1.232-.86 0-1.56-.23-2.101-.692-.542-.461-.866-1.081-.971-1.86z"/></svg>',heading6:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3.5 8.5h5V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v11.5a1 1 0 0 1-1 1h-.5a1 1 0 0 1-1-1V11h-5v4.5a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v4.5zm15.595 2.973-1.726.19c-.043-.355-.153-.617-.33-.787-.178-.169-.409-.253-.692-.253-.377 0-.695.169-.956.507-.26.339-.424 1.043-.492 2.114.445-.525.997-.787 1.657-.787.745 0 1.383.284 1.914.85.531.568.797 1.3.797 2.197 0 .952-.28 1.716-.838 2.291-.559.576-1.276.864-2.152.864-.94 0-1.712-.365-2.317-1.095-.605-.73-.908-1.927-.908-3.59 0-1.705.316-2.935.946-3.688.63-.753 1.45-1.13 2.457-1.13.706 0 1.291.198 1.755.594.463.395.758.97.885 1.723zm-4.043 3.891c0 .58.133 1.028.4 1.343.266.315.57.473.914.473.33 0 .605-.13.825-.388.22-.258.33-.68.33-1.27 0-.604-.118-1.047-.355-1.329a1.115 1.115 0 0 0-.89-.422c-.342 0-.632.134-.869.403s-.355.666-.355 1.19z"/></svg>'};class m extends i.Plugin{init(){l(this.editor).filter(e=>"paragraph"!==e.model).map(e=>this._createButton(e))}_createButton(e){const t=this.editor;t.ui.componentFactory.add(e.model,n=>{const i=new d.ButtonView(n),o=t.commands.get("heading");return i.label=e.title,i.icon=e.icon||g[e.model],i.tooltip=!0,i.isToggleable=!0,i.bind("isEnabled").to(o),i.bind("isOn").to(o,"value",t=>t==e.model),i.on("execute",()=>{t.execute("heading",{value:e.model}),t.editing.view.focus()}),i})}}var p=n(2);const f=new Set(["paragraph","heading1","heading2","heading3","heading4","heading5","heading6"]);class v extends i.Plugin{static get pluginName(){return"Title"}static get requires(){return["Paragraph"]}init(){const e=this.editor,t=e.model;this._bodyPlaceholder=null,t.schema.register("title",{isBlock:!0,allowIn:"$root"}),t.schema.register("title-content",{isBlock:!0,allowIn:"title",allowAttributes:["alignment"]}),t.schema.extend("$text",{allowIn:"title-content"}),t.schema.addAttributeCheck(e=>{if(e.endsWith("title-content $text"))return!1}),e.editing.mapper.on("modelToViewPosition",b(e.editing.view)),e.data.mapper.on("modelToViewPosition",b(e.editing.view)),e.conversion.for("downcast").elementToElement({model:"title-content",view:"h1"}),e.data.upcastDispatcher.on("element:h1",w,{priority:"high"}),e.data.upcastDispatcher.on("element:h2",w,{priority:"high"}),e.data.upcastDispatcher.on("element:h3",w,{priority:"high"}),t.document.registerPostFixer(e=>this._fixTitleContent(e)),t.document.registerPostFixer(e=>this._fixTitleElement(e)),t.document.registerPostFixer(e=>this._fixBodyElement(e)),t.document.registerPostFixer(e=>this._fixExtraParagraph(e)),this._attachPlaceholders(),this._attachTabPressHandling()}getTitle(e={}){const t=this._getTitleElement().getChild(0);return this.editor.data.stringify(t,e)}getBody(e={}){const t=this.editor,n=t.data,i=t.model,o=t.model.document.getRoot(),a=t.editing.view,r=new p.DowncastWriter(a.document),s=i.createRangeIn(o),c=r.createDocumentFragment();n.downcastDispatcher.conversionApi.options=e,n.mapper.clearBindings(),n.mapper.bindElements(o,c),n.downcastDispatcher.convertInsert(s,r);const d=i.createPositionAfter(o.getChild(0)),l=i.createRange(d,i.createPositionAt(o,"end"));for(const e of i.markers){const t=l.getIntersection(e.getRange());t&&n.downcastDispatcher.convertMarkerAdd(e.name,t,r)}return delete n.downcastDispatcher.conversionApi.options,r.remove(r.createRangeOn(c.getChild(0))),t.data.processor.toData(c)}_getTitleElement(){const e=this.editor.model.document.getRoot();for(const t of e.getChildren())if(x(t))return t}_fixTitleContent(e){const t=this._getTitleElement();if(!t||1===t.maxOffset)return!1;const n=Array.from(t.getChildren());n.shift();for(const i of n)e.move(e.createRangeOn(i),t,"after"),e.rename(i,"paragraph");return!0}_fixTitleElement(e){const t=this.editor.model,n=t.document.getRoot(),i=Array.from(n.getChildren()).filter(x),o=i[0],a=n.getChild(0);if(a.is("element","title"))return y(i,e,t);if(!o&&!f.has(a.name)){const t=e.createElement("title");return e.insert(t,n),e.insertElement("title-content",t),!0}return f.has(a.name)?function(e,t,n){const i=t.createElement("title");t.insert(i,e,"before"),t.insert(e,i,0),t.rename(e,"title-content"),n.schema.removeDisallowedAttributes([e],t)}(a,e,t):e.move(e.createRangeOn(o),n,0),y(i,e,t),!0}_fixBodyElement(e){const t=this.editor.model.document.getRoot();return t.childCount<2&&(this._bodyPlaceholder=e.createElement("paragraph"),e.insert(this._bodyPlaceholder,t,1),!0)}_fixExtraParagraph(e){const t=this.editor.model.document.getRoot(),n=this._bodyPlaceholder;return!!function(e,t){if(!e||!e.is("element","paragraph")||e.childCount)return!1;if(t.childCount<=2||t.getChild(t.childCount-1)!==e)return!1;return!0}(n,t)&&(this._bodyPlaceholder=null,e.remove(n),!0)}_attachPlaceholders(){const e=this.editor,t=e.t,n=e.editing.view,i=n.document.getRoot(),o=e.sourceElement,a=e.config.get("title.placeholder")||t("Type your title"),r=e.config.get("placeholder")||o&&"textarea"===o.tagName.toLowerCase()&&o.getAttribute("placeholder")||t("Type or paste your content here.");let s;e.editing.downcastDispatcher.on("insert:title-content",(e,t,i)=>{Object(p.enablePlaceholder)({view:n,element:i.mapper.toViewElement(t.item),text:a,keepOnFocus:!0})}),n.document.registerPostFixer(e=>{const t=i.getChild(1);let n=!1;return t!==s&&(s&&(Object(p.hidePlaceholder)(e,s),e.removeAttribute("data-placeholder",s)),e.setAttribute("data-placeholder",r,t),s=t,n=!0),n=Object(p.needsPlaceholder)(t,!0)&&2===i.childCount&&"p"===t.name?!!Object(p.showPlaceholder)(e,t)||n:!!Object(p.hidePlaceholder)(e,t)||n,n})}_attachTabPressHandling(){const e=this.editor,t=e.model;e.keystrokes.set("TAB",(e,n)=>{t.change(e=>{const i=t.document.selection,o=Array.from(i.getSelectedBlocks());if(1===o.length&&o[0].is("element","title-content")){const i=t.document.getRoot().getChild(1);e.setSelection(i,0),n()}})}),e.keystrokes.set("SHIFT + TAB",(n,i)=>{t.change(n=>{const o=t.document.selection;if(!o.isCollapsed)return;const r=e.model.document.getRoot(),s=Object(a.first)(o.getSelectedBlocks()),c=o.getFirstPosition(),d=r.getChild(0);s===r.getChild(1)&&c.isAtStart&&(n.setSelection(d.getChild(0),0),i())})})}}function w(e,t,n){const i=t.modelCursor,o=t.viewItem;if(!i.isAtStart||!i.parent.is("element","$root"))return;if(!n.consumable.consume(o,{name:!0}))return;const a=n.writer,r=a.createElement("title"),s=a.createElement("title-content");a.append(s,r),a.insert(r,i),n.convertChildren(o,s),n.updateConversionResult(r,t)}function b(e){return(t,n)=>{const i=n.modelPosition.parent;if(!i.is("element","title"))return;const o=i.parent,a=n.mapper.toViewElement(o);n.viewPosition=e.createPositionAt(a,0),t.stop()}}function x(e){return e.is("element","title")}function y(e,t,n){let i=!1;for(const o of e)0!==o.index&&(H(o,t,n),i=!0);return i}function H(e,t,n){const i=e.getChild(0);i.isEmpty?t.remove(e):(t.move(t.createRangeOn(i),e,"before"),t.rename(i,"paragraph"),t.remove(e),n.schema.removeDisallowedAttributes([i],t))}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/horizontal-line.js b/core/assets/vendor/ckeditor5/horizontal-line.js
new file mode 100644
index 0000000000000000000000000000000000000000..54d6809100a4066628002cf486841aac51563e1a
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/horizontal-line.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Horizontal line":"Horizontal line"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.horizontalLine=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(e,t,n){e.exports=n(2)("./src/core.js")},function(e,t,n){e.exports=n(2)("./src/widget.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,n){e.exports=n(2)("./src/ui.js")},function(e,t,n){var r=n(5),o=n(6);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var i={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};r(o,i);e.exports=o.locals||{}},function(e,t,n){"use strict";var r,o=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},i=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),a=[];function c(e){for(var t=-1,n=0;n<a.length;n++)if(a[n].identifier===e){t=n;break}return t}function s(e,t){for(var n={},r=[],o=0;o<e.length;o++){var i=e[o],s=t.base?i[0]+t.base:i[0],l=n[s]||0,u="".concat(s," ").concat(l);n[s]=l+1;var d=c(u),f={css:i[1],media:i[2],sourceMap:i[3]};-1!==d?(a[d].references++,a[d].updater(f)):a.push({identifier:u,updater:g(f,t),references:1}),r.push(u)}return r}function l(e){var t=document.createElement("style"),r=e.attributes||{};if(void 0===r.nonce){var o=n.nc;o&&(r.nonce=o)}if(Object.keys(r).forEach((function(e){t.setAttribute(e,r[e])})),"function"==typeof e.insert)e.insert(t);else{var a=i(e.insert||"head");if(!a)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");a.appendChild(t)}return t}var u,d=(u=[],function(e,t){return u[e]=t,u.filter(Boolean).join("\n")});function f(e,t,n,r){var o=n?"":r.media?"@media ".concat(r.media," {").concat(r.css,"}"):r.css;if(e.styleSheet)e.styleSheet.cssText=d(t,o);else{var i=document.createTextNode(o),a=e.childNodes;a[t]&&e.removeChild(a[t]),a.length?e.insertBefore(i,a[t]):e.appendChild(i)}}function p(e,t,n){var r=n.css,o=n.media,i=n.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleSheet)e.styleSheet.cssText=r;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(r))}}var h=null,m=0;function g(e,t){var n,r,o;if(t.singleton){var i=m++;n=h||(h=l(t)),r=f.bind(null,n,i,!1),o=f.bind(null,n,i,!0)}else n=l(t),r=p.bind(null,n,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var n=s(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var r=0;r<n.length;r++){var o=c(n[r]);a[o].references--}for(var i=s(e,t),l=0;l<n.length;l++){var u=c(n[l]);0===a[u].references&&(a[u].updater(),a.splice(u,1))}n=i}}}},function(e,t){e.exports=".ck-editor__editable .ck-horizontal-line{display:flow-root}.ck-content hr{margin:15px 0;height:4px;background:#dedede;border:0}"},function(e,t,n){"use strict";n.r(t),n.d(t,"HorizontalLine",(function(){return l})),n.d(t,"HorizontalLineEditing",(function(){return a})),n.d(t,"HorizontalLineUI",(function(){return s}));var r=n(0),o=n(1);class i extends r.Command{refresh(){const e=this.editor.model,t=e.schema,n=e.document.selection;this.isEnabled=function(e,t,n){const r=function(e,t){const n=Object(o.findOptimalInsertionRange)(e,t).start.parent;if(n.isEmpty&&!n.is("element","$root"))return n.parent;return n}(e,n);return t.checkChild(r,"horizontalLine")}(n,t,e)}execute(){const e=this.editor.model;e.change(t=>{const n=t.createElement("horizontalLine");e.insertContent(n);let r=n.nextSibling;!(r&&e.schema.checkChild(r,"$text"))&&e.schema.checkChild(n.parent,"paragraph")&&(r=t.createElement("paragraph"),e.insertContent(r,t.createPositionAfter(n))),r&&t.setSelection(r,0)})}}n(4);class a extends r.Plugin{static get pluginName(){return"HorizontalLineEditing"}init(){const e=this.editor,t=e.model.schema,n=e.t,r=e.conversion;t.register("horizontalLine",{isObject:!0,allowWhere:"$block"}),r.for("dataDowncast").elementToElement({model:"horizontalLine",view:(e,{writer:t})=>t.createEmptyElement("hr")}),r.for("editingDowncast").elementToElement({model:"horizontalLine",view:(e,{writer:t})=>{const r=n("Horizontal line"),i=t.createContainerElement("div"),a=t.createEmptyElement("hr");return t.addClass("ck-horizontal-line",i),t.setCustomProperty("hr",!0,i),t.insert(t.createPositionAt(i,0),a),function(e,t,n){return t.setCustomProperty("horizontalLine",!0,e),Object(o.toWidget)(e,t,{label:n})}(i,t,r)}}),r.for("upcast").elementToElement({view:"hr",model:"horizontalLine"}),e.commands.add("horizontalLine",new i(e))}}var c=n(3);class s extends r.Plugin{static get pluginName(){return"HorizontalLineUI"}init(){const e=this.editor,t=e.t;e.ui.componentFactory.add("horizontalLine",n=>{const r=e.commands.get("horizontalLine"),o=new c.ButtonView(n);return o.set({label:t("Horizontal line"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 9h16v2H2z"/></svg>',tooltip:!0}),o.bind("isEnabled").to(r,"isEnabled"),this.listenTo(o,"execute",()=>{e.execute("horizontalLine"),e.editing.view.focus()}),o})}}class l extends r.Plugin{static get requires(){return[a,s,o.Widget]}static get pluginName(){return"HorizontalLine"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/html-support.js b/core/assets/vendor/ckeditor5/html-support.js
new file mode 100644
index 0000000000000000000000000000000000000000..dbcd5216b184f4564b6439fff3c73c325d76869d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/html-support.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"HTML object":"HTML object"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.htmlSupport=function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=17)}([function(e,t,r){e.exports=r(5)("./src/core.js")},function(e,t,r){"use strict";var n=r(6),o="object"==typeof self&&self&&self.Object===Object&&self,i=n.a||o||Function("return this")();t.a=i},function(e,t,r){e.exports=r(5)("./src/utils.js")},function(e,t,r){"use strict";(function(e){var n=r(6),o="object"==typeof exports&&exports&&!exports.nodeType&&exports,i=o&&"object"==typeof e&&e&&!e.nodeType&&e,l=i&&i.exports===o&&n.a.process,a=function(){try{var e=i&&i.require&&i.require("util").types;return e||l&&l.binding&&l.binding("util")}catch(e){}}();t.a=a}).call(this,r(9)(e))},function(e,t,r){"use strict";(function(e){var n=r(1),o=r(12),i="object"==typeof exports&&exports&&!exports.nodeType&&exports,l=i&&"object"==typeof e&&e&&!e.nodeType&&e,a=l&&l.exports===i?n.a.Buffer:void 0,c=(a?a.isBuffer:void 0)||o.a;t.a=c}).call(this,r(9)(e))},function(e,t){e.exports=CKEditor5.dll},function(e,t,r){"use strict";(function(e){var r="object"==typeof e&&e&&e.Object===Object&&e;t.a=r}).call(this,r(13))},function(e,t,r){"use strict";(function(e){var n=r(1),o="object"==typeof exports&&exports&&!exports.nodeType&&exports,i=o&&"object"==typeof e&&e&&!e.nodeType&&e,l=i&&i.exports===o?n.a.Buffer:void 0,a=l?l.allocUnsafe:void 0;t.a=function(e,t){if(t)return e.slice();var r=e.length,n=a?a(r):new e.constructor(r);return e.copy(n),n}}).call(this,r(9)(e))},function(e,t,r){e.exports=r(5)("./src/widget.js")},function(e,t){e.exports=function(e){if(!e.webpackPolyfill){var t=Object.create(e);t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,"exports",{enumerable:!0}),t.webpackPolyfill=1}return t}},function(e,t,r){e.exports=r(5)("./src/engine.js")},,function(e,t,r){"use strict";t.a=function(){return!1}},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){var n=r(15),o=r(16);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var i={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,i);e.exports=o.locals||{}},function(e,t,r){"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},i=function(){var e={};return function(t){if(void 0===e[t]){var r=document.querySelector(t);if(window.HTMLIFrameElement&&r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(e){r=null}e[t]=r}return e[t]}}(),l=[];function a(e){for(var t=-1,r=0;r<l.length;r++)if(l[r].identifier===e){t=r;break}return t}function c(e,t){for(var r={},n=[],o=0;o<e.length;o++){var i=e[o],c=t.base?i[0]+t.base:i[0],s=r[c]||0,m="".concat(c," ").concat(s);r[c]=s+1;var u=a(m),d={css:i[1],media:i[2],sourceMap:i[3]};-1!==u?(l[u].references++,l[u].updater(d)):l.push({identifier:m,updater:p(d,t),references:1}),n.push(m)}return n}function s(e){var t=document.createElement("style"),n=e.attributes||{};if(void 0===n.nonce){var o=r.nc;o&&(n.nonce=o)}if(Object.keys(n).forEach((function(e){t.setAttribute(e,n[e])})),"function"==typeof e.insert)e.insert(t);else{var l=i(e.insert||"head");if(!l)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");l.appendChild(t)}return t}var m,u=(m=[],function(e,t){return m[e]=t,m.filter(Boolean).join("\n")});function d(e,t,r,n){var o=r?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(e.styleSheet)e.styleSheet.cssText=u(t,o);else{var i=document.createTextNode(o),l=e.childNodes;l[t]&&e.removeChild(l[t]),l.length?e.insertBefore(i,l[t]):e.appendChild(i)}}function h(e,t,r){var n=r.css,o=r.media,i=r.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}var f=null,b=0;function p(e,t){var r,n,o;if(t.singleton){var i=b++;r=f||(f=s(t)),n=d.bind(null,r,i,!1),o=d.bind(null,r,i,!0)}else r=s(t),n=h.bind(null,r,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(r)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var r=c(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var n=0;n<r.length;n++){var o=a(r[n]);l[o].references--}for(var i=c(e,t),s=0;s<r.length;s++){var m=a(r[s]);0===l[m].references&&(l[m].updater(),l.splice(m,1))}r=i}}}},function(e,t){e.exports=":root{--ck-html-object-embed-unfocused-outline-width:1px}.ck-widget.html-object-embed{font-size:var(--ck-font-size-base);background-color:var(--ck-color-base-foreground);padding:var(--ck-spacing-small);padding-top:calc(var(--ck-font-size-tiny) + var(--ck-spacing-large));min-width:calc(76px + var(--ck-spacing-standard))}.ck-widget.html-object-embed:not(.ck-widget_selected):not(:hover){outline:var(--ck-html-object-embed-unfocused-outline-width) dashed var(--ck-color-widget-blurred-border)}.ck-widget.html-object-embed:before{font-weight:400;font-style:normal;position:absolute;content:attr(data-html-object-embed-label);top:0;left:var(--ck-spacing-standard);background:#999;transition:background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);padding:calc(var(--ck-spacing-tiny) + var(--ck-html-object-embed-unfocused-outline-width)) var(--ck-spacing-small) var(--ck-spacing-tiny);border-radius:0 0 var(--ck-border-radius) var(--ck-border-radius);color:var(--ck-color-base-background);font-size:var(--ck-font-size-tiny);font-family:var(--ck-font-face)}.ck-widget.html-object-embed .ck-widget__type-around .ck-widget__type-around__button.ck-widget__type-around__button_before{margin-left:50px}.ck-widget.html-object-embed .html-object-embed__content{pointer-events:none}div.ck-widget.html-object-embed{margin:1em auto}span.ck-widget.html-object-embed{display:inline-block}"},function(e,t,r){"use strict";r.r(t),r.d(t,"GeneralHtmlSupport",(function(){return nn})),r.d(t,"DataFilter",(function(){return Ur})),r.d(t,"DataSchema",(function(){return It})),r.d(t,"HtmlComment",(function(){return on}));var n=r(0),o=r(2),i=[{model:"codeBlock",view:"pre"},{model:"paragraph",view:"p"},{model:"blockQuote",view:"blockquote"},{model:"listItem",view:"li"},{model:"pageBreak",view:"div"},{model:"rawHtml",view:"div"},{model:"table",view:"table"},{model:"tableRow",view:"tr"},{model:"tableCell",view:"td"},{model:"tableCell",view:"th"},{model:"caption",view:"caption"},{model:"caption",view:"figcaption"},{model:"imageBlock",view:"img"},{model:"imageInline",view:"img"},{model:"$htmlSection",modelSchema:{allowChildren:"$block",allowIn:["$root","$htmlSection"],isBlock:!0}},{model:"htmlP",view:"p",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlBlockquote",view:"blockquote",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlTable",view:"table",modelSchema:{allowIn:["$htmlSection","$root"],isBlock:!0}},{model:"htmlTbody",view:"tbody",modelSchema:{allowIn:"htmlTable",isBlock:!0}},{model:"htmlThead",view:"thead",modelSchema:{allowIn:"htmlTable",isBlock:!0}},{model:"htmlTfoot",view:"tfoot",modelSchema:{allowIn:"htmlTable",isBlock:!0}},{model:"htmlCaption",view:"caption",modelSchema:{allowIn:"htmlTable",allowChildren:"$text",isBlock:!0}},{model:"htmlTr",view:"tr",modelSchema:{allowIn:["htmlTable","htmlThead","htmlTbody"],isBlock:!0}},{model:"htmlTd",view:"td",modelSchema:{allowIn:"htmlTr",allowChildren:["$block","$htmlSection"],isBlock:!0}},{model:"htmlTh",view:"th",modelSchema:{allowIn:"htmlTr",allowChildren:["$block","$htmlSection"],isBlock:!0}},{model:"htmlFigure",view:"figure",modelSchema:{inheritAllFrom:"$htmlSection",isBlock:!0}},{model:"htmlFigcaption",view:"figcaption",modelSchema:{allowIn:"htmlFigure",allowChildren:"$text",isBlock:!0}},{model:"htmlAddress",view:"address",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlAside",view:"aside",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlMain",view:"main",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlDetails",view:"details",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlSummary",view:"summary",modelSchema:{allowChildren:"$text",allowIn:"htmlDetails",isBlock:!0}},{model:"htmlDiv",view:"div",paragraphLikeModel:"htmlDivParagraph",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlFieldset",view:"fieldset",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlLegend",view:"legend",modelSchema:{allowIn:"htmlFieldset",allowChildren:"$text"}},{model:"htmlHeader",view:"header",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlFooter",view:"footer",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlForm",view:"form",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlHgroup",view:"hgroup",modelSchema:{allowChildren:["htmlH1","htmlH2","htmlH3","htmlH4","htmlH5","htmlH6"],isBlock:!0}},{model:"htmlH1",view:"h1",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH2",view:"h2",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH3",view:"h3",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH4",view:"h4",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH5",view:"h5",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH6",view:"h6",modelSchema:{inheritAllFrom:"$block"}},{model:"$htmlList",modelSchema:{allowWhere:"$htmlSection",allowChildren:["$htmlList","htmlLi"],isBlock:!0}},{model:"htmlDir",view:"dir",modelSchema:{inheritAllFrom:"$htmlList"}},{model:"htmlMenu",view:"menu",modelSchema:{inheritAllFrom:"$htmlList"}},{model:"htmlUl",view:"ul",modelSchema:{inheritAllFrom:"$htmlList"}},{model:"htmlOl",view:"ol",modelSchema:{inheritAllFrom:"$htmlList"}},{model:"htmlLi",view:"li",modelSchema:{allowIn:"$htmlList",allowChildren:"$text",isBlock:!0}},{model:"htmlPre",view:"pre",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlArticle",view:"article",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlSection",view:"section",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlNav",view:"nav",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlDl",view:"dl",modelSchema:{allowIn:["$htmlSection","$root"],allowChildren:["htmlDt","htmlDd"],isBlock:!0}},{model:"htmlDt",view:"dt",modelSchema:{allowChildren:"$block",isBlock:!0}},{model:"htmlDd",view:"dd",modelSchema:{allowChildren:"$block",isBlock:!0}},{model:"htmlCenter",view:"center",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"$htmlObjectBlock",isObject:!0,modelSchema:{isObject:!0,isBlock:!0,allowWhere:"$block"}}],l=[{model:"htmlAcronym",view:"acronym",attributeProperties:{copyOnEnter:!0}},{model:"htmlTt",view:"tt",attributeProperties:{copyOnEnter:!0}},{model:"htmlFont",view:"font",attributeProperties:{copyOnEnter:!0}},{model:"htmlTime",view:"time",attributeProperties:{copyOnEnter:!0}},{model:"htmlVar",view:"var",attributeProperties:{copyOnEnter:!0}},{model:"htmlBig",view:"big",attributeProperties:{copyOnEnter:!0}},{model:"htmlSmall",view:"small",attributeProperties:{copyOnEnter:!0}},{model:"htmlSamp",view:"samp",attributeProperties:{copyOnEnter:!0}},{model:"htmlQ",view:"q",attributeProperties:{copyOnEnter:!0}},{model:"htmlOutput",view:"output",attributeProperties:{copyOnEnter:!0}},{model:"htmlKbd",view:"kbd",attributeProperties:{copyOnEnter:!0}},{model:"htmlBdi",view:"bdi",attributeProperties:{copyOnEnter:!0}},{model:"htmlBdo",view:"bdo",attributeProperties:{copyOnEnter:!0}},{model:"htmlAbbr",view:"abbr",attributeProperties:{copyOnEnter:!0}},{model:"htmlA",view:"a",priority:5,attributeProperties:{copyOnEnter:!0}},{model:"htmlStrong",view:"strong",attributeProperties:{copyOnEnter:!0}},{model:"htmlB",view:"b",attributeProperties:{copyOnEnter:!0}},{model:"htmlI",view:"i",attributeProperties:{copyOnEnter:!0}},{model:"htmlEm",view:"em",attributeProperties:{copyOnEnter:!0}},{model:"htmlS",view:"s",attributeProperties:{copyOnEnter:!0}},{model:"htmlDel",view:"del",attributeProperties:{copyOnEnter:!0}},{model:"htmlIns",view:"ins",attributeProperties:{copyOnEnter:!0}},{model:"htmlU",view:"u",attributeProperties:{copyOnEnter:!0}},{model:"htmlSub",view:"sub",attributeProperties:{copyOnEnter:!0}},{model:"htmlSup",view:"sup",attributeProperties:{copyOnEnter:!0}},{model:"htmlCode",view:"code",attributeProperties:{copyOnEnter:!0}},{model:"htmlMark",view:"mark",attributeProperties:{copyOnEnter:!0}},{model:"htmlSpan",view:"span",attributeProperties:{copyOnEnter:!0}},{model:"htmlCite",view:"cite",attributeProperties:{copyOnEnter:!0}},{model:"htmlLabel",view:"label",attributeProperties:{copyOnEnter:!0}},{model:"htmlDfn",view:"dfn",attributeProperties:{copyOnEnter:!0}},{model:"$htmlObjectInline",isObject:!0,modelSchema:{isObject:!0,isInline:!0,allowWhere:"$text",allowAttributesOf:"$text"}},{model:"htmlObject",view:"object",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlIframe",view:"iframe",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlInput",view:"input",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlButton",view:"button",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlTextarea",view:"textarea",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlSelect",view:"select",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlVideo",view:"video",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlEmbed",view:"embed",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlOembed",view:"oembed",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlAudio",view:"audio",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlImg",view:"img",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlCanvas",view:"canvas",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlMeter",view:"meter",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlProgress",view:"progress",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}}];var a=function(){this.__data__=[],this.size=0};var c=function(e,t){return e===t||e!=e&&t!=t};var s=function(e,t){for(var r=e.length;r--;)if(c(e[r][0],t))return r;return-1},m=Array.prototype.splice;var u=function(e){var t=this.__data__,r=s(t,e);return!(r<0)&&(r==t.length-1?t.pop():m.call(t,r,1),--this.size,!0)};var d=function(e){var t=this.__data__,r=s(t,e);return r<0?void 0:t[r][1]};var h=function(e){return s(this.__data__,e)>-1};var f=function(e,t){var r=this.__data__,n=s(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this};function b(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}b.prototype.clear=a,b.prototype.delete=u,b.prototype.get=d,b.prototype.has=h,b.prototype.set=f;var p=b;var v=function(){this.__data__=new p,this.size=0};var g=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r};var w=function(e){return this.__data__.get(e)};var y=function(e){return this.__data__.has(e)},j=r(1),A=j.a.Symbol,_=Object.prototype,O=_.hasOwnProperty,S=_.toString,k=A?A.toStringTag:void 0;var E=function(e){var t=O.call(e,k),r=e[k];try{e[k]=void 0;var n=!0}catch(e){}var o=S.call(e);return n&&(t?e[k]=r:delete e[k]),o},$=Object.prototype.toString;var C=function(e){return $.call(e)},I=A?A.toStringTag:void 0;var P=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":I&&I in Object(e)?E(e):C(e)};var x=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)};var F,B=function(e){if(!x(e))return!1;var t=P(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t},T=j.a["__core-js_shared__"],R=(F=/[^.]+$/.exec(T&&T.keys&&T.keys.IE_PROTO||""))?"Symbol(src)_1."+F:"";var M=function(e){return!!R&&R in e},D=Function.prototype.toString;var H=function(e){if(null!=e){try{return D.call(e)}catch(e){}try{return e+""}catch(e){}}return""},L=/^\[object .+?Constructor\]$/,z=Function.prototype,N=Object.prototype,V=z.toString,U=N.hasOwnProperty,q=RegExp("^"+V.call(U).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");var W=function(e){return!(!x(e)||M(e))&&(B(e)?q:L).test(H(e))};var K=function(e,t){return null==e?void 0:e[t]};var G=function(e,t){var r=K(e,t);return W(r)?r:void 0},Q=G(j.a,"Map"),J=G(Object,"create");var X=function(){this.__data__=J?J(null):{},this.size=0};var Y=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},Z=Object.prototype.hasOwnProperty;var ee=function(e){var t=this.__data__;if(J){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return Z.call(t,e)?t[e]:void 0},te=Object.prototype.hasOwnProperty;var re=function(e){var t=this.__data__;return J?void 0!==t[e]:te.call(t,e)};var ne=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=J&&void 0===t?"__lodash_hash_undefined__":t,this};function oe(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}oe.prototype.clear=X,oe.prototype.delete=Y,oe.prototype.get=ee,oe.prototype.has=re,oe.prototype.set=ne;var ie=oe;var le=function(){this.size=0,this.__data__={hash:new ie,map:new(Q||p),string:new ie}};var ae=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e};var ce=function(e,t){var r=e.__data__;return ae(t)?r["string"==typeof t?"string":"hash"]:r.map};var se=function(e){var t=ce(this,e).delete(e);return this.size-=t?1:0,t};var me=function(e){return ce(this,e).get(e)};var ue=function(e){return ce(this,e).has(e)};var de=function(e,t){var r=ce(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this};function he(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}he.prototype.clear=le,he.prototype.delete=se,he.prototype.get=me,he.prototype.has=ue,he.prototype.set=de;var fe=he;var be=function(e,t){var r=this.__data__;if(r instanceof p){var n=r.__data__;if(!Q||n.length<199)return n.push([e,t]),this.size=++r.size,this;r=this.__data__=new fe(n)}return r.set(e,t),this.size=r.size,this};function pe(e){var t=this.__data__=new p(e);this.size=t.size}pe.prototype.clear=v,pe.prototype.delete=g,pe.prototype.get=w,pe.prototype.has=y,pe.prototype.set=be;var ve=pe,ge=function(){try{var e=G(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();var we=function(e,t,r){"__proto__"==t&&ge?ge(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r};var ye=function(e,t,r){(void 0!==r&&!c(e[t],r)||void 0===r&&!(t in e))&&we(e,t,r)};var je=function(e){return function(t,r,n){for(var o=-1,i=Object(t),l=n(t),a=l.length;a--;){var c=l[e?a:++o];if(!1===r(i[c],c,i))break}return t}}(),Ae=r(7),_e=j.a.Uint8Array;var Oe=function(e){var t=new e.constructor(e.byteLength);return new _e(t).set(new _e(e)),t};var Se=function(e,t){var r=t?Oe(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.length)};var ke=function(e,t){var r=-1,n=e.length;for(t||(t=Array(n));++r<n;)t[r]=e[r];return t},Ee=Object.create,$e=function(){function e(){}return function(t){if(!x(t))return{};if(Ee)return Ee(t);e.prototype=t;var r=new e;return e.prototype=void 0,r}}();var Ce=function(e,t){return function(r){return e(t(r))}},Ie=Ce(Object.getPrototypeOf,Object),Pe=Object.prototype;var xe=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||Pe)};var Fe=function(e){return"function"!=typeof e.constructor||xe(e)?{}:$e(Ie(e))};var Be=function(e){return null!=e&&"object"==typeof e};var Te=function(e){return Be(e)&&"[object Arguments]"==P(e)},Re=Object.prototype,Me=Re.hasOwnProperty,De=Re.propertyIsEnumerable,He=Te(function(){return arguments}())?Te:function(e){return Be(e)&&Me.call(e,"callee")&&!De.call(e,"callee")},Le=Array.isArray;var ze=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991};var Ne=function(e){return null!=e&&ze(e.length)&&!B(e)};var Ve=function(e){return Be(e)&&Ne(e)},Ue=r(4),qe=Function.prototype,We=Object.prototype,Ke=qe.toString,Ge=We.hasOwnProperty,Qe=Ke.call(Object);var Je=function(e){if(!Be(e)||"[object Object]"!=P(e))return!1;var t=Ie(e);if(null===t)return!0;var r=Ge.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&Ke.call(r)==Qe},Xe={};Xe["[object Float32Array]"]=Xe["[object Float64Array]"]=Xe["[object Int8Array]"]=Xe["[object Int16Array]"]=Xe["[object Int32Array]"]=Xe["[object Uint8Array]"]=Xe["[object Uint8ClampedArray]"]=Xe["[object Uint16Array]"]=Xe["[object Uint32Array]"]=!0,Xe["[object Arguments]"]=Xe["[object Array]"]=Xe["[object ArrayBuffer]"]=Xe["[object Boolean]"]=Xe["[object DataView]"]=Xe["[object Date]"]=Xe["[object Error]"]=Xe["[object Function]"]=Xe["[object Map]"]=Xe["[object Number]"]=Xe["[object Object]"]=Xe["[object RegExp]"]=Xe["[object Set]"]=Xe["[object String]"]=Xe["[object WeakMap]"]=!1;var Ye=function(e){return Be(e)&&ze(e.length)&&!!Xe[P(e)]};var Ze=function(e){return function(t){return e(t)}},et=r(3),tt=et.a&&et.a.isTypedArray,rt=tt?Ze(tt):Ye;var nt=function(e,t){if(("constructor"!==t||"function"!=typeof e[t])&&"__proto__"!=t)return e[t]},ot=Object.prototype.hasOwnProperty;var it=function(e,t,r){var n=e[t];ot.call(e,t)&&c(n,r)&&(void 0!==r||t in e)||we(e,t,r)};var lt=function(e,t,r,n){var o=!r;r||(r={});for(var i=-1,l=t.length;++i<l;){var a=t[i],c=n?n(r[a],e[a],a,r,e):void 0;void 0===c&&(c=e[a]),o?we(r,a,c):it(r,a,c)}return r};var at=function(e,t){for(var r=-1,n=Array(e);++r<e;)n[r]=t(r);return n},ct=/^(?:0|[1-9]\d*)$/;var st=function(e,t){var r=typeof e;return!!(t=null==t?9007199254740991:t)&&("number"==r||"symbol"!=r&&ct.test(e))&&e>-1&&e%1==0&&e<t},mt=Object.prototype.hasOwnProperty;var ut=function(e,t){var r=Le(e),n=!r&&He(e),o=!r&&!n&&Object(Ue.a)(e),i=!r&&!n&&!o&&rt(e),l=r||n||o||i,a=l?at(e.length,String):[],c=a.length;for(var s in e)!t&&!mt.call(e,s)||l&&("length"==s||o&&("offset"==s||"parent"==s)||i&&("buffer"==s||"byteLength"==s||"byteOffset"==s)||st(s,c))||a.push(s);return a};var dt=function(e){var t=[];if(null!=e)for(var r in Object(e))t.push(r);return t},ht=Object.prototype.hasOwnProperty;var ft=function(e){if(!x(e))return dt(e);var t=xe(e),r=[];for(var n in e)("constructor"!=n||!t&&ht.call(e,n))&&r.push(n);return r};var bt=function(e){return Ne(e)?ut(e,!0):ft(e)};var pt=function(e){return lt(e,bt(e))};var vt=function(e,t,r,n,o,i,l){var a=nt(e,r),c=nt(t,r),s=l.get(c);if(s)ye(e,r,s);else{var m=i?i(a,c,r+"",e,t,l):void 0,u=void 0===m;if(u){var d=Le(c),h=!d&&Object(Ue.a)(c),f=!d&&!h&&rt(c);m=c,d||h||f?Le(a)?m=a:Ve(a)?m=ke(a):h?(u=!1,m=Object(Ae.a)(c,!0)):f?(u=!1,m=Se(c,!0)):m=[]:Je(c)||He(c)?(m=a,He(a)?m=pt(a):x(a)&&!B(a)||(m=Fe(c))):u=!1}u&&(l.set(c,m),o(m,c,n,i,l),l.delete(c)),ye(e,r,m)}};var gt=function e(t,r,n,o,i){t!==r&&je(r,(function(l,a){if(i||(i=new ve),x(l))vt(t,r,a,n,e,o,i);else{var c=o?o(nt(t,a),l,a+"",t,r,i):void 0;void 0===c&&(c=l),ye(t,a,c)}}),bt)};var wt=function(e){return e};var yt=function(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)},jt=Math.max;var At=function(e,t,r){return t=jt(void 0===t?e.length-1:t,0),function(){for(var n=arguments,o=-1,i=jt(n.length-t,0),l=Array(i);++o<i;)l[o]=n[t+o];o=-1;for(var a=Array(t+1);++o<t;)a[o]=n[o];return a[t]=r(l),yt(e,this,a)}};var _t=function(e){return function(){return e}},Ot=ge?function(e,t){return ge(e,"toString",{configurable:!0,enumerable:!1,value:_t(t),writable:!0})}:wt,St=Date.now;var kt=function(e){var t=0,r=0;return function(){var n=St(),o=16-(n-r);if(r=n,o>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(Ot);var Et=function(e,t){return kt(At(e,t,wt),e+"")};var $t=function(e,t,r){if(!x(r))return!1;var n=typeof t;return!!("number"==n?Ne(r)&&st(t,r.length):"string"==n&&t in r)&&c(r[t],e)};var Ct=function(e){return Et((function(t,r){var n=-1,o=r.length,i=o>1?r[o-1]:void 0,l=o>2?r[2]:void 0;for(i=e.length>3&&"function"==typeof i?(o--,i):void 0,l&&$t(r[0],r[1],l)&&(i=o<3?void 0:i,o=1),t=Object(t);++n<o;){var a=r[n];a&&e(t,a,n,i)}return t}))}((function(e,t,r,n){gt(e,t,r,n)}));class It extends n.Plugin{constructor(e){super(e),this._definitions=new Map}static get pluginName(){return"DataSchema"}init(){for(const e of i)this.registerBlockElement(e);for(const e of l)this.registerInlineElement(e)}registerBlockElement(e){this._definitions.set(e.model,{...e,isBlock:!0})}registerInlineElement(e){this._definitions.set(e.model,{...e,isInline:!0})}extendBlockElement(e){this._extendDefinition({...e,isBlock:!0})}extendInlineElement(e){this._extendDefinition({...e,isInline:!0})}getDefinitionsForView(e,t){const r=new Set;for(const n of this._getMatchingViewDefinitions(e)){if(t)for(const e of this._getReferences(n.model))r.add(e);r.add(n)}return r}_getMatchingViewDefinitions(e){return Array.from(this._definitions.values()).filter(t=>t.view&&function(e,t){if("string"==typeof e)return e===t;if(e instanceof RegExp)return e.test(t);return!1}(e,t.view))}*_getReferences(e){const{modelSchema:t}=this._definitions.get(e);if(!t)return;const r=["inheritAllFrom","inheritTypesFrom","allowWhere","allowContentOf","allowAttributesOf"];for(const n of r)for(const r of Object(o.toArray)(t[n]||[])){const t=this._definitions.get(r);r!==e&&t&&(yield*this._getReferences(t.model),yield t)}}_extendDefinition(e){const t=this._definitions.get(e.model),r=Ct({},t,e,(e,t)=>Array.isArray(e)?e.concat(t):void 0);this._definitions.set(e.model,r)}}var Pt=r(10),xt=r(8);var Ft=function(e,t){for(var r=-1,n=null==e?0:e.length;++r<n&&!1!==t(e[r],r,e););return e},Bt=Ce(Object.keys,Object),Tt=Object.prototype.hasOwnProperty;var Rt=function(e){if(!xe(e))return Bt(e);var t=[];for(var r in Object(e))Tt.call(e,r)&&"constructor"!=r&&t.push(r);return t};var Mt=function(e){return Ne(e)?ut(e):Rt(e)};var Dt=function(e,t){return e&&lt(t,Mt(t),e)};var Ht=function(e,t){return e&&lt(t,bt(t),e)};var Lt=function(e,t){for(var r=-1,n=null==e?0:e.length,o=0,i=[];++r<n;){var l=e[r];t(l,r,e)&&(i[o++]=l)}return i};var zt=function(){return[]},Nt=Object.prototype.propertyIsEnumerable,Vt=Object.getOwnPropertySymbols,Ut=Vt?function(e){return null==e?[]:(e=Object(e),Lt(Vt(e),(function(t){return Nt.call(e,t)})))}:zt;var qt=function(e,t){return lt(e,Ut(e),t)};var Wt=function(e,t){for(var r=-1,n=t.length,o=e.length;++r<n;)e[o+r]=t[r];return e},Kt=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)Wt(t,Ut(e)),e=Ie(e);return t}:zt;var Gt=function(e,t){return lt(e,Kt(e),t)};var Qt=function(e,t,r){var n=t(e);return Le(e)?n:Wt(n,r(e))};var Jt=function(e){return Qt(e,Mt,Ut)};var Xt=function(e){return Qt(e,bt,Kt)},Yt=G(j.a,"DataView"),Zt=G(j.a,"Promise"),er=G(j.a,"Set"),tr=G(j.a,"WeakMap"),rr=H(Yt),nr=H(Q),or=H(Zt),ir=H(er),lr=H(tr),ar=P;(Yt&&"[object DataView]"!=ar(new Yt(new ArrayBuffer(1)))||Q&&"[object Map]"!=ar(new Q)||Zt&&"[object Promise]"!=ar(Zt.resolve())||er&&"[object Set]"!=ar(new er)||tr&&"[object WeakMap]"!=ar(new tr))&&(ar=function(e){var t=P(e),r="[object Object]"==t?e.constructor:void 0,n=r?H(r):"";if(n)switch(n){case rr:return"[object DataView]";case nr:return"[object Map]";case or:return"[object Promise]";case ir:return"[object Set]";case lr:return"[object WeakMap]"}return t});var cr=ar,sr=Object.prototype.hasOwnProperty;var mr=function(e){var t=e.length,r=new e.constructor(t);return t&&"string"==typeof e[0]&&sr.call(e,"index")&&(r.index=e.index,r.input=e.input),r};var ur=function(e,t){var r=t?Oe(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.byteLength)},dr=/\w*$/;var hr=function(e){var t=new e.constructor(e.source,dr.exec(e));return t.lastIndex=e.lastIndex,t},fr=A?A.prototype:void 0,br=fr?fr.valueOf:void 0;var pr=function(e){return br?Object(br.call(e)):{}};var vr=function(e,t,r){var n=e.constructor;switch(t){case"[object ArrayBuffer]":return Oe(e);case"[object Boolean]":case"[object Date]":return new n(+e);case"[object DataView]":return ur(e,r);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return Se(e,r);case"[object Map]":return new n;case"[object Number]":case"[object String]":return new n(e);case"[object RegExp]":return hr(e);case"[object Set]":return new n;case"[object Symbol]":return pr(e)}};var gr=function(e){return Be(e)&&"[object Map]"==cr(e)},wr=et.a&&et.a.isMap,yr=wr?Ze(wr):gr;var jr=function(e){return Be(e)&&"[object Set]"==cr(e)},Ar=et.a&&et.a.isSet,_r=Ar?Ze(Ar):jr,Or={};Or["[object Arguments]"]=Or["[object Array]"]=Or["[object ArrayBuffer]"]=Or["[object DataView]"]=Or["[object Boolean]"]=Or["[object Date]"]=Or["[object Float32Array]"]=Or["[object Float64Array]"]=Or["[object Int8Array]"]=Or["[object Int16Array]"]=Or["[object Int32Array]"]=Or["[object Map]"]=Or["[object Number]"]=Or["[object Object]"]=Or["[object RegExp]"]=Or["[object Set]"]=Or["[object String]"]=Or["[object Symbol]"]=Or["[object Uint8Array]"]=Or["[object Uint8ClampedArray]"]=Or["[object Uint16Array]"]=Or["[object Uint32Array]"]=!0,Or["[object Error]"]=Or["[object Function]"]=Or["[object WeakMap]"]=!1;var Sr=function e(t,r,n,o,i,l){var a,c=1&r,s=2&r,m=4&r;if(n&&(a=i?n(t,o,i,l):n(t)),void 0!==a)return a;if(!x(t))return t;var u=Le(t);if(u){if(a=mr(t),!c)return ke(t,a)}else{var d=cr(t),h="[object Function]"==d||"[object GeneratorFunction]"==d;if(Object(Ue.a)(t))return Object(Ae.a)(t,c);if("[object Object]"==d||"[object Arguments]"==d||h&&!i){if(a=s||h?{}:Fe(t),!c)return s?Gt(t,Ht(a,t)):qt(t,Dt(a,t))}else{if(!Or[d])return i?t:{};a=vr(t,d,c)}}l||(l=new ve);var f=l.get(t);if(f)return f;l.set(t,a),_r(t)?t.forEach((function(o){a.add(e(o,r,n,o,t,l))})):yr(t)&&t.forEach((function(o,i){a.set(i,e(o,r,n,i,t,l))}));var b=u?void 0:(m?s?Xt:Jt:s?bt:Mt)(t);return Ft(b||t,(function(o,i){b&&(o=t[i=o]),it(a,i,e(o,r,n,i,t,l))})),a};var kr=function(e){return Sr(e,5)};function Er(e,t,r){if(t.attributes)for(const[n,o]of Object.entries(t.attributes))e.setAttribute(n,o,r);t.styles&&e.setStyle(t.styles,r),t.classes&&e.addClass(t.classes,r)}function $r(e,t){const r=kr(e);for(const n in t)Array.isArray(t[n])?r[n]=Array.from(new Set([...e[n],...t[n]])):r[n]={...e[n],...t[n]};return r}function Cr({model:e}){return(t,r)=>r.writer.createElement(e,{htmlContent:t.getCustomProperty("$rawContent")})}function Ir(e,{view:t,isInline:r}){const n=e.t;return(e,{writer:o,consumable:i})=>{const l=n("HTML object"),a=o.createContainerElement(r?"span":"div",{class:"html-object-embed","data-html-object-embed-label":l},{isAllowedInsideAttributeElement:r}),c=Pr(t,e,o);o.addClass("html-object-embed__content",c);const s=e.getAttribute("htmlAttributes");return s&&i.consume(e,"attribute:htmlAttributes:"+e.name)&&Er(o,s,c),o.insert(o.createPositionAt(a,0),c),Object(xt.toWidget)(a,o,{widgetLabel:l})}}function Pr(e,t,r){return r.createRawElement(e,null,(e,r)=>{r.setContentOf(e,t.getAttribute("htmlContent"))})}function xr({priority:e,view:t}){return(r,n)=>{if(!r)return;const{writer:o}=n,i=o.createAttributeElement(t,null,{priority:e});return Er(o,r,i),i}}function Fr({view:e},t){return r=>{r.on("element:"+e,(e,r,n)=>{if(!r.modelRange)return;const o=t._consumeAllowedAttributes(r.viewItem,n);o&&n.writer.setAttribute("htmlAttributes",o,r.modelRange)},{priority:"low"})}}function Br({model:e}){return t=>{t.on("attribute:htmlAttributes:"+e,(e,t,r)=>{const n=t.attributeNewValue;if(!r.consumable.consume(t.item,e.name))return;Er(r.writer,n,r.mapper.toViewElement(t.item))})}}var Tr=function(e,t){for(var r=-1,n=null==e?0:e.length,o=Array(n);++r<n;)o[r]=t(e[r],r,e);return o};var Rr=function(e,t,r,n){for(var o=e.length,i=r+(n?1:-1);n?i--:++i<o;)if(t(e[i],i,e))return i;return-1};var Mr=function(e){return e!=e};var Dr=function(e,t,r){for(var n=r-1,o=e.length;++n<o;)if(e[n]===t)return n;return-1};var Hr=function(e,t,r){return t==t?Dr(e,t,r):Rr(e,Mr,r)};var Lr=function(e,t,r,n){for(var o=r-1,i=e.length;++o<i;)if(n(e[o],t))return o;return-1},zr=Array.prototype.splice;var Nr=function(e,t,r,n){var o=n?Lr:Hr,i=-1,l=t.length,a=e;for(e===t&&(t=ke(t)),r&&(a=Tr(e,Ze(r)));++i<l;)for(var c=0,s=t[i],m=r?r(s):s;(c=o(a,m,c,n))>-1;)a!==e&&zr.call(a,c,1),zr.call(e,c,1);return e};var Vr=Et((function(e,t){return e&&e.length&&t&&t.length?Nr(e,t):e}));r(14);class Ur extends n.Plugin{constructor(e){super(e),this._dataSchema=e.plugins.get("DataSchema"),this._allowedAttributes=new Pt.Matcher,this._disallowedAttributes=new Pt.Matcher,this._allowedElements=new Set,this._dataInitialized=!1,this._registerElementsAfterInit(),this._registerElementHandlers()}static get pluginName(){return"DataFilter"}static get requires(){return[It,xt.Widget]}loadAllowedConfig(e){this._loadConfig(e,e=>this.allowAttributes(e))}loadDisallowedConfig(e){this._loadConfig(e,e=>this.disallowAttributes(e))}allowElement(e){for(const t of this._dataSchema.getDefinitionsForView(e,!0))this._allowedElements.has(t)||(this._allowedElements.add(t),this._dataInitialized&&this._fireRegisterEvent(t))}allowAttributes(e){this._allowedAttributes.add(e)}disallowAttributes(e){this._disallowedAttributes.add(e)}_loadConfig(e,t){for(const r of e){const e=r.name||/[\s\S]+/;this.allowElement(e),Qr(r).forEach(t)}}_consumeAllowedAttributes(e,t){return qr(e,t,this._disallowedAttributes),qr(e,t,this._allowedAttributes)}_registerElementsAfterInit(){this.editor.data.on("init",()=>{this._dataInitialized=!0;for(const e of this._allowedElements)this._fireRegisterEvent(e)},{priority:o.priorities.get("high")+1})}_registerElementHandlers(){this.on("register",(e,t)=>{const r=this.editor.model.schema;if(t.isObject&&!r.isRegistered(t.model))this._registerObjectElement(t);else if(t.isBlock)this._registerBlockElement(t);else{if(!t.isInline)throw new o.CKEditorError("data-filter-invalid-definition",null,t);this._registerInlineElement(t)}e.stop()},{priority:"lowest"})}_fireRegisterEvent(e){this.fire(e.view?"register:"+e.view:"register",e)}_registerObjectElement(e){const t=this.editor,r=t.model.schema,n=t.conversion,{view:i,model:l}=e;r.register(l,e.modelSchema),i&&(r.extend(e.model,{allowAttributes:["htmlAttributes","htmlContent"]}),t.data.registerRawContentMatcher({name:i}),n.for("upcast").elementToElement({view:i,model:Cr(e),converterPriority:o.priorities.get("low")+1}),n.for("upcast").add(Fr(e,this)),n.for("editingDowncast").elementToElement({model:l,view:Ir(t,e)}),n.for("dataDowncast").elementToElement({model:l,view:(e,{writer:t})=>Pr(i,e,t)}),n.for("dataDowncast").add(Br(e)))}_registerBlockElement(e){const t=this.editor,r=t.model.schema,n=t.conversion,{view:i,model:l}=e;if(!r.isRegistered(e.model)){if(r.register(e.model,e.modelSchema),!i)return;n.for("upcast").elementToElement({model:l,view:i,converterPriority:o.priorities.get("low")+1}),n.for("downcast").elementToElement({model:l,view:i})}i&&(r.extend(e.model,{allowAttributes:"htmlAttributes"}),n.for("upcast").add(Fr(e,this)),n.for("downcast").add(Br(e)))}_registerInlineElement(e){const t=this.editor,r=t.model.schema,n=t.conversion,o=e.model;r.extend("$text",{allowAttributes:o}),e.attributeProperties&&r.setAttributeProperties(o,e.attributeProperties),n.for("upcast").add(function({view:e,model:t},r){return n=>{n.on("element:"+e,(e,n,o)=>{const i=r._consumeAllowedAttributes(n.viewItem,o);n.modelRange||(n=Object.assign(n,o.convertChildren(n.viewItem,n.modelCursor)));for(const e of n.modelRange.getItems())if(o.schema.checkAttribute(e,t)){const r=$r(i||{},e.getAttribute(t)||{});o.writer.setAttribute(t,r,e)}},{priority:"low"})}}(e,this)),n.for("downcast").attributeToElement({model:o,view:xr(e)})}}function qr(e,t,r){const n=function(e,{consumable:t},r){const n=r.matchAll(e)||[],o=[];for(const r of n)Wr(t,e,r),delete r.match.name,t.consume(e,r.match)&&o.push(r);return o}(e,t,r),{attributes:o,styles:i,classes:l}=function(e){const t={attributes:new Set,classes:new Set,styles:new Set};for(const r of e)for(const e in t){(r.match[e]||[]).forEach(r=>t[e].add(r))}return t}(n),a={};return o.size&&(a.attributes=Kr(o,t=>e.getAttribute(t))),i.size&&(a.styles=Kr(i,t=>e.getStyle(t))),l.size&&(a.classes=Array.from(l)),Object.keys(a).length?a:null}function Wr(e,t,r){for(const n of["attributes","classes","styles"]){const o=r.match[n];if(o)for(const r of o)e.test(t,{[n]:[r]})||Vr(o,r)}}function Kr(e,t){const r={};for(const n of e){void 0!==t(n)&&(r[n]=t(n))}return r}function Gr(e,t){const{name:r}=e;return Je(e[t])?Object.entries(e[t]).map(([e,n])=>({name:r,[t]:{[e]:n}})):Array.isArray(e[t])?e[t].map(e=>({name:r,[t]:[e]})):[e]}function Qr(e){const{name:t,attributes:r,classes:n,styles:o}=e,i=[];return r&&i.push(...Gr({name:t,attributes:r},"attributes")),n&&i.push(...Gr({name:t,classes:n},"classes")),o&&i.push(...Gr({name:t,styles:o},"styles")),i}class Jr extends n.Plugin{static get requires(){return[Ur]}init(){if(!this.editor.plugins.has("CodeBlockEditing"))return;const e=this.editor.plugins.get(Ur);e.on("register:pre",(t,r)=>{if("codeBlock"!==r.model)return;const n=this.editor,o=n.model.schema,i=n.conversion;o.extend("codeBlock",{allowAttributes:["htmlAttributes","htmlContentAttributes"]}),i.for("upcast").add(function(e){return t=>{t.on("element:code",(t,r,n)=>{const o=r.viewItem,i=o.parent;function l(t,o){const i=e._consumeAllowedAttributes(t,n);i&&n.writer.setAttribute(o,i,r.modelRange)}i&&i.is("element","pre")&&(l(i,"htmlAttributes"),l(o,"htmlContentAttributes"))},{priority:"low"})}}(e)),i.for("downcast").add(e=>{e.on("attribute:htmlAttributes:codeBlock",(e,t,r)=>{if(!r.consumable.consume(t.item,e.name))return;const n=r.mapper.toViewElement(t.item).parent;Er(r.writer,t.attributeNewValue,n)}),e.on("attribute:htmlContentAttributes:codeBlock",(e,t,r)=>{if(!r.consumable.consume(t.item,e.name))return;const n=r.mapper.toViewElement(t.item);Er(r.writer,t.attributeNewValue,n)})}),t.stop()})}}class Xr extends n.Plugin{static get requires(){return[Ur]}init(){this.editor.plugins.get(Ur).on("register",(e,t)=>{const r=this.editor,n=r.model.schema,i=r.conversion;if(!t.paragraphLikeModel)return;if(n.isRegistered(t.model)||n.isRegistered(t.paragraphLikeModel))return;const l={model:t.paragraphLikeModel,view:t.view};n.register(t.model,t.modelSchema),n.register(l.model,{inheritAllFrom:"$block"}),i.for("upcast").elementToElement({view:t.view,model:(e,{writer:r})=>this._hasBlockContent(e)?r.createElement(t.model):r.createElement(l.model),converterPriority:o.priorities.get("low")+1}),i.for("downcast").elementToElement({view:t.view,model:t.model}),this._addAttributeConversion(t),i.for("downcast").elementToElement({view:l.view,model:l.model}),this._addAttributeConversion(l),e.stop()})}_hasBlockContent(e){const t=this.editor.editing.view.domConverter.blockElements;return Array.from(e.getChildren()).some(e=>t.includes(e.name))}_addAttributeConversion(e){const t=this.editor,r=t.conversion,n=t.plugins.get(Ur);t.model.schema.extend(e.model,{allowAttributes:"htmlAttributes"}),r.for("upcast").add(Fr(e,n)),r.for("downcast").add(Br(e))}}class Yr extends n.Plugin{static get requires(){return[It]}init(){const e=this.editor;if(!e.plugins.has("HeadingEditing"))return;const t=e.plugins.get(It),r=e.config.get("heading.options"),n=[];for(const e of r)"model"in e&&"view"in e&&(t.registerBlockElement({view:e.view,model:e.model}),n.push(e.model));t.extendBlockElement({model:"htmlHgroup",modelSchema:{allowChildren:n}})}}class Zr extends n.Plugin{static get requires(){return[Ur]}init(){const e=this.editor;if(!e.plugins.has("ImageInlineEditing")&&!e.plugins.has("ImageBlockEditing"))return;const t=e.model.schema,r=e.conversion,n=e.plugins.get(Ur);n.on("register:img",(e,o)=>{"imageBlock"!==o.model&&"imageInline"!==o.model||(t.isRegistered("imageBlock")&&t.extend("imageBlock",{allowAttributes:["htmlAttributes","htmlFigureAttributes","htmlLinkAttributes"]}),t.isRegistered("imageInline")&&t.extend("imageInline",{allowAttributes:["htmlA","htmlAttributes"]}),r.for("upcast").add(function(e){return t=>{t.on("element:img",(t,r,n)=>{const o=r.viewItem,i=o.parent;function l(t,o){const i=e._consumeAllowedAttributes(t,n);i&&n.writer.setAttribute(o,i,r.modelRange)}l(o,"htmlAttributes"),i.is("element","figure")?l(i,"htmlFigureAttributes"):i.is("element","a")&&function(e){r.modelRange&&r.modelRange.getContainedElement().is("element","imageBlock")&&l(e,"htmlLinkAttributes");e.parent.is("element","figure")&&l(e.parent,"htmlFigureAttributes")}(i)},{priority:"low"})}}(n)),r.for("downcast").add(e=>{var t;function r(t,r){e.on(`attribute:${r}:imageBlock`,(e,r,n)=>{if(!n.consumable.consume(r.item,e.name))return;const o=n.mapper.toViewElement(r.item),i=en(n.writer,o,t);Er(n.writer,r.attributeNewValue,i)},{priority:"low"})}t="htmlAttributes",e.on(`attribute:${t}:imageInline`,(e,t,r)=>{if(!r.consumable.consume(t.item,e.name))return;const n=r.mapper.toViewElement(t.item);Er(r.writer,t.attributeNewValue,n)},{priority:"low"}),r("img","htmlAttributes"),r("figure","htmlFigureAttributes"),e.on("attribute:linkHref:imageBlock",(e,t,r)=>{if(!r.consumable.consume(t.item,"attribute:htmlLinkAttributes:imageBlock"))return;const n=r.mapper.toViewElement(t.item),o=en(r.writer,n,"a");Er(r.writer,t.item.getAttribute("htmlLinkAttributes"),o)},{priority:"low"})}),e.stop())})}}function en(e,t,r){const n=e.createRangeOn(t);for(const{item:e}of n.getWalker())if(e.is("element",r))return e}class tn extends n.Plugin{static get requires(){return[Ur]}init(){const e=this.editor;if(!e.plugins.has("MediaEmbed")||e.config.get("mediaEmbed.previewsInData"))return;const t=e.model.schema,r=e.conversion,n=this.editor.plugins.get(Ur),o=this.editor.plugins.get(It),i=e.config.get("mediaEmbed.elementName");o.registerBlockElement({model:"media",view:i}),n.on("register:"+i,(e,o)=>{"media"===o.model&&(t.extend("media",{allowAttributes:["htmlAttributes","htmlFigureAttributes"]}),r.for("upcast").add(function(e,t){return e=>{e.on("element:"+t,r)};function r(t,r,n){const o=r.viewItem,i=o.parent;function l(t,o){const i=e._consumeAllowedAttributes(t,n);i&&n.writer.setAttribute(o,i,r.modelRange)}l(o,"htmlAttributes"),i.is("element","figure")&&i.hasClass("media")&&l(i,"htmlFigureAttributes")}}(n,i)),r.for("dataDowncast").add(function(e){return t=>{function r(e,r){t.on(`attribute:${r}:media`,(t,r,n)=>{if(!n.consumable.consume(r.item,t.name))return;const o=n.mapper.toViewElement(r.item),i=function(e,t,r){const n=e.createRangeOn(t);for(const{item:e}of n.getWalker())if(e.is("element",r))return e}(n.writer,o,e);Er(n.writer,r.attributeNewValue,i)})}r(e,"htmlAttributes"),r("figure","htmlFigureAttributes")}}(i)),e.stop())})}}class rn extends n.Plugin{static get requires(){return[Ur]}init(){const e=this.editor;if(!e.plugins.has("TableEditing"))return;const t=e.model.schema,r=e.conversion,n=e.plugins.get(Ur);n.on("register:table",(e,o)=>{"table"===o.model&&(t.extend("table",{allowAttributes:["htmlAttributes","htmlFigureAttributes","htmlTheadAttributes","htmlTbodyAttributes"]}),r.for("upcast").add(function(e){return t=>{t.on("element:table",(t,r,n)=>{const o=r.viewItem;l(o,"htmlAttributes");const i=o.parent;i.is("element","figure")&&l(i,"htmlFigureAttributes");for(const e of o.getChildren())e.is("element","thead")&&l(e,"htmlTheadAttributes"),e.is("element","tbody")&&l(e,"htmlTbodyAttributes");function l(t,o){const i=e._consumeAllowedAttributes(t,n);i&&n.writer.setAttribute(o,i,r.modelRange)}},{priority:"low"})}}(n)),r.for("downcast").add(e=>{function t(t,r){e.on(`attribute:${r}:table`,(e,r,n)=>{if(!n.consumable.consume(r.item,e.name))return;const o=n.mapper.toViewElement(r.item),i=function(e,t,r){const n=e.createRangeOn(t);for(const{item:e}of n.getWalker())if(e.is("element",r))return e}(n.writer,o,t);Er(n.writer,r.attributeNewValue,i)})}t("table","htmlAttributes"),t("figure","htmlFigureAttributes"),t("thead","htmlTheadAttributes"),t("tbody","htmlTbodyAttributes")}),e.stop())})}}class nn extends n.Plugin{static get pluginName(){return"GeneralHtmlSupport"}static get requires(){return[Ur,Jr,Xr,Yr,Zr,tn,rn]}init(){const e=this.editor,t=e.plugins.get(Ur);t.loadAllowedConfig(e.config.get("htmlSupport.allow")||[]),t.loadDisallowedConfig(e.config.get("htmlSupport.disallow")||[])}}class on extends n.Plugin{static get pluginName(){return"HtmlComment"}init(){const e=this.editor;e.model.schema.addAttributeCheck((e,t)=>{if(e.endsWith("$root")&&t.startsWith("$comment"))return!0}),e.conversion.for("upcast").elementToMarker({view:"$comment",model:(e,{writer:t})=>{const r=this.editor.model.document.getRoot(),n=e.getCustomProperty("$rawContent"),i="$comment:"+Object(o.uid)();return t.setAttribute(i,n,r),i}}),e.conversion.for("dataDowncast").markerToElement({model:"$comment",view:(e,{writer:t})=>{const r=this.editor.model.document.getRoot(),n=e.markerName,o=r.getAttribute(n),i=t.createUIElement("$comment");return t.setCustomProperty("$rawContent",o,i),i}}),e.model.document.registerPostFixer(t=>{const r=e.model.document.getRoot(),n=e.model.document.differ.getChangedMarkers().filter(e=>e.name.startsWith("$comment")).filter(e=>{const t=e.data.newRange;return t&&"$graveyard"===t.root.rootName});if(0===n.length)return!1;for(const e of n)t.removeMarker(e.name),t.removeAttribute(e.name,r);return!0}),e.data.on("set",()=>{for(const t of e.model.markers.getMarkersGroup("$comment"))this.removeHtmlComment(t.name)},{priority:"high"}),e.model.on("deleteContent",(t,[r])=>{for(const t of r.getRanges()){const r=e.model.schema.getLimitElement(t),n=e.model.createPositionAt(r,0),o=e.model.createPositionAt(r,"end");let i;i=n.isTouching(t.start)&&o.isTouching(t.end)?this.getHtmlCommentsInRange(e.model.createRange(n,o)):this.getHtmlCommentsInRange(t,{skipBoundaries:!0});for(const e of i)this.removeHtmlComment(e)}},{priority:"high"})}createHtmlComment(e,t){const r=Object(o.uid)(),n=this.editor.model,i=n.document.getRoot(),l="$comment:"+r;return n.change(r=>{const n=r.createRange(e);return r.addMarker(l,{usingOperation:!0,affectsData:!0,range:n}),r.setAttribute(l,t,i),l})}removeHtmlComment(e){const t=this.editor,r=t.model.document.getRoot(),n=t.model.markers.get(e);return!!n&&(t.model.change(t=>{t.removeMarker(n),t.removeAttribute(e,r)}),!0)}getHtmlCommentData(e){const t=this.editor,r=t.model.markers.get(e),n=t.model.document.getRoot();return r?{content:n.getAttribute(e),position:r.getStart()}:null}getHtmlCommentsInRange(e,{skipBoundaries:t=!1}={}){const r=!t;return Array.from(this.editor.model.markers.getMarkersGroup("$comment")).filter(t=>function(e,t){const n=e.getRange().start;return(n.isAfter(t.start)||r&&n.isEqual(t.start))&&(n.isBefore(t.end)||r&&n.isEqual(t.end))}(t,e)).map(e=>e.name)}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/image.js b/core/assets/vendor/ckeditor5/image.js
new file mode 100644
index 0000000000000000000000000000000000000000..7cd670421a004b86cff5d06bf6f7065d5848a98d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/image.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Break text":"Break text","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Enter image caption":"Enter image caption","Full size image":"Full size image","Image resize list":"Image resize list","Image toolbar":"Image toolbar","image widget":"image widget","In line":"In line",Insert:"Insert","Insert image":"Insert image","Insert image via URL":"Insert image via URL","Left aligned image":"Left aligned image",Original:"Original","Resize image":"Resize image","Resize image to %0":"Resize image to %0","Resize image to the original size":"Resize image to the original size","Right aligned image":"Right aligned image","Side image":"Side image","Text alternative":"Text alternative",Update:"Update","Update image URL":"Update image URL","Upload failed":"Upload failed","Wrap text":"Wrap text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.image=function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=34)}([function(e,t,i){e.exports=i(7)("./src/core.js")},function(e,t,i){e.exports=i(7)("./src/ui.js")},function(e,t,i){e.exports=i(7)("./src/utils.js")},function(e,t,i){e.exports=i(7)("./src/widget.js")},function(e,t,i){e.exports=i(7)("./src/engine.js")},function(e,t,i){"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},a=function(){var e={};return function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}e[t]=i}return e[t]}}(),s=[];function r(e){for(var t=-1,i=0;i<s.length;i++)if(s[i].identifier===e){t=i;break}return t}function l(e,t){for(var i={},n=[],o=0;o<e.length;o++){var a=e[o],l=t.base?a[0]+t.base:a[0],c=i[l]||0,g="".concat(l," ").concat(c);i[l]=c+1;var d=r(g),m={css:a[1],media:a[2],sourceMap:a[3]};-1!==d?(s[d].references++,s[d].updater(m)):s.push({identifier:g,updater:f(m,t),references:1}),n.push(g)}return n}function c(e){var t=document.createElement("style"),n=e.attributes||{};if(void 0===n.nonce){var o=i.nc;o&&(n.nonce=o)}if(Object.keys(n).forEach((function(e){t.setAttribute(e,n[e])})),"function"==typeof e.insert)e.insert(t);else{var s=a(e.insert||"head");if(!s)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");s.appendChild(t)}return t}var g,d=(g=[],function(e,t){return g[e]=t,g.filter(Boolean).join("\n")});function m(e,t,i,n){var o=i?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(e.styleSheet)e.styleSheet.cssText=d(t,o);else{var a=document.createTextNode(o),s=e.childNodes;s[t]&&e.removeChild(s[t]),s.length?e.insertBefore(a,s[t]):e.appendChild(a)}}function u(e,t,i){var n=i.css,o=i.media,a=i.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),a&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}var p=null,h=0;function f(e,t){var i,n,o;if(t.singleton){var a=h++;i=p||(p=c(t)),n=m.bind(null,i,a,!1),o=m.bind(null,i,a,!0)}else i=c(t),n=u.bind(null,i,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(i)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var i=l(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var n=0;n<i.length;n++){var o=r(i[n]);s[o].references--}for(var a=l(e,t),c=0;c<i.length;c++){var g=r(i[c]);0===s[g].references&&(s[g].updater(),s.splice(g,1))}i=a}}}},function(e,t,i){e.exports=i(7)("./src/upload.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,i){e.exports=i(7)("./src/clipboard.js")},function(e,t,i){var n=i(5),o=i(17);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t,i){e.exports=i(7)("./src/undo.js")},function(e,t,i){e.exports=i(7)("./src/typing.js")},,function(e,t,i){var n=i(5),o=i(14);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-text-alternative-form{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-text-alternative-form .ck-labeled-field-view{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-field-view{flex-basis:100%}.ck.ck-text-alternative-form .ck-button{flex-basis:50%}}"},function(e,t,i){var n=i(5),o=i(16);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports='.ck-vertical-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-text-width)*0.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){padding:var(--ck-spacing-standard);margin-top:var(--ck-spacing-large);border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after,[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}'},function(e,t){e.exports=".ck-content .image{display:table;clear:both;text-align:center;margin:.9em auto;min-width:50px}.ck-content .image img{display:block;margin:0 auto;max-width:100%;min-width:100%}.ck-content .image-inline{display:inline-flex;max-width:100%;align-items:flex-start}.ck-content .image-inline picture{display:flex}.ck-content .image-inline img,.ck-content .image-inline picture{flex-grow:1;flex-shrink:1;max-width:100%}.ck.ck-editor__editable .image>figcaption.ck-placeholder:before{padding-left:inherit;padding-right:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ck.ck-editor__editable .image-inline.ck-widget_selected,.ck.ck-editor__editable .image.ck-widget_selected{z-index:1}.ck.ck-editor__editable .image-inline.ck-widget_selected ::selection{display:none}.ck.ck-editor__editable td .image-inline img,.ck.ck-editor__editable th .image-inline img{max-width:none}"},function(e,t,i){var n=i(5),o=i(19);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=":root{--ck-color-image-caption-background:#f7f7f7;--ck-color-image-caption-text:#333;--ck-color-image-caption-highligted-background:#fd0}.ck-content .image>figcaption{display:table-caption;caption-side:bottom;word-break:break-word;color:var(--ck-color-image-caption-text);background-color:var(--ck-color-image-caption-background);padding:.6em;font-size:.75em;outline-offset:-1px}.ck.ck-editor__editable .image>figcaption.image__caption_highlighted{animation:ck-image-caption-highlight .6s ease-out}@keyframes ck-image-caption-highlight{0%{background-color:var(--ck-color-image-caption-highligted-background)}to{background-color:var(--ck-color-image-caption-background)}}"},function(e,t,i){var n=i(5),o=i(21);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-editor__editable .image,.ck.ck-editor__editable .image-inline{position:relative}.ck.ck-editor__editable .image-inline .ck-progress-bar,.ck.ck-editor__editable .image .ck-progress-bar{position:absolute;top:0;left:0}.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:fadeIn .7s}.ck.ck-editor__editable .image-inline .ck-progress-bar,.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(e,t,i){var n=i(5),o=i(23);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports='.ck-image-upload-complete-icon{display:block;position:absolute;top:min(var(--ck-spacing-medium),6%);right:min(var(--ck-spacing-medium),6%);border-radius:50%;z-index:1}.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:20;--ck-image-upload-icon-width:2px;--ck-image-upload-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck-image-upload-complete-icon{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:calc(1px*var(--ck-image-upload-icon-size));animation-delay:0ms,3s;overflow:hidden;width:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size));height:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size))}.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(e,t,i){var n=i(5),o=i(25);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.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(e,t,i){var n=i(5),o=i(27);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-image-insert-form:focus{outline:none}.ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-image-insert-form__action-row{margin-top:var(--ck-spacing-standard)}.ck.ck-form__row.ck-image-insert-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-image-insert-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row.ck-image-insert-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}"},function(e,t,i){var n=i(5),o=i(29);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-image-insert__panel{padding:var(--ck-spacing-large)}.ck.ck-image-insert__ck-finder-button{display:block;width:100%;margin:var(--ck-spacing-standard) auto;border:1px solid #ccc;border-radius:var(--ck-border-radius)}.ck.ck-splitbutton>.ck-file-dialog-button.ck-button{padding:0;margin:0;border:none}"},function(e,t,i){var n=i(5),o=i(31);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.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}.ck.ck-editor__editable td .image-inline.image_resized img,.ck.ck-editor__editable th .image-inline.image_resized img{max-width:100%}[dir=ltr] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-left:var(--ck-spacing-standard)}.ck.ck-dropdown .ck-button.ck-resize-image-button .ck-button__label{width:4em}"},function(e,t,i){var n=i(5),o=i(33);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=":root{--ck-image-style-spacing:1.5em;--ck-inline-image-style-spacing:calc(var(--ck-image-style-spacing)/2)}.ck-content .image-style-block-align-left,.ck-content .image-style-block-align-right{max-width:calc(100% - var(--ck-image-style-spacing))}.ck-content .image-style-align-left,.ck-content .image-style-align-right{clear:none}.ck-content .image-style-side{float:right;margin-left:var(--ck-image-style-spacing);max-width:50%}.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)}.ck-content .image-style-block-align-right{margin-right:0;margin-left:auto}.ck-content .image-style-block-align-left{margin-left:0;margin-right:auto}.ck-content p+.image-style-align-left,.ck-content p+.image-style-align-right,.ck-content p+.image-style-side{margin-top:0}.ck-content .image-inline.image-style-align-left,.ck-content .image-inline.image-style-align-right{margin-top:var(--ck-inline-image-style-spacing);margin-bottom:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-left{margin-right:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-right{margin-left:var(--ck-inline-image-style-spacing)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-background)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after{display:none}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-hover-background)}"},function(e,t,i){"use strict";i.r(t),i.d(t,"AutoImage",(function(){return f})),i.d(t,"Image",(function(){return U})),i.d(t,"ImageEditing",(function(){return S})),i.d(t,"ImageCaption",(function(){return D})),i.d(t,"ImageCaptionEditing",(function(){return N})),i.d(t,"ImageInsert",(function(){return re})),i.d(t,"ImageInsertUI",(function(){return se})),i.d(t,"ImageResize",(function(){return he})),i.d(t,"ImageResizeButtons",(function(){return de})),i.d(t,"ImageResizeEditing",(function(){return ce})),i.d(t,"ImageResizeHandles",(function(){return pe})),i.d(t,"ImageStyle",(function(){return je})),i.d(t,"ImageStyleEditing",(function(){return Ae})),i.d(t,"ImageStyleUI",(function(){return Re})),i.d(t,"ImageTextAlternative",(function(){return y})),i.d(t,"ImageTextAlternativeEditing",(function(){return k})),i.d(t,"ImageTextAlternativeUI",(function(){return _})),i.d(t,"ImageToolbar",(function(){return Ne})),i.d(t,"ImageUpload",(function(){return ie})),i.d(t,"ImageUploadEditing",(function(){return ee})),i.d(t,"ImageUploadProgress",(function(){return K})),i.d(t,"ImageUploadUI",(function(){return H}));var n=i(0),o=i(8),a=i(4),s=i(10),r=i(11),l=i(2),c=i(3);function g(e,t){const i=e.createEmptyElement("img"),n="imageBlock"===t?e.createContainerElement("figure",{class:"image"}):e.createContainerElement("span",{class:"image-inline"},{isAllowedInsideAttributeElement:!0});return e.insert(e.createPositionAt(n,0),i),n}function d(e,t){if(e.plugins.has("ImageInlineEditing")!==e.plugins.has("ImageBlockEditing"))return{name:"img"};const i=e.plugins.get("ImageUtils");return e=>{if(!i.isInlineImageView(e))return null;return(e.findAncestor(i.isBlockImageView)?"imageBlock":"imageInline")!==t?null:{name:!0}}}function m(e,t){const i=Object(l.first)(t.getSelectedBlocks());return!i||e.isObject(i)||i.isEmpty&&"listItem"!=i.name?"imageBlock":"imageInline"}class u extends n.Plugin{static get pluginName(){return"ImageUtils"}isImage(e){return this.isInlineImage(e)||this.isBlockImage(e)}isInlineImageView(e){return!!e&&e.is("element","img")}isBlockImageView(e){return!!e&&e.is("element","figure")&&e.hasClass("image")}insertImage(e={},t=null,i=null){const n=this.editor,o=n.model,a=o.document.selection;i=p(n,t||a,i),e={...Object.fromEntries(a.getAttributes()),...e};for(const t in e)o.schema.checkAttribute(i,t)||delete e[t];return o.change(n=>{const s=n.createElement(i,e);return t||"imageInline"==i||(t=Object(c.findOptimalInsertionRange)(a,o)),o.insertContent(s,t),s.parent?(n.setSelection(s,"on"),s):null})}getClosestSelectedImageWidget(e){const t=e.getSelectedElement();if(t&&this.isImageWidget(t))return t;let i=e.getFirstPosition().parent;for(;i;){if(i.is("element")&&this.isImageWidget(i))return i;i=i.parent}return null}getClosestSelectedImageElement(e){const t=e.getSelectedElement();return this.isImage(t)?t:e.getFirstPosition().findAncestor("imageBlock")}isImageAllowed(){const e=this.editor.model.document.selection;return function(e,t){if("imageBlock"==p(e,t)){const i=function(e,t){const i=Object(c.findOptimalInsertionRange)(e,t).start.parent;if(i.isEmpty&&!i.is("element","$root"))return i.parent;return i}(t,e.model);if(e.model.schema.checkChild(i,"imageBlock"))return!0}else if(e.model.schema.checkChild(t.focus,"imageInline"))return!0;return!1}(this.editor,e)&&function(e){return[...e.focus.getAncestors()].every(e=>!e.is("element","imageBlock"))}(e)}toImageWidget(e,t,i){t.setCustomProperty("image",!0,e);return Object(c.toWidget)(e,t,{label:()=>{const t=this.findViewImgElement(e).getAttribute("alt");return t?`${t} ${i}`:i}})}isImageWidget(e){return!!e.getCustomProperty("image")&&Object(c.isWidget)(e)}isBlockImage(e){return!!e&&e.is("element","imageBlock")}isInlineImage(e){return!!e&&e.is("element","imageInline")}findViewImgElement(e){if(this.isInlineImageView(e))return e;const t=this.editor.editing.view;for(const{item:i}of t.createRangeIn(e))if(this.isInlineImageView(i))return i}}function p(e,t,i){const n=e.model.schema,o=e.config.get("image.insert.type");return e.plugins.has("ImageBlockEditing")?e.plugins.has("ImageInlineEditing")?i||("inline"===o?"imageInline":"block"===o?"imageBlock":t.is("selection")?m(n,t):n.checkChild(t,"imageInline")?"imageInline":"imageBlock"):"imageBlock":"imageInline"}const h=new RegExp(String(/^(http(s)?:\/\/)?[\w-]+\.[\w.~:/[\]@!$&'()*+,;=%-]+/.source+/\.(jpg|jpeg|png|gif|ico|webp|JPG|JPEG|PNG|GIF|ICO|WEBP)/.source+/(\?[\w.~:/[\]@!$&'()*+,;=%-]*)?/.source+/(#[\w.~:/[\]@!$&'()*+,;=%-]*)?$/.source));class f extends n.Plugin{static get requires(){return[o.Clipboard,u,s.Undo,r.Delete]}static get pluginName(){return"AutoImage"}constructor(e){super(e),this._timeoutId=null,this._positionToInsert=null}init(){const e=this.editor,t=e.model.document;this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",()=>{const e=t.selection.getFirstRange(),i=a.LivePosition.fromPosition(e.start);i.stickiness="toPrevious";const n=a.LivePosition.fromPosition(e.end);n.stickiness="toNext",t.once("change:data",()=>{this._embedImageBetweenPositions(i,n),i.detach(),n.detach()},{priority:"high"})}),e.commands.get("undo").on("execute",()=>{this._timeoutId&&(l.global.window.clearTimeout(this._timeoutId),this._positionToInsert.detach(),this._timeoutId=null,this._positionToInsert=null)},{priority:"high"})}_embedImageBetweenPositions(e,t){const i=this.editor,n=new a.LiveRange(e,t),o=n.getWalker({ignoreElementEnd:!0}),s=Object.fromEntries(i.model.document.selection.getAttributes()),r=this.editor.plugins.get("ImageUtils");let c="";for(const e of o)e.item.is("$textProxy")&&(c+=e.item.data);c=c.trim(),c.match(h)?(this._positionToInsert=a.LivePosition.fromPosition(e),this._timeoutId=l.global.window.setTimeout(()=>{i.commands.get("insertImage").isEnabled?(i.model.change(e=>{let t;this._timeoutId=null,e.remove(n),n.detach(),"$graveyard"!==this._positionToInsert.root.rootName&&(t=this._positionToInsert.toPosition()),r.insertImage({...s,src:c},t),this._positionToInsert.detach(),this._positionToInsert=null}),i.plugins.get("Delete").requestUndoOnBackspace()):n.detach()},100)):n.detach()}}class b extends n.Command{refresh(){const e=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!e,this.isEnabled&&e.hasAttribute("alt")?this.value=e.getAttribute("alt"):this.value=!1}execute(e){const t=this.editor,i=t.plugins.get("ImageUtils"),n=t.model,o=i.getClosestSelectedImageElement(n.document.selection);n.change(t=>{t.setAttribute("alt",e.newValue,o)})}}class k extends n.Plugin{static get requires(){return[u]}static get pluginName(){return"ImageTextAlternativeEditing"}init(){this.editor.commands.add("imageTextAlternative",new b(this.editor))}}var w=i(1);i(13),i(15);class I extends w.View{constructor(e){super(e);const t=this.locale.t;this.focusTracker=new l.FocusTracker,this.keystrokes=new l.KeystrokeHandler,this.labeledInput=this._createLabeledInputView(),this.saveButtonView=this._createButton(t("Save"),n.icons.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(t("Cancel"),n.icons.cancel,"ck-button-cancel","cancel"),this._focusables=new w.ViewCollection,this._focusCycler=new w.FocusCycler({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","ck-responsive-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]}),Object(w.injectCssTransitionDisabler)(this)}render(){super.render(),this.keystrokes.listenTo(this.element),Object(w.submitHandler)({view:this}),[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)})}_createButton(e,t,i,n){const o=new w.ButtonView(this.locale);return o.set({label:e,icon:t,tooltip:!0}),o.extendTemplate({attributes:{class:i}}),n&&o.delegate("execute").to(this,n),o}_createLabeledInputView(){const e=this.locale.t,t=new w.LabeledFieldView(this.locale,w.createLabeledInputText);return t.label=e("Text alternative"),t}}function v(e){const t=e.editing.view,i=w.BalloonPanelView.defaultPositions,n=e.plugins.get("ImageUtils");return{target:t.domConverter.viewToDom(n.getClosestSelectedImageWidget(t.document.selection)),positions:[i.northArrowSouth,i.northArrowSouthWest,i.northArrowSouthEast,i.southArrowNorth,i.southArrowNorthWest,i.southArrowNorthEast,i.viewportStickyNorth]}}class _ extends n.Plugin{static get requires(){return[w.ContextualBalloon]}static get pluginName(){return"ImageTextAlternativeUI"}init(){this._createButton(),this._createForm()}destroy(){super.destroy(),this._form.destroy()}_createButton(){const e=this.editor,t=e.t;e.ui.componentFactory.add("imageTextAlternative",i=>{const o=e.commands.get("imageTextAlternative"),a=new w.ButtonView(i);return a.set({label:t("Change image text alternative"),icon:n.icons.lowVision,tooltip:!0}),a.bind("isEnabled").to(o,"isEnabled"),this.listenTo(a,"execute",()=>{this._showForm()}),a})}_createForm(){const e=this.editor,t=e.editing.view.document,i=e.plugins.get("ImageUtils");this._balloon=this.editor.plugins.get("ContextualBalloon"),this._form=new I(e.locale),this._form.render(),this.listenTo(this._form,"submit",()=>{e.execute("imageTextAlternative",{newValue:this._form.labeledInput.fieldView.element.value}),this._hideForm(!0)}),this.listenTo(this._form,"cancel",()=>{this._hideForm(!0)}),this._form.keystrokes.set("Esc",(e,t)=>{this._hideForm(!0),t()}),this.listenTo(e.ui,"update",()=>{i.getClosestSelectedImageWidget(t.selection)?this._isVisible&&function(e){const t=e.plugins.get("ContextualBalloon");if(e.plugins.get("ImageUtils").getClosestSelectedImageWidget(e.editing.view.document.selection)){const i=v(e);t.updatePosition(i)}}(e):this._hideForm(!0)}),Object(w.clickOutsideHandler)({emitter:this._form,activator:()=>this._isVisible,contextElements:[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible)return;const e=this.editor,t=e.commands.get("imageTextAlternative"),i=this._form.labeledInput;this._form.disableCssTransitions(),this._isInBalloon||this._balloon.add({view:this._form,position:v(e)}),i.fieldView.value=i.fieldView.element.value=t.value||"",this._form.labeledInput.fieldView.select(),this._form.enableCssTransitions()}_hideForm(e){this._isInBalloon&&(this._form.focusTracker.isFocused&&this._form.saveButtonView.focus(),this._balloon.remove(this._form),e&&this.editor.editing.view.focus())}get _isVisible(){return this._balloon.visibleView===this._form}get _isInBalloon(){return this._balloon.hasView(this._form)}}class y extends n.Plugin{static get requires(){return[k,_]}static get pluginName(){return"ImageTextAlternative"}}function x(e,t){return e=>{e.on("attribute:srcset:"+t,i)};function i(t,i,n){if(!n.consumable.consume(i.item,t.name))return;const o=n.writer,a=n.mapper.toViewElement(i.item),s=e.findViewImgElement(a);if(null===i.attributeNewValue){const e=i.attributeOldValue;e.data&&(o.removeAttribute("srcset",s),o.removeAttribute("sizes",s),e.width&&o.removeAttribute("width",s))}else{const e=i.attributeNewValue;e.data&&(o.setAttribute("srcset",e.data,s),o.setAttribute("sizes","100vw",s),e.width&&o.setAttribute("width",e.width,s))}}}function E(e,t,i){return e=>{e.on(`attribute:${i}:${t}`,n)};function n(t,i,n){if(!n.consumable.consume(i.item,t.name))return;const o=n.writer,a=n.mapper.toViewElement(i.item),s=e.findViewImgElement(a);o.setAttribute(i.attributeKey,i.attributeNewValue||"",s)}}class C extends a.Observer{observe(e){this.listenTo(e,"load",(e,t)=>{const i=t.target;this.checkShouldIgnoreEventFromTarget(i)||"IMG"==i.tagName&&this._fireEvents(t)},{useCapture:!0})}_fireEvents(e){this.isEnabled&&(this.document.fire("layoutChanged"),this.document.fire("imageLoaded",e))}}class T extends n.Command{constructor(e){super(e);const t=e.config.get("image.insert.type");e.plugins.has("ImageBlockEditing")||"block"===t&&Object(l.logWarning)("image-block-plugin-required"),e.plugins.has("ImageInlineEditing")||"inline"===t&&Object(l.logWarning)("image-inline-plugin-required")}refresh(){this.isEnabled=this.editor.plugins.get("ImageUtils").isImageAllowed()}execute(e){const t=Object(l.toArray)(e.source),i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageUtils"),o=Object.fromEntries(i.getAttributes());t.forEach((e,t)=>{const a=i.getSelectedElement();if("string"==typeof e&&(e={src:e}),t&&a&&n.isImage(a)){const t=this.editor.model.createPositionAfter(a);n.insertImage({...e,...o},t)}else n.insertImage({...e,...o})})}}class S extends n.Plugin{static get requires(){return[u]}static get pluginName(){return"ImageEditing"}init(){const e=this.editor,t=e.conversion;e.editing.view.addObserver(C),t.for("upcast").attributeToAttribute({view:{name:"img",key:"alt"},model:"alt"}).attributeToAttribute({view:{name:"img",key:"srcset"},model:{key:"srcset",value:e=>{const t={data:e.getAttribute("srcset")};return e.hasAttribute("width")&&(t.width=e.getAttribute("width")),t}}});const i=new T(e);e.commands.add("insertImage",i),e.commands.add("imageInsert",i)}}class B extends n.Command{constructor(e,t){super(e),this._modelElementName=t}refresh(){const e=this.editor.plugins.get("ImageUtils"),t=e.getClosestSelectedImageElement(this.editor.model.document.selection);"imageBlock"===this._modelElementName?this.isEnabled=e.isInlineImage(t):this.isEnabled=e.isBlockImage(t)}execute(){const e=this.editor,t=this.editor.model,i=e.plugins.get("ImageUtils"),n=i.getClosestSelectedImageElement(t.document.selection),o=Object.fromEntries(n.getAttributes());return o.src||o.uploadId?t.change(e=>{const a=Array.from(t.markers).filter(e=>e.getRange().containsItem(n)),s=i.insertImage(o,t.createSelection(n,"on"),this._modelElementName);if(!s)return null;const r=e.createRangeOn(s);for(const t of a){const i=t.getRange(),n="$graveyard"!=i.root.rootName?i.getJoined(r,!0):r;e.updateMarker(t,{range:n})}return{oldElement:n,newElement:s}}):null}}class A extends n.Plugin{static get requires(){return[S,u,o.ClipboardPipeline]}static get pluginName(){return"ImageBlockEditing"}init(){const e=this.editor;e.model.schema.register("imageBlock",{isObject:!0,isBlock:!0,allowWhere:"$block",allowAttributes:["alt","src","srcset"]}),this._setupConversion(),e.plugins.has("ImageInlineEditing")&&(e.commands.add("imageTypeBlock",new B(this.editor,"imageBlock")),this._setupClipboardIntegration())}_setupConversion(){const e=this.editor,t=e.t,i=e.conversion,n=e.plugins.get("ImageUtils");i.for("dataDowncast").elementToElement({model:"imageBlock",view:(e,{writer:t})=>g(t,"imageBlock")}),i.for("editingDowncast").elementToElement({model:"imageBlock",view:(e,{writer:i})=>n.toImageWidget(g(i,"imageBlock"),i,t("image widget"))}),i.for("downcast").add(E(n,"imageBlock","src")).add(E(n,"imageBlock","alt")).add(x(n,"imageBlock")),i.for("upcast").elementToElement({view:d(e,"imageBlock"),model:(e,{writer:t})=>t.createElement("imageBlock",e.hasAttribute("src")?{src:e.getAttribute("src")}:null)}).add(function(e){return e=>{e.on("element:figure",t)};function t(t,i,n){if(!n.consumable.test(i.viewItem,{name:!0,classes:"image"}))return;const o=e.findViewImgElement(i.viewItem);if(!o||!n.consumable.test(o,{name:!0}))return;const a=n.convertItem(o,i.modelCursor),s=Object(l.first)(a.modelRange.getItems());s&&(n.consumable.consume(i.viewItem,{name:!0,classes:"image"}),n.convertChildren(i.viewItem,s),n.updateConversionResult(s,i))}}(n))}_setupClipboardIntegration(){const e=this.editor,t=e.model,i=e.editing.view,n=e.plugins.get("ImageUtils");this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",(o,s)=>{const r=Array.from(s.content.getChildren());let l;if(!r.every(n.isInlineImageView))return;l=s.targetRanges?e.editing.mapper.toModelRange(s.targetRanges[0]):t.document.selection.getFirstRange();const c=t.createSelection(l);if("imageBlock"===m(t.schema,c)){const e=new a.UpcastWriter(i.document),t=r.map(t=>e.createElement("figure",{class:"image"},t));s.content=e.createDocumentFragment(t)}})}}i(9);class V extends n.Plugin{static get requires(){return[A,c.Widget,y]}static get pluginName(){return"ImageBlock"}}class z extends n.Plugin{static get requires(){return[S,u,o.ClipboardPipeline]}static get pluginName(){return"ImageInlineEditing"}init(){const e=this.editor,t=e.model.schema;t.register("imageInline",{isObject:!0,isInline:!0,allowWhere:"$text",allowAttributes:["alt","src","srcset"]}),t.addChildCheck((e,t)=>{if(e.endsWith("caption")&&"imageInline"===t.name)return!1}),this._setupConversion(),e.plugins.has("ImageBlockEditing")&&(e.commands.add("imageTypeInline",new B(this.editor,"imageInline")),this._setupClipboardIntegration())}_setupConversion(){const e=this.editor,t=e.t,i=e.conversion,n=e.plugins.get("ImageUtils");i.for("dataDowncast").elementToElement({model:"imageInline",view:(e,{writer:t})=>t.createEmptyElement("img")}),i.for("editingDowncast").elementToElement({model:"imageInline",view:(e,{writer:i})=>n.toImageWidget(g(i,"imageInline"),i,t("image widget"))}),i.for("downcast").add(E(n,"imageInline","src")).add(E(n,"imageInline","alt")).add(x(n,"imageInline")),i.for("upcast").elementToElement({view:d(e,"imageInline"),model:(e,{writer:t})=>t.createElement("imageInline",e.hasAttribute("src")?{src:e.getAttribute("src")}:null)})}_setupClipboardIntegration(){const e=this.editor,t=e.model,i=e.editing.view,n=e.plugins.get("ImageUtils");this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",(o,s)=>{const r=Array.from(s.content.getChildren());let l;if(!r.every(n.isBlockImageView))return;l=s.targetRanges?e.editing.mapper.toModelRange(s.targetRanges[0]):t.document.selection.getFirstRange();const c=t.createSelection(l);if("imageInline"===m(t.schema,c)){const e=new a.UpcastWriter(i.document),t=r.map(t=>1===t.childCount?(Array.from(t.getAttributes()).forEach(i=>e.setAttribute(...i,n.findViewImgElement(t))),t.getChild(0)):t);s.content=e.createDocumentFragment(t)}})}}class R extends n.Plugin{static get requires(){return[z,c.Widget,y]}static get pluginName(){return"ImageInline"}}class U extends n.Plugin{static get requires(){return[V,R]}static get pluginName(){return"Image"}}function O(e){for(const t of e.getChildren())if(t&&t.is("element","caption"))return t;return null}function P(e,t){const i=t.getFirstPosition().findAncestor("caption");return i&&e.isBlockImage(i.parent)?i:null}class j extends n.Command{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils");if(!e.plugins.has(A))return this.isEnabled=!1,void(this.value=!1);const i=e.model.document.selection,n=i.getSelectedElement();if(!n){const e=P(t,i);return this.isEnabled=!!e,void(this.value=!!e)}this.isEnabled=this.editor.plugins.get("ImageUtils").isImage(n),this.isEnabled?this.value=!!O(n):this.value=!1}execute(e={}){const{focusCaptionOnShow:t}=e;this.editor.model.change(e=>{this.value?this._hideImageCaption(e):this._showImageCaption(e,t)})}_showImageCaption(e,t){const i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageCaptionEditing");let o=i.getSelectedElement();const a=n._getSavedCaption(o);this.editor.plugins.get("ImageUtils").isInlineImage(o)&&(this.editor.execute("imageTypeBlock"),o=i.getSelectedElement());const s=a||e.createElement("caption");e.append(s,o),t&&e.setSelection(s,"in")}_hideImageCaption(e){const t=this.editor,i=t.model.document.selection,n=t.plugins.get("ImageCaptionEditing"),o=t.plugins.get("ImageUtils");let a,s=i.getSelectedElement();s?a=O(s):(a=P(o,i),s=a.parent),n._saveCaption(s,a),e.setSelection(s,"on"),e.remove(a)}}class N extends n.Plugin{static get requires(){return[u]}static get pluginName(){return"ImageCaptionEditing"}constructor(e){super(e),this._savedCaptionsMap=new WeakMap}init(){const e=this.editor,t=e.model.schema;t.isRegistered("caption")?t.extend("caption",{allowIn:"imageBlock"}):t.register("caption",{allowIn:"imageBlock",allowContentOf:"$block",isLimit:!0}),e.commands.add("toggleImageCaption",new j(this.editor)),this._setupConversion(),this._setupImageTypeCommandsIntegration()}_setupConversion(){const e=this.editor,t=e.editing.view,i=e.plugins.get("ImageUtils"),n=e.t;e.conversion.for("upcast").elementToElement({view:e=>function(e,t){return"figcaption"==t.name&&e.isBlockImageView(t.parent)?{name:!0}:null}(i,e),model:"caption"}),e.conversion.for("dataDowncast").elementToElement({model:"caption",view:(e,{writer:t})=>i.isBlockImage(e.parent)?t.createContainerElement("figcaption"):null}),e.conversion.for("editingDowncast").elementToElement({model:"caption",view:(e,{writer:o})=>{if(!i.isBlockImage(e.parent))return null;const s=o.createEditableElement("figcaption");return o.setCustomProperty("imageCaption",!0,s),Object(a.enablePlaceholder)({view:t,element:s,text:n("Enter image caption"),keepOnFocus:!0}),Object(c.toWidgetEditable)(s,o)}}),e.editing.mapper.on("modelToViewPosition",L(t)),e.data.mapper.on("modelToViewPosition",L(t))}_setupImageTypeCommandsIntegration(){const e=this.editor,t=e.plugins.get("ImageUtils"),i=e.commands.get("imageTypeInline"),n=e.commands.get("imageTypeBlock"),o=e=>{if(!e.return)return;const{oldElement:i,newElement:n}=e.return;if(!i)return;if(t.isBlockImage(i)){const e=O(i);if(e)return void this._saveCaption(n,e)}const o=this._getSavedCaption(i);o&&this._saveCaption(n,o)};i&&this.listenTo(i,"execute",o,{priority:"low"}),n&&this.listenTo(n,"execute",o,{priority:"low"})}_getSavedCaption(e){const t=this._savedCaptionsMap.get(e);return t?a.Element.fromJSON(t):null}_saveCaption(e,t){this._savedCaptionsMap.set(e,t.toJSON())}}function L(e){return(t,i)=>{const n=i.modelPosition,o=n.parent;if(!o.is("element","imageBlock"))return;const a=i.mapper.toViewElement(o);i.viewPosition=e.createPositionAt(a,n.offset+1)}}class F extends n.Plugin{static get requires(){return[u]}static get pluginName(){return"ImageCaptionUI"}init(){const e=this.editor,t=e.editing.view,i=e.plugins.get("ImageUtils"),o=e.t;e.ui.componentFactory.add("toggleImageCaption",a=>{const s=e.commands.get("toggleImageCaption"),r=new w.ButtonView(a);return r.set({icon:n.icons.caption,tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(s,"value","isEnabled"),r.bind("label").to(s,"value",e=>o(e?"Toggle caption off":"Toggle caption on")),this.listenTo(r,"execute",()=>{e.execute("toggleImageCaption",{focusCaptionOnShow:!0});const n=P(i,e.model.document.selection);if(n){const i=e.editing.mapper.toViewElement(n);t.scrollToTheSelection(),t.change(e=>{e.addClass("image__caption_highlighted",i)})}}),r})}}i(18);class D extends n.Plugin{static get requires(){return[N,F]}static get pluginName(){return"ImageCaption"}}var M=i(6);function W(e){const t=e.map(e=>e.replace("+","\\+"));return new RegExp(`^image\\/(${t.join("|")})$`)}function q(e){return new Promise((t,i)=>{const n=e.getAttribute("src");fetch(n).then(e=>e.blob()).then(e=>{const i=$(e,n),o=i.replace("image/",""),a=new File([e],"image."+o,{type:i});t(a)}).catch(e=>e&&"TypeError"===e.name?function(e){return function(e){return new Promise((t,i)=>{const n=l.global.document.createElement("img");n.addEventListener("load",()=>{const e=l.global.document.createElement("canvas");e.width=n.width,e.height=n.height;e.getContext("2d").drawImage(n,0,0),e.toBlob(e=>e?t(e):i())}),n.addEventListener("error",()=>i()),n.src=e})}(e).then(t=>{const i=$(t,e),n=i.replace("image/","");return new File([t],"image."+n,{type:i})})}(n).then(t).catch(i):i(e))})}function $(e,t){return e.type?e.type:t.match(/data:(image\/\w+);base64/)?t.match(/data:(image\/\w+);base64/)[1].toLowerCase():"image/jpeg"}class H extends n.Plugin{static get pluginName(){return"ImageUploadUI"}init(){const e=this.editor,t=e.t,i=i=>{const o=new M.FileDialogButtonView(i),a=e.commands.get("uploadImage"),s=e.config.get("image.upload.types"),r=W(s);return o.set({acceptedType:s.map(e=>"image/"+e).join(","),allowMultipleFiles:!0}),o.buttonView.set({label:t("Insert image"),icon:n.icons.image,tooltip:!0}),o.buttonView.bind("isEnabled").to(a),o.on("done",(t,i)=>{const n=Array.from(i).filter(e=>r.test(e.type));n.length&&e.execute("uploadImage",{file:n})}),o};e.ui.componentFactory.add("uploadImage",i),e.ui.componentFactory.add("imageUpload",i)}}i(20),i(22),i(24);class K extends n.Plugin{static get pluginName(){return"ImageUploadProgress"}constructor(e){super(e),this.placeholder="data:image/svg+xml;utf8,"+encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 250"><rect rx="4"/></svg>')}init(){const e=this.editor;e.plugins.has("ImageBlockEditing")&&e.editing.downcastDispatcher.on("attribute:uploadStatus:imageBlock",(...e)=>this.uploadStatusChange(...e)),e.plugins.has("ImageInlineEditing")&&e.editing.downcastDispatcher.on("attribute:uploadStatus:imageInline",(...e)=>this.uploadStatusChange(...e))}uploadStatusChange(e,t,i){const n=this.editor,o=t.item,a=o.getAttribute("uploadId");if(!i.consumable.consume(t.item,e.name))return;const s=n.plugins.get("ImageUtils"),r=n.plugins.get(M.FileRepository),l=a?t.attributeNewValue:null,c=this.placeholder,g=n.editing.mapper.toViewElement(o),d=i.writer;if("reading"==l)return G(g,d),void J(s,c,g,d);if("uploading"==l){const e=r.loaders.get(a);return G(g,d),void(e?(X(g,d),function(e,t,i,n){const o=function(e){const t=e.createUIElement("div",{class:"ck-progress-bar"});return e.setCustomProperty("progressBar",!0,t),t}(t);t.insert(t.createPositionAt(e,"end"),o),i.on("change:uploadedPercent",(e,t,i)=>{n.change(e=>{e.setStyle("width",i+"%",o)})})}(g,d,e,n.editing.view),function(e,t,i,n){if(n.data){const o=e.findViewImgElement(t);i.setAttribute("src",n.data,o)}}(s,g,d,e)):J(s,c,g,d))}"complete"==l&&r.loaders.get(a)&&function(e,t,i){const n=t.createUIElement("div",{class:"ck-image-upload-complete-icon"});t.insert(t.createPositionAt(e,"end"),n),setTimeout(()=>{i.change(e=>e.remove(e.createRangeOn(n)))},3e3)}(g,d,n.editing.view),function(e,t){Y(e,t,"progressBar")}(g,d),X(g,d),function(e,t){t.removeClass("ck-appear",e)}(g,d)}}function G(e,t){e.hasClass("ck-appear")||t.addClass("ck-appear",e)}function J(e,t,i,n){i.hasClass("ck-image-upload-placeholder")||n.addClass("ck-image-upload-placeholder",i);const o=e.findViewImgElement(i);o.getAttribute("src")!==t&&n.setAttribute("src",t,o),Q(i,"placeholder")||n.insert(n.createPositionAfter(o),function(e){const t=e.createUIElement("div",{class:"ck-upload-placeholder-loader"});return e.setCustomProperty("placeholder",!0,t),t}(n))}function X(e,t){e.hasClass("ck-image-upload-placeholder")&&t.removeClass("ck-image-upload-placeholder",e),Y(e,t,"placeholder")}function Q(e,t){for(const i of e.getChildren())if(i.getCustomProperty(t))return i}function Y(e,t,i){const n=Q(e,i);n&&t.remove(t.createRangeOn(n))}class Z extends n.Command{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils"),i=e.model.document.selection.getSelectedElement();this.isEnabled=t.isImageAllowed()||t.isImage(i)}execute(e){const t=Object(l.toArray)(e.file),i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageUtils"),o=Object.fromEntries(i.getAttributes());t.forEach((e,t)=>{const a=i.getSelectedElement();if(t&&a&&n.isImage(a)){const t=this.editor.model.createPositionAfter(a);this._uploadImage(e,o,t)}else this._uploadImage(e,o)})}_uploadImage(e,t,i){const n=this.editor,o=n.plugins.get(M.FileRepository).createLoader(e),a=n.plugins.get("ImageUtils");o&&a.insertImage({...t,uploadId:o.id},i)}}class ee extends n.Plugin{static get requires(){return[M.FileRepository,w.Notification,o.ClipboardPipeline,u]}static get pluginName(){return"ImageUploadEditing"}constructor(e){super(e),e.config.define("image",{upload:{types:["jpeg","png","gif","bmp","webp","tiff"]}}),this._uploadImageElements=new Map}init(){const e=this.editor,t=e.model.document,i=e.conversion,n=e.plugins.get(M.FileRepository),o=e.plugins.get("ImageUtils"),s=W(e.config.get("image.upload.types")),r=new Z(e);e.commands.add("uploadImage",r),e.commands.add("imageUpload",r),i.for("upcast").attributeToAttribute({view:{name:"img",key:"uploadId"},model:"uploadId"}),this.listenTo(e.editing.view.document,"clipboardInput",(t,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(e=>!!e&&s.test(e.type));o.length&&(t.stop(),e.model.change(t=>{i.targetRanges&&t.setSelection(i.targetRanges.map(t=>e.editing.mapper.toModelRange(t))),e.model.enqueueChange("default",()=>{e.execute("uploadImage",{file:o})})}))}),this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",(t,i)=>{const s=Array.from(e.editing.view.createRangeIn(i.content)).filter(e=>function(e,t){return!(!e.isInlineImageView(t)||!t.getAttribute("src"))&&(t.getAttribute("src").match(/^data:image\/\w+;base64,/g)||t.getAttribute("src").match(/^blob:/g))}(o,e.item)&&!e.item.getAttribute("uploadProcessed")).map(e=>({promise:q(e.item),imageElement:e.item}));if(!s.length)return;const r=new a.UpcastWriter(e.editing.view.document);for(const e of s){r.setAttribute("uploadProcessed",!0,e.imageElement);const t=n.createLoader(e.promise);t&&(r.setAttribute("src","",e.imageElement),r.setAttribute("uploadId",t.id,e.imageElement))}}),e.editing.view.document.on("dragover",(e,t)=>{t.preventDefault()}),t.on("change",()=>{const i=t.differ.getChanges({includeChangesInGraveyard:!0}).reverse(),o=new Set;for(const t of i)if("insert"==t.type&&"$text"!=t.name){const i=t.position.nodeAfter,a="$graveyard"==t.position.root.rootName;for(const t of te(e,i)){const e=t.getAttribute("uploadId");if(!e)continue;const i=n.loaders.get(e);i&&(a?o.has(e)||i.abort():(o.add(e),this._uploadImageElements.set(e,t),"idle"==i.status&&this._readAndUpload(i)))}}}),this.on("uploadComplete",(e,{imageElement:t,data:i})=>{const n=i.urls?i.urls:i;this.editor.model.change(e=>{e.setAttribute("src",n.default,t),this._parseAndSetSrcsetAttributeOnImage(n,t,e)})},{priority:"low"})}afterInit(){const e=this.editor.model.schema;this.editor.plugins.has("ImageBlockEditing")&&e.extend("imageBlock",{allowAttributes:["uploadId","uploadStatus"]}),this.editor.plugins.has("ImageInlineEditing")&&e.extend("imageInline",{allowAttributes:["uploadId","uploadStatus"]})}_readAndUpload(e){const t=this.editor,i=t.model,n=t.locale.t,o=t.plugins.get(M.FileRepository),a=t.plugins.get(w.Notification),s=t.plugins.get("ImageUtils"),r=this._uploadImageElements;return i.enqueueChange("transparent",t=>{t.setAttribute("uploadStatus","reading",r.get(e.id))}),e.read().then(()=>{const n=e.upload(),o=r.get(e.id);if(l.env.isSafari){const e=t.editing.mapper.toViewElement(o),i=s.findViewImgElement(e);t.editing.view.once("render",()=>{if(!i.parent)return;const e=t.editing.view.domConverter.mapViewToDom(i.parent);if(!e)return;const n=e.style.display;e.style.display="none",e._ckHack=e.offsetHeight,e.style.display=n})}return i.enqueueChange("transparent",e=>{e.setAttribute("uploadStatus","uploading",o)}),n}).then(t=>{i.enqueueChange("transparent",i=>{const n=r.get(e.id);i.setAttribute("uploadStatus","complete",n),this.fire("uploadComplete",{data:t,imageElement:n})}),c()}).catch(t=>{if("error"!==e.status&&"aborted"!==e.status)throw t;"error"==e.status&&t&&a.showWarning(t,{title:n("Upload failed"),namespace:"upload"}),i.enqueueChange("transparent",t=>{t.remove(r.get(e.id))}),c()});function c(){i.enqueueChange("transparent",t=>{const i=r.get(e.id);t.removeAttribute("uploadId",i),t.removeAttribute("uploadStatus",i),r.delete(e.id)}),o.destroyLoader(e)}}_parseAndSetSrcsetAttributeOnImage(e,t,i){let n=0;const o=Object.keys(e).filter(e=>{const t=parseInt(e,10);if(!isNaN(t))return n=Math.max(n,t),!0}).map(t=>`${e[t]} ${t}w`).join(", ");""!=o&&i.setAttribute("srcset",{data:o,width:n},t)}}function te(e,t){const i=e.plugins.get("ImageUtils");return Array.from(e.model.createRangeOn(t)).filter(e=>i.isImage(e.item)).map(e=>e.item)}class ie extends n.Plugin{static get pluginName(){return"ImageUpload"}static get requires(){return[ee,H,K]}}i(26);class ne extends w.View{constructor(e,t={}){super(e);const i=this.bindTemplate;this.set("class",t.class||null),this.children=this.createCollection(),t.children&&t.children.forEach(e=>this.children.add(e)),this.set("_role",null),this.set("_ariaLabelledBy",null),t.labelView&&this.set({_role:"group",_ariaLabelledBy:t.labelView.id}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__row",i.to("class")],role:i.to("_role"),"aria-labelledby":i.to("_ariaLabelledBy")},children:this.children})}}i(28);class oe extends w.View{constructor(e,t){super(e);const{insertButtonView:i,cancelButtonView:n}=this._createActionButtons(e);if(this.insertButtonView=i,this.cancelButtonView=n,this.dropdownView=this._createDropdownView(e),this.set("imageURLInputValue",""),this.focusTracker=new l.FocusTracker,this.keystrokes=new l.KeystrokeHandler,this._focusables=new w.ViewCollection,this._focusCycler=new w.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.set("_integrations",new l.Collection),t)for(const[e,i]of Object.entries(t))"insertImageViaUrl"===e&&(i.fieldView.bind("value").to(this,"imageURLInputValue",e=>e||""),i.fieldView.on("input",()=>{this.imageURLInputValue=i.fieldView.element.value.trim()})),i.name=e,this._integrations.add(i);this.setTemplate({tag:"form",attributes:{class:["ck","ck-image-insert-form"],tabindex:"-1"},children:[...this._integrations,new ne(e,{children:[this.insertButtonView,this.cancelButtonView],class:"ck-image-insert-form__action-row"})]})}render(){super.render(),Object(w.submitHandler)({view:this});const e=[...this._integrations,this.insertButtonView,this.cancelButtonView];e.forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)}),this.keystrokes.listenTo(this.element);const t=e=>e.stopPropagation();this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t),this.listenTo(e[0].element,"selectstart",(e,t)=>{t.stopPropagation()},{priority:"high"})}getIntegration(e){return this._integrations.find(t=>t.name===e)}_createDropdownView(e){const t=e.t,i=Object(w.createDropdown)(e,w.SplitButtonView),o=i.buttonView,a=i.panelView;return o.set({label:t("Insert image"),icon:n.icons.image,tooltip:!0}),a.extendTemplate({attributes:{class:"ck-image-insert__panel"}}),i}_createActionButtons(e){const t=e.t,i=new w.ButtonView(e),o=new w.ButtonView(e);return i.set({label:t("Insert"),icon:n.icons.check,class:"ck-button-save",type:"submit",withText:!0,isEnabled:this.imageURLInputValue}),o.set({label:t("Cancel"),icon:n.icons.cancel,class:"ck-button-cancel",withText:!0}),i.bind("isEnabled").to(this,"imageURLInputValue",e=>!!e),i.delegate("execute").to(this,"submit"),o.delegate("execute").to(this,"cancel"),{insertButtonView:i,cancelButtonView:o}}focus(){this._focusCycler.focusFirst()}}function ae(e){const t=e.t,i=new w.LabeledFieldView(e,w.createLabeledInputText);return i.set({label:t("Insert image via URL")}),i.fieldView.placeholder="https://example.com/image.png",i}class se extends n.Plugin{static get pluginName(){return"ImageInsertUI"}init(){const e=this.editor,t=e=>this._createDropdownView(e);e.ui.componentFactory.add("insertImage",t),e.ui.componentFactory.add("imageInsert",t)}_createDropdownView(e){const t=this.editor,i=new oe(e,function(e){const t=e.config.get("image.insert.integrations"),i=e.plugins.get("ImageInsertUI"),n={insertImageViaUrl:ae(e.locale)};if(!t)return n;if(t.find(e=>"openCKFinder"===e)&&e.ui.componentFactory.has("ckfinder")){const t=e.ui.componentFactory.create("ckfinder");t.set({withText:!0,class:"ck-image-insert__ck-finder-button"}),t.delegate("execute").to(i,"cancel"),n.openCKFinder=t}return t.reduce((t,i)=>(n[i]?t[i]=n[i]:e.ui.componentFactory.has(i)&&(t[i]=e.ui.componentFactory.create(i)),t),{})}(t)),n=t.commands.get("uploadImage"),o=i.dropdownView,a=o.buttonView;return a.actionView=t.ui.componentFactory.create("uploadImage"),a.actionView.extendTemplate({attributes:{class:"ck ck-button ck-splitbutton__action"}}),this._setUpDropdown(o,i,n)}_setUpDropdown(e,t,i){const n=this.editor,o=n.t,a=t.insertButtonView,s=t.getIntegration("insertImageViaUrl"),r=e.panelView,l=this.editor.plugins.get("ImageUtils");function c(){n.editing.view.focus(),e.isOpen=!1}return e.bind("isEnabled").to(i),e.buttonView.once("open",()=>{r.children.add(t)}),e.on("change:isOpen",()=>{const i=n.model.document.selection.getSelectedElement();e.isOpen&&(t.focus(),l.isImage(i)?(t.imageURLInputValue=i.getAttribute("src"),a.label=o("Update"),s.label=o("Update image URL")):(t.imageURLInputValue="",a.label=o("Insert"),s.label=o("Insert image via URL")))},{priority:"low"}),t.delegate("submit","cancel").to(e),this.delegate("cancel").to(e),e.on("submit",()=>{c(),function(){const e=n.model.document.selection.getSelectedElement();l.isImage(e)?n.model.change(i=>{i.setAttribute("src",t.imageURLInputValue,e),i.removeAttribute("srcset",e),i.removeAttribute("sizes",e)}):n.execute("insertImage",{source:t.imageURLInputValue})}()}),e.on("cancel",()=>{c()}),e}}class re extends n.Plugin{static get pluginName(){return"ImageInsert"}static get requires(){return[ie,se]}}class le extends n.Command{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils").getClosestSelectedImageElement(e.model.document.selection);this.isEnabled=!!t,t&&t.hasAttribute("width")?this.value={width:t.getAttribute("width"),height:null}:this.value=null}execute(e){const t=this.editor,i=t.model,n=t.plugins.get("ImageUtils").getClosestSelectedImageElement(i.document.selection);this.value={width:e.width,height:null},n&&i.change(t=>{t.setAttribute("width",e.width,n)})}}class ce extends n.Plugin{static get requires(){return[u]}static get pluginName(){return"ImageResizeEditing"}constructor(e){super(e),e.config.define("image",{resizeUnit:"%",resizeOptions:[{name:"resizeImage:original",value:null,icon:"original"},{name:"resizeImage:25",value:"25",icon:"small"},{name:"resizeImage:50",value:"50",icon:"medium"},{name:"resizeImage:75",value:"75",icon:"large"}]})}init(){const e=this.editor,t=new le(e);this._registerSchema(),this._registerConverters("imageBlock"),this._registerConverters("imageInline"),e.commands.add("resizeImage",t),e.commands.add("imageResize",t)}_registerSchema(){this.editor.plugins.has("ImageBlockEditing")&&this.editor.model.schema.extend("imageBlock",{allowAttributes:"width"}),this.editor.plugins.has("ImageInlineEditing")&&this.editor.model.schema.extend("imageInline",{allowAttributes:"width"})}_registerConverters(e){const t=this.editor;t.conversion.for("downcast").add(t=>t.on("attribute:width:"+e,(e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const n=i.writer,o=i.mapper.toViewElement(t.item);null!==t.attributeNewValue?(n.setStyle("width",t.attributeNewValue,o),n.addClass("image_resized",o)):(n.removeStyle("width",o),n.removeClass("image_resized",o))})),t.conversion.for("upcast").attributeToAttribute({view:{name:"imageBlock"===e?"figure":"img",styles:{width:/.+/}},model:{key:"width",value:e=>e.getStyle("width")}})}}const ge={small:n.icons.objectSizeSmall,medium:n.icons.objectSizeMedium,large:n.icons.objectSizeLarge,original:n.icons.objectSizeFull};class de extends n.Plugin{static get requires(){return[ce]}static get pluginName(){return"ImageResizeButtons"}constructor(e){super(e),this._resizeUnit=e.config.get("image.resizeUnit")}init(){const e=this.editor,t=e.config.get("image.resizeOptions"),i=e.commands.get("resizeImage");this.bind("isEnabled").to(i);for(const e of t)this._registerImageResizeButton(e);this._registerImageResizeDropdown(t)}_registerImageResizeButton(e){const t=this.editor,{name:i,value:n,icon:o}=e,a=n?n+this._resizeUnit:null;t.ui.componentFactory.add(i,i=>{const n=new w.ButtonView(i),s=t.commands.get("resizeImage"),r=this._getOptionLabelValue(e,!0);if(!ge[o])throw new l.CKEditorError("imageresizebuttons-missing-icon",t,e);return n.set({label:r,icon:ge[o],tooltip:r,isToggleable:!0}),n.bind("isEnabled").to(this),n.bind("isOn").to(s,"value",me(a)),this.listenTo(n,"execute",()=>{t.execute("resizeImage",{width:a})}),n})}_registerImageResizeDropdown(e){const t=this.editor,i=t.t,n=e.find(e=>!e.value),o=o=>{const a=t.commands.get("resizeImage"),s=Object(w.createDropdown)(o,w.DropdownButtonView),r=s.buttonView;return r.set({tooltip:i("Resize image"),commandValue:n.value,icon:ge.medium,isToggleable:!0,label:this._getOptionLabelValue(n),withText:!0,class:"ck-resize-image-button"}),r.bind("label").to(a,"value",e=>e&&e.width?e.width:this._getOptionLabelValue(n)),s.bind("isOn").to(a),s.bind("isEnabled").to(this),Object(w.addListToDropdown)(s,this._getResizeDropdownListItemDefinitions(e,a)),s.listView.ariaLabel=i("Image resize list"),this.listenTo(s,"execute",e=>{t.execute(e.source.commandName,{width:e.source.commandValue}),t.editing.view.focus()}),s};t.ui.componentFactory.add("resizeImage",o),t.ui.componentFactory.add("imageResize",o)}_getOptionLabelValue(e,t){const i=this.editor.t;return e.label?e.label:t?e.value?i("Resize image to %0",e.value+this._resizeUnit):i("Resize image to the original size"):e.value?e.value+this._resizeUnit:i("Original")}_getResizeDropdownListItemDefinitions(e,t){const i=new l.Collection;return e.map(e=>{const n=e.value?e.value+this._resizeUnit:null,o={type:"button",model:new w.Model({commandName:"resizeImage",commandValue:n,label:this._getOptionLabelValue(e),withText:!0,icon:null})};o.model.bind("isOn").to(t,"value",me(n)),i.add(o)}),i}}function me(e){return t=>null===e&&t===e||t&&t.width===e}const ue=/(image|image-inline)/;class pe extends n.Plugin{static get requires(){return[c.WidgetResize]}static get pluginName(){return"ImageResizeHandles"}init(){const e=this.editor.commands.get("resizeImage");this.bind("isEnabled").to(e),this._setupResizerCreator()}_setupResizerCreator(){const e=this.editor,t=e.editing.view;t.addObserver(C),this.listenTo(t.document,"imageLoaded",(i,n)=>{if(!n.target.matches("figure.image.ck-widget > img,figure.image.ck-widget > picture > img,figure.image.ck-widget > a > img,figure.image.ck-widget > a > picture > img,span.image-inline.ck-widget > img,span.image-inline.ck-widget > picture > img"))return;const o=e.editing.view.domConverter,a=o.domToView(n.target).findAncestor({classes:ue});let s=this.editor.plugins.get(c.WidgetResize).getResizerByViewElement(a);if(s)return void s.redraw();const r=e.editing.mapper,l=r.toModelElement(a);s=e.plugins.get(c.WidgetResize).attachTo({unit:e.config.get("image.resizeUnit"),modelElement:l,viewElement:a,editor:e,getHandleHost:e=>e.querySelector("img"),getResizeHost:()=>o.viewToDom(r.toViewElement(l.parent)),isCentered(){const e=l.getAttribute("imageStyle");return!e||"block"==e||"alignCenter"==e},onCommit(i){t.change(e=>{e.removeClass("image_resized",a)}),e.execute("resizeImage",{width:i})}}),s.on("updateSize",()=>{a.hasClass("image_resized")||t.change(e=>{e.addClass("image_resized",a)})}),s.bind("isEnabled").to(this)})}}i(30);class he extends n.Plugin{static get requires(){return[ce,pe,de]}static get pluginName(){return"ImageResize"}}class fe extends n.Command{constructor(e,t){super(e),this._defaultStyles={imageBlock:!1,imageInline:!1},this._styles=new Map(t.map(e=>{if(e.isDefault)for(const t of e.modelElements)this._defaultStyles[t]=e.name;return[e.name,e]}))}refresh(){const e=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!e,this.isEnabled?e.hasAttribute("imageStyle")?this.value=e.getAttribute("imageStyle"):this.value=this._defaultStyles[e.name]:this.value=!1}execute(e={}){const t=this.editor,i=t.model,n=t.plugins.get("ImageUtils");i.change(t=>{const o=e.value;let a=n.getClosestSelectedImageElement(i.document.selection);o&&this.shouldConvertImageType(o,a)&&(this.editor.execute(n.isBlockImage(a)?"imageTypeInline":"imageTypeBlock"),a=n.getClosestSelectedImageElement(i.document.selection)),!o||this._styles.get(o).isDefault?t.removeAttribute("imageStyle",a):t.setAttribute("imageStyle",o,a)})}shouldConvertImageType(e,t){return!this._styles.get(e).modelElements.includes(t.name)}}const{objectFullWidth:be,objectInline:ke,objectLeft:we,objectRight:Ie,objectCenter:ve,objectBlockLeft:_e,objectBlockRight:ye}=n.icons,xe={inline:{name:"inline",title:"In line",icon:ke,modelElements:["imageInline"],isDefault:!0},alignLeft:{name:"alignLeft",title:"Left aligned image",icon:we,modelElements:["imageBlock","imageInline"],className:"image-style-align-left"},alignBlockLeft:{name:"alignBlockLeft",title:"Left aligned image",icon:_e,modelElements:["imageBlock"],className:"image-style-block-align-left"},alignCenter:{name:"alignCenter",title:"Centered image",icon:ve,modelElements:["imageBlock"],className:"image-style-align-center"},alignRight:{name:"alignRight",title:"Right aligned image",icon:Ie,modelElements:["imageBlock","imageInline"],className:"image-style-align-right"},alignBlockRight:{name:"alignBlockRight",title:"Right aligned image",icon:ye,modelElements:["imageBlock"],className:"image-style-block-align-right"},block:{name:"block",title:"Centered image",icon:ve,modelElements:["imageBlock"],isDefault:!0},side:{name:"side",title:"Side image",icon:Ie,modelElements:["imageBlock"],className:"image-style-side"}},Ee={full:be,left:_e,right:ye,center:ve,inlineLeft:we,inlineRight:Ie,inline:ke},Ce=[{name:"imageStyle:wrapText",title:"Wrap text",defaultItem:"imageStyle:alignLeft",items:["imageStyle:alignLeft","imageStyle:alignRight"]},{name:"imageStyle:breakText",title:"Break text",defaultItem:"imageStyle:block",items:["imageStyle:alignBlockLeft","imageStyle:block","imageStyle:alignBlockRight"]}];function Te(e){Object(l.logWarning)("image-style-configuration-definition-invalid",e)}var Se={normalizeStyles:function(e){return(e.configuredStyles.options||[]).map(e=>function(e){e="string"==typeof e?xe[e]?{...xe[e]}:{name:e}:function(e,t){const i={...t};for(const n in e)Object.prototype.hasOwnProperty.call(t,n)||(i[n]=e[n]);return i}(xe[e.name],e);"string"==typeof e.icon&&(e.icon=Ee[e.icon]||e.icon);return e}(e)).filter(t=>function(e,{isBlockPluginLoaded:t,isInlinePluginLoaded:i}){const{modelElements:n,name:o}=e;if(!(n&&n.length&&o))return Te({style:e}),!1;{const o=[t?"imageBlock":null,i?"imageInline":null];if(!n.some(e=>o.includes(e)))return Object(l.logWarning)("image-style-missing-dependency",{style:e,missingPlugins:n.map(e=>"imageBlock"===e?"ImageBlockEditing":"ImageInlineEditing")}),!1}return!0}(t,e))},getDefaultStylesConfiguration:function(e,t){return e&&t?{options:["inline","alignLeft","alignRight","alignCenter","alignBlockLeft","alignBlockRight","block","side"]}:e?{options:["block","side"]}:t?{options:["inline","alignLeft","alignRight"]}:{}},getDefaultDropdownDefinitions:function(e){return e.has("ImageBlockEditing")&&e.has("ImageInlineEditing")?[...Ce]:[]},warnInvalidStyle:Te,DEFAULT_OPTIONS:xe,DEFAULT_ICONS:Ee,DEFAULT_DROPDOWN_DEFINITIONS:Ce};function Be(e,t){for(const i of t)if(i.name===e)return i}class Ae extends n.Plugin{static get pluginName(){return"ImageStyleEditing"}static get requires(){return[u]}init(){const{normalizeStyles:e,getDefaultStylesConfiguration:t}=Se,i=this.editor,n=i.plugins.has("ImageBlockEditing"),o=i.plugins.has("ImageInlineEditing");i.config.define("image.styles",t(n,o)),this.normalizedStyles=e({configuredStyles:i.config.get("image.styles"),isBlockPluginLoaded:n,isInlinePluginLoaded:o}),this._setupConversion(n,o),this._setupPostFixer(),i.commands.add("imageStyle",new fe(i,this.normalizedStyles))}_setupConversion(e,t){const i=this.editor,n=i.model.schema,o=(a=this.normalizedStyles,(e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const n=Be(t.attributeNewValue,a),o=Be(t.attributeOldValue,a),s=i.mapper.toViewElement(t.item),r=i.writer;o&&r.removeClass(o.className,s),n&&r.addClass(n.className,s)});var a;const s=function(e){const t={imageInline:e.filter(e=>!e.isDefault&&e.modelElements.includes("imageInline")),imageBlock:e.filter(e=>!e.isDefault&&e.modelElements.includes("imageBlock"))};return(e,i,n)=>{if(!i.modelRange)return;const o=i.viewItem,a=Object(l.first)(i.modelRange.getItems());if(a&&n.schema.checkAttribute(a,"imageStyle"))for(const e of t[a.name])n.consumable.consume(o,{classes:e.className})&&n.writer.setAttribute("imageStyle",e.name,a)}}(this.normalizedStyles);i.editing.downcastDispatcher.on("attribute:imageStyle",o),i.data.downcastDispatcher.on("attribute:imageStyle",o),e&&(n.extend("imageBlock",{allowAttributes:"imageStyle"}),i.data.upcastDispatcher.on("element:figure",s,{priority:"low"})),t&&(n.extend("imageInline",{allowAttributes:"imageStyle"}),i.data.upcastDispatcher.on("element:img",s,{priority:"low"}))}_setupPostFixer(){const e=this.editor,t=e.model.document,i=e.plugins.get(u),n=new Map(this.normalizedStyles.map(e=>[e.name,e]));t.registerPostFixer(e=>{let o=!1;for(const a of t.differ.getChanges())if("insert"==a.type||"attribute"==a.type&&"imageStyle"==a.attributeKey){let t="insert"==a.type?a.position.nodeAfter:a.range.start.nodeAfter;if(t&&t.is("element","paragraph")&&t.childCount>0&&(t=t.getChild(0)),!i.isImage(t))continue;const s=t.getAttribute("imageStyle");if(!s)continue;const r=n.get(s);r&&r.modelElements.includes(t.name)||(e.removeAttribute("imageStyle",t),o=!0)}return o})}}var Ve=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)};var ze=function(e){return e};i(32);class Re extends n.Plugin{static get requires(){return[Ae]}static get pluginName(){return"ImageStyleUI"}get localizedDefaultStylesTitles(){const e=this.editor.t;return{"Wrap text":e("Wrap text"),"Break text":e("Break text"),"In line":e("In line"),"Full size image":e("Full size image"),"Side image":e("Side image"),"Left aligned image":e("Left aligned image"),"Centered image":e("Centered image"),"Right aligned image":e("Right aligned image")}}init(){const e=this.editor.plugins,t=this.editor.config.get("image.toolbar")||[],i=Ue(e.get("ImageStyleEditing").normalizedStyles,this.localizedDefaultStylesTitles);for(const e of i)this._createButton(e);const n=Ue([...t.filter(Ve),...Se.getDefaultDropdownDefinitions(e)],this.localizedDefaultStylesTitles);for(const e of n)this._createDropdown(e,i)}_createDropdown(e,t){const i=this.editor.ui.componentFactory;i.add(e.name,n=>{let o;const{defaultItem:a,items:s,title:r}=e,l=s.filter(e=>t.find(({name:t})=>Oe(t)===e)).map(e=>{const t=i.create(e);return e===a&&(o=t),t});s.length!==l.length&&Se.warnInvalidStyle({dropdown:e});const c=Object(w.createDropdown)(n,w.SplitButtonView),g=c.buttonView;return Object(w.addToolbarToDropdown)(c,l),g.set({label:Pe(r,o.label),class:null,tooltip:!0}),g.bind("icon").toMany(l,"isOn",(...e)=>{const t=e.findIndex(ze);return t<0?o.icon:l[t].icon}),g.bind("label").toMany(l,"isOn",(...e)=>{const t=e.findIndex(ze);return Pe(r,t<0?o.label:l[t].label)}),g.bind("isOn").toMany(l,"isOn",(...e)=>e.some(ze)),g.bind("class").toMany(l,"isOn",(...e)=>e.some(ze)?"ck-splitbutton_flatten":null),g.on("execute",()=>{l.some(({isOn:e})=>e)?c.isOpen=!c.isOpen:o.fire("execute")}),c.bind("isEnabled").toMany(l,"isEnabled",(...e)=>e.some(ze)),c})}_createButton(e){const t=e.name;this.editor.ui.componentFactory.add(Oe(t),i=>{const n=this.editor.commands.get("imageStyle"),o=new w.ButtonView(i);return o.set({label:e.title,icon:e.icon,tooltip:!0,isToggleable:!0}),o.bind("isEnabled").to(n,"isEnabled"),o.bind("isOn").to(n,"value",e=>e===t),o.on("execute",this._executeCommand.bind(this,t)),o})}_executeCommand(e){this.editor.execute("imageStyle",{value:e}),this.editor.editing.view.focus()}}function Ue(e,t){for(const i of e)t[i.title]&&(i.title=t[i.title]);return e}function Oe(e){return"imageStyle:"+e}function Pe(e,t){return(e?e+": ":"")+t}class je extends n.Plugin{static get requires(){return[Ae,Re]}static get pluginName(){return"ImageStyle"}}class Ne extends n.Plugin{static get requires(){return[c.WidgetToolbarRepository,u]}static get pluginName(){return"ImageToolbar"}afterInit(){const e=this.editor,t=e.t,i=e.plugins.get(c.WidgetToolbarRepository),n=e.plugins.get("ImageUtils");var o;i.register("image",{ariaLabel:t("Image toolbar"),items:(o=e.config.get("image.toolbar")||[],o.map(e=>Ve(e)?e.name:e)),getRelatedElement:e=>n.getClosestSelectedImageWidget(e)})}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/indent.js b/core/assets/vendor/ckeditor5/indent.js
new file mode 100644
index 0000000000000000000000000000000000000000..959ab76707e0d9018bdee54b59e36855a7b9bc85
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/indent.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Decrease indent","Increase indent":"Increase indent"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.indent=function(t){var e={};function n(i){if(e[i])return e[i].exports;var s=e[i]={i:i,l:!1,exports:{}};return t[i].call(s.exports,s,s.exports,n),s.l=!0,s.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)n.d(i,s,function(e){return t[e]}.bind(null,s));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=5)}([function(t,e,n){t.exports=n(1)("./src/core.js")},function(t,e){t.exports=CKEditor5.dll},function(t,e,n){t.exports=n(1)("./src/ui.js")},function(t,e,n){t.exports=n(1)("./src/engine.js")},function(t,e,n){t.exports=n(1)("./src/utils.js")},function(t,e,n){"use strict";n.r(e),n.d(e,"Indent",(function(){return a})),n.d(e,"IndentEditing",(function(){return s})),n.d(e,"IndentUI",(function(){return c})),n.d(e,"IndentBlock",(function(){return b}));var i=n(0);class s extends i.Plugin{static get pluginName(){return"IndentEditing"}init(){const t=this.editor;t.commands.add("indent",new i.MultiCommand(t)),t.commands.add("outdent",new i.MultiCommand(t))}}var o=n(2),r='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm5 6c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM2.75 16.5h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 1 0 0 1.5zM1.632 6.95 5.02 9.358a.4.4 0 0 1-.013.661l-3.39 2.207A.4.4 0 0 1 1 11.892V7.275a.4.4 0 0 1 .632-.326z"/></svg>',d='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm5 6c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM2.75 16.5h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 1 0 0 1.5zm1.618-9.55L.98 9.358a.4.4 0 0 0 .013.661l3.39 2.207A.4.4 0 0 0 5 11.892V7.275a.4.4 0 0 0-.632-.326z"/></svg>';class c extends i.Plugin{static get pluginName(){return"IndentUI"}init(){const t=this.editor,e=t.locale,n=t.t,i="ltr"==e.uiLanguageDirection?r:d,s="ltr"==e.uiLanguageDirection?d:r;this._defineButton("indent",n("Increase indent"),i),this._defineButton("outdent",n("Decrease indent"),s)}_defineButton(t,e,n){const i=this.editor;i.ui.componentFactory.add(t,s=>{const r=i.commands.get(t),d=new o.ButtonView(s);return d.set({label:e,icon:n,tooltip:!0}),d.bind("isOn","isEnabled").to(r,"value","isEnabled"),this.listenTo(d,"execute",()=>{i.execute(t),i.editing.view.focus()}),d})}}class a extends i.Plugin{static get pluginName(){return"Indent"}static get requires(){return[s,c]}}var u=n(3),l=n(4);class h extends i.Command{constructor(t,e){super(t),this._indentBehavior=e}refresh(){const t=this.editor.model,e=Object(l.first)(t.document.selection.getSelectedBlocks());e&&t.schema.checkAttribute(e,"blockIndent")?this.isEnabled=this._indentBehavior.checkEnabled(e.getAttribute("blockIndent")):this.isEnabled=!1}execute(){const t=this.editor.model,e=function(t){const e=t.document.selection,n=t.schema;return Array.from(e.getSelectedBlocks()).filter(t=>n.checkAttribute(t,"blockIndent"))}(t);t.change(t=>{for(const n of e){const e=n.getAttribute("blockIndent"),i=this._indentBehavior.getNextIndent(e);i?t.setAttribute("blockIndent",i,n):t.removeAttribute("blockIndent",n)}})}}class g{constructor(t){this.isForward="forward"===t.direction,this.offset=t.offset,this.unit=t.unit}checkEnabled(t){const e=parseFloat(t||0);return this.isForward||e>0}getNextIndent(t){const e=parseFloat(t||0);if(!(!t||t.endsWith(this.unit)))return this.isForward?this.offset+this.unit:void 0;const n=e+(this.isForward?this.offset:-this.offset);return n>0?n+this.unit:void 0}}class f{constructor(t){this.isForward="forward"===t.direction,this.classes=t.classes}checkEnabled(t){const e=this.classes.indexOf(t);return this.isForward?e<this.classes.length-1:e>=0}getNextIndent(t){const e=this.classes.indexOf(t),n=this.isForward?1:-1;return this.classes[e+n]}}const m=["paragraph","heading1","heading2","heading3","heading4","heading5","heading6"];class b extends i.Plugin{constructor(t){super(t),t.config.define("indentBlock",{offset:40,unit:"px"})}static get pluginName(){return"IndentBlock"}init(){const t=this.editor,e=t.config.get("indentBlock"),n=!e.classes||!e.classes.length,i=Object.assign({direction:"forward"},e),s=Object.assign({direction:"backward"},e);n?(t.data.addStyleProcessorRules(u.addMarginRules),this._setupConversionUsingOffset(t.conversion),t.commands.add("indentBlock",new h(t,new g(i))),t.commands.add("outdentBlock",new h(t,new g(s)))):(this._setupConversionUsingClasses(e.classes),t.commands.add("indentBlock",new h(t,new f(i))),t.commands.add("outdentBlock",new h(t,new f(s))))}afterInit(){const t=this.editor,e=t.model.schema,n=t.commands.get("indent"),i=t.commands.get("outdent"),s=t.config.get("heading.options");(s&&s.map(t=>t.model)||m).forEach(t=>{e.isRegistered(t)&&e.extend(t,{allowAttributes:"blockIndent"})}),e.setAttributeProperties("blockIndent",{isFormatting:!0}),n.registerChildCommand(t.commands.get("indentBlock")),i.registerChildCommand(t.commands.get("outdentBlock"))}_setupConversionUsingOffset(){const t=this.editor.conversion,e="rtl"===this.editor.locale.contentLanguageDirection?"margin-right":"margin-left";t.for("upcast").attributeToAttribute({view:{styles:{[e]:/[\s\S]+/}},model:{key:"blockIndent",value:t=>t.getStyle(e)}}),t.for("downcast").attributeToAttribute({model:"blockIndent",view:t=>({key:"style",value:{[e]:t}})})}_setupConversionUsingClasses(t){const e={model:{key:"blockIndent",values:[]},view:{}};for(const n of t)e.model.values.push(n),e.view[n]={key:"class",value:[n]};this.editor.conversion.attributeToAttribute(e)}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/language.js b/core/assets/vendor/ckeditor5/language.js
new file mode 100644
index 0000000000000000000000000000000000000000..760ab9835abb9519d811799559ec5f7a6325da8d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/language.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Choose language":"Choose language",Language:"Language","Remove language":"Remove language"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.language=function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(e,t,n){e.exports=n(3)("./src/core.js")},function(e,t,n){e.exports=n(3)("./src/ui.js")},function(e,t,n){e.exports=n(3)("./src/utils.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,n){var o=n(5),r=n(6);"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};o(r,a);e.exports=r.locals||{}},function(e,t,n){"use strict";var o,r=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},a=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),i=[];function u(e){for(var t=-1,n=0;n<i.length;n++)if(i[n].identifier===e){t=n;break}return t}function s(e,t){for(var n={},o=[],r=0;r<e.length;r++){var a=e[r],s=t.base?a[0]+t.base:a[0],l=n[s]||0,c="".concat(s," ").concat(l);n[s]=l+1;var d=u(c),g={css:a[1],media:a[2],sourceMap:a[3]};-1!==d?(i[d].references++,i[d].updater(g)):i.push({identifier:c,updater:b(g,t),references:1}),o.push(c)}return o}function l(e){var t=document.createElement("style"),o=e.attributes||{};if(void 0===o.nonce){var r=n.nc;r&&(o.nonce=r)}if(Object.keys(o).forEach((function(e){t.setAttribute(e,o[e])})),"function"==typeof e.insert)e.insert(t);else{var i=a(e.insert||"head");if(!i)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");i.appendChild(t)}return t}var c,d=(c=[],function(e,t){return c[e]=t,c.filter(Boolean).join("\n")});function g(e,t,n,o){var r=n?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(e.styleSheet)e.styleSheet.cssText=d(t,r);else{var a=document.createTextNode(r),i=e.childNodes;i[t]&&e.removeChild(i[t]),i.length?e.insertBefore(a,i[t]):e.appendChild(a)}}function f(e,t,n){var o=n.css,r=n.media,a=n.sourceMap;if(r?e.setAttribute("media",r):e.removeAttribute("media"),a&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),e.styleSheet)e.styleSheet.cssText=o;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(o))}}var p=null,m=0;function b(e,t){var n,o,r;if(t.singleton){var a=m++;n=p||(p=l(t)),o=g.bind(null,n,a,!1),r=g.bind(null,n,a,!0)}else n=l(t),o=f.bind(null,n,t),r=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else r()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=r());var n=s(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var o=0;o<n.length;o++){var r=u(n[o]);i[r].references--}for(var a=s(e,t),l=0;l<n.length;l++){var c=u(n[l]);0===i[c].references&&(i[c].updater(),i.splice(c,1))}n=a}}}},function(e,t){e.exports=".ck-content span[lang]{font-style:italic}"},function(e,t,n){"use strict";n.r(t),n.d(t,"TextPartLanguage",(function(){return c})),n.d(t,"TextPartLanguageEditing",(function(){return u})),n.d(t,"TextPartLanguageUI",(function(){return l}));var o=n(0),r=n(2);function a(e,t){return`${e}:${t=t||Object(r.getLanguageDirection)(e)}`}class i extends o.Command{refresh(){const e=this.editor.model,t=e.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=e.schema.checkAttributeInSelection(t.selection,"language")}execute({languageCode:e,textDirection:t}={}){const n=this.editor.model,o=n.document.selection,r=!!e&&a(e,t);n.change(e=>{if(o.isCollapsed)r?e.setSelectionAttribute("language",r):e.removeSelectionAttribute("language");else{const t=n.schema.getValidRanges(o.getRanges(),"language");for(const n of t)r?e.setAttribute("language",r,n):e.removeAttribute("language",n)}})}_getValueFromFirstAllowedNode(){const e=this.editor.model,t=e.schema,n=e.document.selection;if(n.isCollapsed)return n.getAttribute("language")||!1;for(const e of n.getRanges())for(const n of e.getItems())if(t.checkAttribute(n,"language"))return n.getAttribute("language")||!1;return!1}}class u extends o.Plugin{static get pluginName(){return"TextPartLanguageEditing"}constructor(e){super(e),e.config.define("language",{textPartLanguage:[{title:"Arabic",languageCode:"ar"},{title:"French",languageCode:"fr"},{title:"Spanish",languageCode:"es"}]})}init(){const e=this.editor;e.model.schema.extend("$text",{allowAttributes:"language"}),e.model.schema.setAttributeProperties("language",{copyOnEnter:!0}),this._defineConverters(),e.commands.add("textPartLanguage",new i(e))}_defineConverters(){const e=this.editor.conversion;e.for("upcast").elementToAttribute({model:{key:"language",value:e=>a(e.getAttribute("lang"),e.getAttribute("dir"))},view:{name:"span",attributes:{lang:/[\s\S]+/}}}),e.for("downcast").attributeToElement({model:"language",view:(e,{writer:t})=>{if(!e)return;const{languageCode:n,textDirection:o}=function(e){const[t,n]=e.split(":");return{languageCode:t,textDirection:n}}(e);return t.createAttributeElement("span",{lang:n,dir:o})}})}}var s=n(1);n(4);class l extends o.Plugin{static get pluginName(){return"TextPartLanguageUI"}init(){const e=this.editor,t=e.t,n=e.config.get("language.textPartLanguage"),o=t("Choose language"),i=t("Remove language"),u=t("Language");e.ui.componentFactory.add("textPartLanguage",t=>{const l=new r.Collection,c={},d=e.commands.get("textPartLanguage");l.add({type:"button",model:new s.Model({label:i,languageCode:!1,withText:!0})}),l.add({type:"separator"});for(const e of n){const t={type:"button",model:new s.Model({label:e.title,languageCode:e.languageCode,textDirection:e.textDirection,withText:!0})},n=a(e.languageCode,e.textDirection);t.model.bind("isOn").to(d,"value",e=>e===n),l.add(t),c[n]=e.title}const g=Object(s.createDropdown)(t);return Object(s.addListToDropdown)(g,l),g.buttonView.set({isOn:!1,withText:!0,tooltip:u}),g.extendTemplate({attributes:{class:["ck-text-fragment-language-dropdown"]}}),g.bind("isEnabled").to(d,"isEnabled"),g.buttonView.bind("label").to(d,"value",e=>c[e]||o),this.listenTo(g,"execute",t=>{d.execute({languageCode:t.source.languageCode,textDirection:t.source.textDirection}),e.editing.view.focus()}),g})}}class c extends o.Plugin{static get requires(){return[u,l]}static get pluginName(){return"TextPartLanguage"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/link.js b/core/assets/vendor/ckeditor5/link.js
new file mode 100644
index 0000000000000000000000000000000000000000..9a9b99b56876819c8a25102b07f2e8417cdc0aba
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/link.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{Downloadable:"Downloadable","Edit link":"Edit link",Link:"Link","Link image":"Link image","Link URL":"Link URL","Open in a new tab":"Open in a new tab","Open link in new tab":"Open link in new tab","This link has no URL":"This link has no URL",Unlink:"Unlink"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.link=function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=21)}([function(e,t,i){e.exports=i(4)("./src/ui.js")},function(e,t,i){e.exports=i(4)("./src/core.js")},function(e,t,i){e.exports=i(4)("./src/utils.js")},function(e,t,i){e.exports=i(4)("./src/typing.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,i){e.exports=i(4)("./src/engine.js")},function(e,t,i){"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},r=function(){var e={};return function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}e[t]=i}return e[t]}}(),s=[];function a(e){for(var t=-1,i=0;i<s.length;i++)if(s[i].identifier===e){t=i;break}return t}function c(e,t){for(var i={},n=[],o=0;o<e.length;o++){var r=e[o],c=t.base?r[0]+t.base:r[0],l=i[c]||0,u="".concat(c," ").concat(l);i[c]=l+1;var d=a(u),k={css:r[1],media:r[2],sourceMap:r[3]};-1!==d?(s[d].references++,s[d].updater(k)):s.push({identifier:u,updater:g(k,t),references:1}),n.push(u)}return n}function l(e){var t=document.createElement("style"),n=e.attributes||{};if(void 0===n.nonce){var o=i.nc;o&&(n.nonce=o)}if(Object.keys(n).forEach((function(e){t.setAttribute(e,n[e])})),"function"==typeof e.insert)e.insert(t);else{var s=r(e.insert||"head");if(!s)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");s.appendChild(t)}return t}var u,d=(u=[],function(e,t){return u[e]=t,u.filter(Boolean).join("\n")});function k(e,t,i,n){var o=i?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(e.styleSheet)e.styleSheet.cssText=d(t,o);else{var r=document.createTextNode(o),s=e.childNodes;s[t]&&e.removeChild(s[t]),s.length?e.insertBefore(r,s[t]):e.appendChild(r)}}function f(e,t,i){var n=i.css,o=i.media,r=i.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),r&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}var h=null,m=0;function g(e,t){var i,n,o;if(t.singleton){var r=m++;i=h||(h=l(t)),n=k.bind(null,i,r,!1),o=k.bind(null,i,r,!0)}else i=l(t),n=f.bind(null,i,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(i)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var i=c(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var n=0;n<i.length;n++){var o=a(i[n]);s[o].references--}for(var r=c(e,t),l=0;l<i.length;l++){var u=a(i[l]);0===s[u].references&&(s[u].updater(),s.splice(u,1))}i=r}}}},function(e,t,i){var n=i(6),o=i(14);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,r);e.exports=o.locals||{}},function(e,t,i){e.exports=i(4)("./src/clipboard.js")},function(e,t,i){"use strict";(function(e){var i="object"==typeof e&&e&&e.Object===Object&&e;t.a=i}).call(this,i(11))},function(e,t,i){e.exports=i(4)("./src/widget.js")},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i},function(e,t,i){var n=i(6),o=i(13);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,r);e.exports=o.locals||{}},function(e,t){e.exports=".ck .ck-link_selected{background:var(--ck-color-link-selected-background)}.ck .ck-link_selected span.image-inline{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-link-selected-background)}.ck .ck-fake-link-selection{background:var(--ck-color-link-fake-selection)}.ck .ck-fake-link-selection_collapsed{height:100%;border-right:1px solid var(--ck-color-base-text);margin-right:-1px;outline:1px solid hsla(0,0%,100%,.5)}"},function(e,t){e.exports='.ck-vertical-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-text-width)*0.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){padding:var(--ck-spacing-standard);margin-top:var(--ck-spacing-large);border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after,[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}'},function(e,t,i){var n=i(6),o=i(16);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,r);e.exports=o.locals||{}},function(e,t){e.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-field-view{flex-basis:100%}.ck.ck-link-form .ck-button{flex-basis:50%}}.ck.ck-link-form_layout-vertical{display:block}.ck.ck-link-form_layout-vertical .ck-button.ck-button-cancel,.ck.ck-link-form_layout-vertical .ck-button.ck-button-save{margin-top:var(--ck-spacing-medium)}.ck.ck-link-form_layout-vertical{padding:0;min-width:var(--ck-input-text-width)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view .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,[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:var(--ck-spacing-standard) var(--ck-spacing-large)}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton{border:0;padding:0;width:100%}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton:hover{background:none}"},function(e,t,i){var n=i(6),o=i(18);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,r);e.exports=o.locals||{}},function(e,t){e.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 .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}[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 .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%}[dir=ltr] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview),[dir=rtl] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){margin-left:0}}"},function(e,t,i){var n=i(6),o=i(20);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,r);e.exports=o.locals||{}},function(e,t){e.exports='.ck.ck-editor__editable a span.image-inline:after,.ck.ck-editor__editable figure.image>a:after{display:block;position:absolute}:root{--ck-link-image-indicator-icon-size:20;--ck-link-image-indicator-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck.ck-editor__editable a span.image-inline:after,.ck.ck-editor__editable figure.image>a:after{content:"";top:min(var(--ck-spacing-medium),6%);right:min(var(--ck-spacing-medium),6%);background-color:rgba(0,0,0,.4);background-image:url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExLjA3NyAxNWwuOTkxLTEuNDE2YS43NS43NSAwIDExMS4yMjkuODZsLTEuMTQ4IDEuNjRhLjc0OC43NDggMCAwMS0uMjE3LjIwNiA1LjI1MSA1LjI1MSAwIDAxLTguNTAzLTUuOTU1Ljc0MS43NDEgMCAwMS4xMi0uMjc0bDEuMTQ3LTEuNjM5YS43NS43NSAwIDExMS4yMjguODZMNC45MzMgMTAuN2wuMDA2LjAwM2EzLjc1IDMuNzUgMCAwMDYuMTMyIDQuMjk0bC4wMDYuMDA0em01LjQ5NC01LjMzNWEuNzQ4Ljc0OCAwIDAxLS4xMi4yNzRsLTEuMTQ3IDEuNjM5YS43NS43NSAwIDExLTEuMjI4LS44NmwuODYtMS4yM2EzLjc1IDMuNzUgMCAwMC02LjE0NC00LjMwMWwtLjg2IDEuMjI5YS43NS43NSAwIDAxLTEuMjI5LS44NmwxLjE0OC0xLjY0YS43NDguNzQ4IDAgMDEuMjE3LS4yMDYgNS4yNTEgNS4yNTEgMCAwMTguNTAzIDUuOTU1em0tNC41NjMtMi41MzJhLjc1Ljc1IDAgMDEuMTg0IDEuMDQ1bC0zLjE1NSA0LjUwNWEuNzUuNzUgMCAxMS0xLjIyOS0uODZsMy4xNTUtNC41MDZhLjc1Ljc1IDAgMDExLjA0NS0uMTg0eiIvPjwvc3ZnPg==");background-size:14px;background-repeat:no-repeat;background-position:50%;border-radius:100%;overflow:hidden;width:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size));height:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size))}'},function(e,t,i){"use strict";i.r(t),i.d(t,"Link",(function(){return we})),i.d(t,"LinkEditing",(function(){return re})),i.d(t,"LinkUI",(function(){return he})),i.d(t,"LinkImage",(function(){return xe})),i.d(t,"LinkImageEditing",(function(){return ve})),i.d(t,"LinkImageUI",(function(){return Ae})),i.d(t,"AutoLink",(function(){return be}));var n=i(1),o=i(5),r=i(3),s=i(8),a=i(2);class c{constructor(){this._definitions=new Set}get length(){return this._definitions.size}add(e){Array.isArray(e)?e.forEach(e=>this._definitions.add(e)):this._definitions.add(e)}getDispatcher(){return e=>{e.on("attribute:linkHref",(e,t,i)=>{if(!i.consumable.test(t.item,"attribute:linkHref"))return;const n=i.writer,o=n.document.selection;for(const e of this._definitions){const r=n.createAttributeElement("a",e.attributes,{priority:5});e.classes&&n.addClass(e.classes,r);for(const t in e.styles)n.setStyle(t,e.styles[t],r);n.setCustomProperty("link",!0,r),e.callback(t.attributeNewValue)?t.item.is("selection")?n.wrap(o.getFirstRange(),r):n.wrap(i.mapper.toViewRange(t.range),r):n.unwrap(i.mapper.toViewRange(t.range),r)}},{priority:"high"})}}getDispatcherForLinkedImage(){return e=>{e.on("attribute:linkHref:imageBlock",(e,t,{writer:i,mapper:n})=>{const o=n.toViewElement(t.item),r=Array.from(o.getChildren()).find(e=>"a"===e.name);for(const e of this._definitions){const n=Object(a.toMap)(e.attributes);if(e.callback(t.attributeNewValue)){for(const[e,t]of n)"class"===e?i.addClass(t,r):i.setAttribute(e,t,r);e.classes&&i.addClass(e.classes,r);for(const t in e.styles)i.setStyle(t,e.styles[t],r)}else{for(const[e,t]of n)"class"===e?i.removeClass(t,r):i.removeAttribute(e,r);e.classes&&i.removeClass(e.classes,r);for(const t in e.styles)i.removeStyle(t,r)}}})}}}var l=function(e,t,i){var n=-1,o=e.length;t<0&&(t=-t>o?0:o+t),(i=i>o?o:i)<0&&(i+=o),o=t>i?0:i-t>>>0,t>>>=0;for(var r=Array(o);++n<o;)r[n]=e[n+t];return r};var u=function(e,t,i){var n=e.length;return i=void 0===i?n:i,!t&&i>=n?e:l(e,t,i)},d=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");var k=function(e){return d.test(e)};var f=function(e){return e.split("")},h="[\\ud800-\\udfff]",m="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",g="\\ud83c[\\udffb-\\udfff]",b="[^\\ud800-\\udfff]",p="(?:\\ud83c[\\udde6-\\uddff]){2}",w="[\\ud800-\\udbff][\\udc00-\\udfff]",v="(?:"+m+"|"+g+")"+"?",_="[\\ufe0e\\ufe0f]?"+v+("(?:\\u200d(?:"+[b,p,w].join("|")+")[\\ufe0e\\ufe0f]?"+v+")*"),y="(?:"+[b+m+"?",m,p,w,h].join("|")+")",A=RegExp(g+"(?="+g+")|"+y+_,"g");var x=function(e){return e.match(A)||[]};var I=function(e){return k(e)?x(e):f(e)},T=i(9),S="object"==typeof self&&self&&self.Object===Object&&self,E=(T.a||S||Function("return this")()).Symbol;var V=function(e,t){for(var i=-1,n=null==e?0:e.length,o=Array(n);++i<n;)o[i]=t(e[i],i,e);return o},L=Array.isArray,C=Object.prototype,M=C.hasOwnProperty,D=C.toString,j=E?E.toStringTag:void 0;var O=function(e){var t=M.call(e,j),i=e[j];try{e[j]=void 0;var n=!0}catch(e){}var o=D.call(e);return n&&(t?e[j]=i:delete e[j]),o},B=Object.prototype.toString;var N=function(e){return B.call(e)},H=E?E.toStringTag:void 0;var P=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":H&&H in Object(e)?O(e):N(e)};var U=function(e){return null!=e&&"object"==typeof e};var F=function(e){return"symbol"==typeof e||U(e)&&"[object Symbol]"==P(e)},R=E?E.prototype:void 0,z=R?R.toString:void 0;var q=function e(t){if("string"==typeof t)return t;if(L(t))return V(t,e)+"";if(F(t))return z?z.call(t):"";var i=t+"";return"0"==i&&1/t==-1/0?"-0":i};var K=function(e){return null==e?"":q(e)};var Z=function(e){return function(t){t=K(t);var i=k(t)?I(t):void 0,n=i?i[0]:t.charAt(0),o=i?u(i,1).join(""):t.slice(1);return n[e]()+o}}("toUpperCase");const Y=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g,Q=/^(?:(?:https?|ftps?|mailto):|[^a-z]|[a-z+.-]+(?:[^a-z+.:-]|$))/i,W=/^[\S]+@((?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.))+(?:[a-z\u00a1-\uffff]{2,})$/i,$=/^((\w+:(\/{2,})?)|(\W))/i;function J(e,{writer:t}){const i=t.createAttributeElement("a",{href:e},{priority:5});return t.setCustomProperty("link",!0,i),i}function G(e){return function(e){return e.replace(Y,"").match(Q)}(e=String(e))?e:"#"}function X(e,t){return!!e&&t.checkAttribute(e.name,"linkHref")}function ee(e,t){const i=(n=e,W.test(n)?"mailto:":t);var n;const o=!!i&&!$.test(e);return e&&o?i+e:e}class te extends n.Command{constructor(e){super(e),this.manualDecorators=new a.Collection,this.automaticDecorators=new c}restoreManualDecoratorStates(){for(const e of this.manualDecorators)e.value=this._getDecoratorStateFromModel(e.id)}refresh(){const e=this.editor.model,t=e.document.selection,i=t.getSelectedElement()||Object(a.first)(t.getSelectedBlocks());X(i,e.schema)?(this.value=i.getAttribute("linkHref"),this.isEnabled=e.schema.checkAttribute(i,"linkHref")):(this.value=t.getAttribute("linkHref"),this.isEnabled=e.schema.checkAttributeInSelection(t,"linkHref"));for(const e of this.manualDecorators)e.value=this._getDecoratorStateFromModel(e.id)}execute(e,t={}){const i=this.editor.model,n=i.document.selection,o=[],s=[];for(const e in t)t[e]?o.push(e):s.push(e);i.change(t=>{if(n.isCollapsed){const c=n.getFirstPosition();if(n.hasAttribute("linkHref")){const a=Object(r.findAttributeRange)(c,"linkHref",n.getAttribute("linkHref"),i);t.setAttribute("linkHref",e,a),o.forEach(e=>{t.setAttribute(e,!0,a)}),s.forEach(e=>{t.removeAttribute(e,a)}),t.setSelection(t.createPositionAfter(a.end.nodeBefore))}else if(""!==e){const r=Object(a.toMap)(n.getAttributes());r.set("linkHref",e),o.forEach(e=>{r.set(e,!0)});const{end:s}=i.insertContent(t.createText(e,r),c);t.setSelection(s)}["linkHref",...o,...s].forEach(e=>{t.removeSelectionAttribute(e)})}else{const r=i.schema.getValidRanges(n.getRanges(),"linkHref"),a=[];for(const e of n.getSelectedBlocks())i.schema.checkAttribute(e,"linkHref")&&a.push(t.createRangeOn(e));const c=a.slice();for(const e of r)this._isRangeToUpdate(e,a)&&c.push(e);for(const i of c)t.setAttribute("linkHref",e,i),o.forEach(e=>{t.setAttribute(e,!0,i)}),s.forEach(e=>{t.removeAttribute(e,i)})}})}_getDecoratorStateFromModel(e){const t=this.editor.model,i=t.document.selection,n=i.getSelectedElement();return X(n,t.schema)?n.getAttribute(e):i.getAttribute(e)}_isRangeToUpdate(e,t){for(const i of t)if(i.containsRange(e))return!1;return!0}}class ie extends n.Command{refresh(){const e=this.editor.model,t=e.document.selection,i=t.getSelectedElement();X(i,e.schema)?this.isEnabled=e.schema.checkAttribute(i,"linkHref"):this.isEnabled=e.schema.checkAttributeInSelection(t,"linkHref")}execute(){const e=this.editor,t=this.editor.model,i=t.document.selection,n=e.commands.get("link");t.change(e=>{const o=i.isCollapsed?[Object(r.findAttributeRange)(i.getFirstPosition(),"linkHref",i.getAttribute("linkHref"),t)]:t.schema.getValidRanges(i.getRanges(),"linkHref");for(const t of o)if(e.removeAttribute("linkHref",t),n)for(const i of n.manualDecorators)e.removeAttribute(i.id,t)})}}class ne{constructor({id:e,label:t,attributes:i,classes:n,styles:o,defaultValue:r}){this.id=e,this.set("value"),this.defaultValue=r,this.label=t,this.attributes=i,this.classes=n,this.styles=o}_createPattern(){return{attributes:this.attributes,classes:this.classes,styles:this.styles}}}Object(a.mix)(ne,a.ObservableMixin);i(12);const oe=/^(https?:)?\/\//;class re extends n.Plugin{static get pluginName(){return"LinkEditing"}static get requires(){return[r.TwoStepCaretMovement,r.Input,s.ClipboardPipeline]}constructor(e){super(e),e.config.define("link",{addTargetToExternalLinks:!1})}init(){const e=this.editor;e.model.schema.extend("$text",{allowAttributes:"linkHref"}),e.conversion.for("dataDowncast").attributeToElement({model:"linkHref",view:J}),e.conversion.for("editingDowncast").attributeToElement({model:"linkHref",view:(e,t)=>J(G(e),t)}),e.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:{href:!0}},model:{key:"linkHref",value:e=>e.getAttribute("href")}}),e.commands.add("link",new te(e)),e.commands.add("unlink",new ie(e));const t=function(e,t){const i={"Open in a new tab":e("Open in a new tab"),Downloadable:e("Downloadable")};return t.forEach(e=>(e.label&&i[e.label]&&(e.label=i[e.label]),e)),t}(e.t,function(e){const t=[];if(e)for(const[i,n]of Object.entries(e)){const e=Object.assign({},n,{id:"link"+Z(i)});t.push(e)}return t}(e.config.get("link.decorators")));this._enableAutomaticDecorators(t.filter(e=>"automatic"===e.mode)),this._enableManualDecorators(t.filter(e=>"manual"===e.mode));e.plugins.get(r.TwoStepCaretMovement).registerAttribute("linkHref"),Object(r.inlineHighlight)(e,"linkHref","a","ck-link_selected"),this._enableInsertContentSelectionAttributesFixer(),this._enableClickingAfterLink(),this._enableTypingOverLink(),this._handleDeleteContentAfterLink()}_enableAutomaticDecorators(e){const t=this.editor,i=t.commands.get("link").automaticDecorators;t.config.get("link.addTargetToExternalLinks")&&i.add({id:"linkIsExternal",mode:"automatic",callback:e=>oe.test(e),attributes:{target:"_blank",rel:"noopener noreferrer"}}),i.add(e),i.length&&t.conversion.for("downcast").add(i.getDispatcher())}_enableManualDecorators(e){if(!e.length)return;const t=this.editor,i=t.commands.get("link").manualDecorators;e.forEach(e=>{t.model.schema.extend("$text",{allowAttributes:e.id}),e=new ne(e),i.add(e),t.conversion.for("downcast").attributeToElement({model:e.id,view:(t,{writer:i})=>{if(t){const t=i.createAttributeElement("a",e.attributes,{priority:5});e.classes&&i.addClass(e.classes,t);for(const n in e.styles)i.setStyle(n,e.styles[n],t);return i.setCustomProperty("link",!0,t),t}}}),t.conversion.for("upcast").elementToAttribute({view:{name:"a",...e._createPattern()},model:{key:e.id}})})}_enableInsertContentSelectionAttributesFixer(){const e=this.editor.model,t=e.document.selection;this.listenTo(e,"insertContent",()=>{const i=t.anchor.nodeBefore,n=t.anchor.nodeAfter;t.hasAttribute("linkHref")&&i&&i.hasAttribute("linkHref")&&(n&&n.hasAttribute("linkHref")||e.change(t=>{se(t,ce(e.schema))}))},{priority:"low"})}_enableClickingAfterLink(){const e=this.editor,t=e.model;e.editing.view.addObserver(o.MouseObserver);let i=!1;this.listenTo(e.editing.view.document,"mousedown",()=>{i=!0}),this.listenTo(e.editing.view.document,"selectionChange",()=>{if(!i)return;i=!1;const e=t.document.selection;if(!e.isCollapsed)return;if(!e.hasAttribute("linkHref"))return;const n=e.getFirstPosition(),o=Object(r.findAttributeRange)(n,"linkHref",e.getAttribute("linkHref"),t);(n.isTouching(o.start)||n.isTouching(o.end))&&t.change(e=>{se(e,ce(t.schema))})})}_enableTypingOverLink(){const e=this.editor,t=e.editing.view;let i,n;this.listenTo(t.document,"delete",()=>{n=!0},{priority:"high"}),this.listenTo(e.model,"deleteContent",()=>{const t=e.model.document.selection;t.isCollapsed||(n?n=!1:ae(e)&&function(e){const t=e.document.selection,i=t.getFirstPosition(),n=t.getLastPosition(),o=i.nodeAfter;if(!o)return!1;if(!o.is("$text"))return!1;if(!o.hasAttribute("linkHref"))return!1;const s=n.textNode||n.nodeBefore;if(o===s)return!0;return Object(r.findAttributeRange)(i,"linkHref",o.getAttribute("linkHref"),e).containsRange(e.createRange(i,n),!0)}(e.model)&&(i=t.getAttributes()))},{priority:"high"}),this.listenTo(e.model,"insertContent",(t,[o])=>{n=!1,ae(e)&&i&&(e.model.change(e=>{for(const[t,n]of i)e.setAttribute(t,n,o)}),i=null)},{priority:"high"})}_handleDeleteContentAfterLink(){const e=this.editor,t=e.model,i=t.document.selection,n=e.editing.view;let o=!1,s=!1;this.listenTo(n.document,"delete",(e,t)=>{s=t.domEvent.keyCode===a.keyCodes.backspace},{priority:"high"}),this.listenTo(t,"deleteContent",()=>{o=!1;const e=i.getFirstPosition(),n=i.getAttribute("linkHref");if(!n)return;const s=Object(r.findAttributeRange)(e,"linkHref",n,t);o=s.containsPosition(e)||s.end.isEqual(e)},{priority:"high"}),this.listenTo(t,"deleteContent",()=>{s&&(s=!1,o||e.model.enqueueChange(e=>{se(e,ce(t.schema))}))},{priority:"low"})}}function se(e,t){e.removeSelectionAttribute("linkHref");for(const i of t)e.removeSelectionAttribute(i)}function ae(e){return e.plugins.get("Input").isInput(e.model.change(e=>e.batch))}function ce(e){return e.getDefinition("$text").allowAttributes.filter(e=>e.startsWith("link"))}var le=i(0),ue=i(10);i(7),i(15);class de extends le.View{constructor(e,t){super(e);const i=e.t;this.focusTracker=new a.FocusTracker,this.keystrokes=new a.KeystrokeHandler,this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(i("Save"),n.icons.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(i("Cancel"),n.icons.cancel,"ck-button-cancel","cancel"),this._manualDecoratorSwitches=this._createManualDecoratorSwitches(t),this.children=this._createFormChildren(t.manualDecorators),this._focusables=new le.ViewCollection,this._focusCycler=new le.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});const o=["ck","ck-link-form","ck-responsive-form"];t.manualDecorators.length&&o.push("ck-link-form_layout-vertical","ck-vertical-form"),this.setTemplate({tag:"form",attributes:{class:o,tabindex:"-1"},children:this.children}),Object(le.injectCssTransitionDisabler)(this)}getDecoratorSwitchesState(){return Array.from(this._manualDecoratorSwitches).reduce((e,t)=>(e[t.name]=t.isOn,e),{})}render(){super.render(),Object(le.submitHandler)({view:this});[this.urlInputView,...this._manualDecoratorSwitches,this.saveButtonView,this.cancelButtonView].forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createUrlInput(){const e=this.locale.t,t=new le.LabeledFieldView(this.locale,le.createLabeledInputText);return t.label=e("Link URL"),t}_createButton(e,t,i,n){const o=new le.ButtonView(this.locale);return o.set({label:e,icon:t,tooltip:!0}),o.extendTemplate({attributes:{class:i}}),n&&o.delegate("execute").to(this,n),o}_createManualDecoratorSwitches(e){const t=this.createCollection();for(const i of e.manualDecorators){const n=new le.SwitchButtonView(this.locale);n.set({name:i.id,label:i.label,withText:!0}),n.bind("isOn").toMany([i,e],"value",(e,t)=>void 0===t&&void 0===e?i.defaultValue:e),n.on("execute",()=>{i.set("value",!n.isOn)}),t.add(n)}return t}_createFormChildren(e){const t=this.createCollection();if(t.add(this.urlInputView),e.length){const e=new le.View;e.setTemplate({tag:"ul",children:this._manualDecoratorSwitches.map(e=>({tag:"li",children:[e],attributes:{class:["ck","ck-list__item"]}})),attributes:{class:["ck","ck-reset","ck-list"]}}),t.add(e)}return t.add(this.saveButtonView),t.add(this.cancelButtonView),t}}i(17);class ke extends le.View{constructor(e){super(e);const t=e.t;this.focusTracker=new a.FocusTracker,this.keystrokes=new a.KeystrokeHandler,this.previewButtonView=this._createPreviewButton(),this.unlinkButtonView=this._createButton(t("Unlink"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.077 15 .991-1.416a.75.75 0 1 1 1.229.86l-1.148 1.64a.748.748 0 0 1-.217.206 5.251 5.251 0 0 1-8.503-5.955.741.741 0 0 1 .12-.274l1.147-1.639a.75.75 0 1 1 1.228.86L4.933 10.7l.006.003a3.75 3.75 0 0 0 6.132 4.294l.006.004zm5.494-5.335a.748.748 0 0 1-.12.274l-1.147 1.639a.75.75 0 1 1-1.228-.86l.86-1.23a3.75 3.75 0 0 0-6.144-4.301l-.86 1.229a.75.75 0 0 1-1.229-.86l1.148-1.64a.748.748 0 0 1 .217-.206 5.251 5.251 0 0 1 8.503 5.955zm-4.563-2.532a.75.75 0 0 1 .184 1.045l-3.155 4.505a.75.75 0 1 1-1.229-.86l3.155-4.506a.75.75 0 0 1 1.045-.184zm4.919 10.562-1.414 1.414a.75.75 0 1 1-1.06-1.06l1.414-1.415-1.415-1.414a.75.75 0 0 1 1.061-1.06l1.414 1.414 1.414-1.415a.75.75 0 0 1 1.061 1.061l-1.414 1.414 1.414 1.415a.75.75 0 0 1-1.06 1.06l-1.415-1.414z"/></svg>',"unlink"),this.editButtonView=this._createButton(t("Edit link"),n.icons.pencil,"edit"),this.set("href"),this._focusables=new le.ViewCollection,this._focusCycler=new le.FocusCycler({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","ck-responsive-form"],tabindex:"-1"},children:[this.previewButtonView,this.editButtonView,this.unlinkButtonView]})}render(){super.render();[this.previewButtonView,this.editButtonView,this.unlinkButtonView].forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createButton(e,t,i){const n=new le.ButtonView(this.locale);return n.set({label:e,icon:t,tooltip:!0}),n.delegate("execute").to(this,i),n}_createPreviewButton(){const e=new le.ButtonView(this.locale),t=this.bindTemplate,i=this.t;return e.set({withText:!0,tooltip:i("Open link in new tab")}),e.extendTemplate({attributes:{class:["ck","ck-link-actions__preview"],href:t.to("href",e=>e&&G(e)),target:"_blank",rel:"noopener noreferrer"}}),e.bind("label").to(this,"href",e=>e||i("This link has no URL")),e.bind("isEnabled").to(this,"href",e=>!!e),e.template.tag="a",e.template.eventListeners={},e}}var fe='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.077 15 .991-1.416a.75.75 0 1 1 1.229.86l-1.148 1.64a.748.748 0 0 1-.217.206 5.251 5.251 0 0 1-8.503-5.955.741.741 0 0 1 .12-.274l1.147-1.639a.75.75 0 1 1 1.228.86L4.933 10.7l.006.003a3.75 3.75 0 0 0 6.132 4.294l.006.004zm5.494-5.335a.748.748 0 0 1-.12.274l-1.147 1.639a.75.75 0 1 1-1.228-.86l.86-1.23a3.75 3.75 0 0 0-6.144-4.301l-.86 1.229a.75.75 0 0 1-1.229-.86l1.148-1.64a.748.748 0 0 1 .217-.206 5.251 5.251 0 0 1 8.503 5.955zm-4.563-2.532a.75.75 0 0 1 .184 1.045l-3.155 4.505a.75.75 0 1 1-1.229-.86l3.155-4.506a.75.75 0 0 1 1.045-.184z"/></svg>';class he extends n.Plugin{static get requires(){return[le.ContextualBalloon]}static get pluginName(){return"LinkUI"}init(){const e=this.editor;e.editing.view.addObserver(o.ClickObserver),this.actionsView=this._createActionsView(),this.formView=this._createFormView(),this._balloon=e.plugins.get(le.ContextualBalloon),this._createToolbarLinkButton(),this._enableUserBalloonInteractions(),e.conversion.for("editingDowncast").markerToHighlight({model:"link-ui",view:{classes:["ck-fake-link-selection"]}}),e.conversion.for("editingDowncast").markerToElement({model:"link-ui",view:{name:"span",classes:["ck-fake-link-selection","ck-fake-link-selection_collapsed"]}})}destroy(){super.destroy(),this.formView.destroy()}_createActionsView(){const e=this.editor,t=new ke(e.locale),i=e.commands.get("link"),n=e.commands.get("unlink");return t.bind("href").to(i,"value"),t.editButtonView.bind("isEnabled").to(i),t.unlinkButtonView.bind("isEnabled").to(n),this.listenTo(t,"edit",()=>{this._addFormView()}),this.listenTo(t,"unlink",()=>{e.execute("unlink"),this._hideUI()}),t.keystrokes.set("Esc",(e,t)=>{this._hideUI(),t()}),t.keystrokes.set("Ctrl+K",(e,t)=>{this._addFormView(),t()}),t}_createFormView(){const e=this.editor,t=e.commands.get("link"),i=e.config.get("link.defaultProtocol"),n=new de(e.locale,t);return n.urlInputView.fieldView.bind("value").to(t,"value"),n.urlInputView.bind("isReadOnly").to(t,"isEnabled",e=>!e),n.saveButtonView.bind("isEnabled").to(t),this.listenTo(n,"submit",()=>{const{value:t}=n.urlInputView.fieldView.element,o=ee(t,i);e.execute("link",o,n.getDecoratorSwitchesState()),this._closeFormView()}),this.listenTo(n,"cancel",()=>{this._closeFormView()}),n.keystrokes.set("Esc",(e,t)=>{this._closeFormView(),t()}),n}_createToolbarLinkButton(){const e=this.editor,t=e.commands.get("link"),i=e.t;e.keystrokes.set("Ctrl+K",(e,i)=>{i(),t.isEnabled&&this._showUI(!0)}),e.ui.componentFactory.add("link",e=>{const n=new le.ButtonView(e);return n.isEnabled=!0,n.label=i("Link"),n.icon=fe,n.keystroke="Ctrl+K",n.tooltip=!0,n.isToggleable=!0,n.bind("isEnabled").to(t,"isEnabled"),n.bind("isOn").to(t,"value",e=>!!e),this.listenTo(n,"execute",()=>this._showUI(!0)),n})}_enableUserBalloonInteractions(){const e=this.editor.editing.view.document;this.listenTo(e,"click",()=>{this._getSelectedLinkElement()&&this._showUI()}),this.editor.keystrokes.set("Tab",(e,t)=>{this._areActionsVisible&&!this.actionsView.focusTracker.isFocused&&(this.actionsView.focus(),t())},{priority:"high"}),this.editor.keystrokes.set("Esc",(e,t)=>{this._isUIVisible&&(this._hideUI(),t())}),Object(le.clickOutsideHandler)({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 e=this.editor.commands.get("link");this.formView.disableCssTransitions(),this._balloon.add({view:this.formView,position:this._getBalloonPositionData()}),this._balloon.visibleView===this.formView&&this.formView.urlInputView.fieldView.select(),this.formView.enableCssTransitions(),this.formView.urlInputView.fieldView.element.value=e.value||""}_closeFormView(){const e=this.editor.commands.get("link");e.restoreManualDecoratorStates(),void 0!==e.value?this._removeFormView():this._hideUI()}_removeFormView(){this._isFormInPanel&&(this.formView.saveButtonView.focus(),this._balloon.remove(this.formView),this.editor.editing.view.focus(),this._hideFakeVisualSelection())}_showUI(e=!1){this._getSelectedLinkElement()?(this._areActionsVisible?this._addFormView():this._addActionsView(),e&&this._balloon.showStack("main")):(this._showFakeVisualSelection(),this._addActionsView(),e&&this._balloon.showStack("main"),this._addFormView()),this._startUpdatingUI()}_hideUI(){if(!this._isUIInPanel)return;const e=this.editor;this.stopListening(e.ui,"update"),this.stopListening(this._balloon,"change:visibleView"),e.editing.view.focus(),this._removeFormView(),this._balloon.remove(this.actionsView),this._hideFakeVisualSelection()}_startUpdatingUI(){const e=this.editor,t=e.editing.view.document;let i=this._getSelectedLinkElement(),n=r();const o=()=>{const e=this._getSelectedLinkElement(),t=r();i&&!e||!i&&t!==n?this._hideUI():this._isUIVisible&&this._balloon.updatePosition(this._getBalloonPositionData()),i=e,n=t};function r(){return t.selection.focus.getAncestors().reverse().find(e=>e.is("element"))}this.listenTo(e.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 e=this.editor.editing.view,t=this.editor.model,i=e.document;let n=null;if(t.markers.has("link-ui")){const t=Array.from(this.editor.editing.mapper.markerNameToElements("link-ui")),i=e.createRange(e.createPositionBefore(t[0]),e.createPositionAfter(t[t.length-1]));n=e.domConverter.viewRangeToDom(i)}else n=()=>{const t=this._getSelectedLinkElement();return t?e.domConverter.mapViewToDom(t):e.domConverter.viewRangeToDom(i.selection.getFirstRange())};return{target:n}}_getSelectedLinkElement(){const e=this.editor.editing.view,t=e.document.selection,i=t.getSelectedElement();if(t.isCollapsed||i&&Object(ue.isWidget)(i))return me(t.getFirstPosition());{const i=t.getFirstRange().getTrimmed(),n=me(i.start),o=me(i.end);return n&&n==o&&e.createRangeIn(n).getTrimmed().isEqual(i)?n:null}}_showFakeVisualSelection(){const e=this.editor.model;e.change(t=>{const i=e.document.selection.getFirstRange();if(e.markers.has("link-ui"))t.updateMarker("link-ui",{range:i});else if(i.start.isAtEnd){const n=i.start.getLastMatchingPosition(({item:t})=>!e.schema.isContent(t),{boundaries:i});t.addMarker("link-ui",{usingOperation:!1,affectsData:!1,range:t.createRange(n,i.end)})}else t.addMarker("link-ui",{usingOperation:!1,affectsData:!1,range:i})})}_hideFakeVisualSelection(){const e=this.editor.model;e.markers.has("link-ui")&&e.change(e=>{e.removeMarker("link-ui")})}}function me(e){return e.getAncestors().find(e=>{return(t=e).is("attributeElement")&&!!t.getCustomProperty("link");var t})}const ge=new RegExp("(^|\\s)(((?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(((?!www\\.)|(www\\.))(?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.)+(?:[a-z\\u00a1-\\uffff]{2,63})))(?::\\d{2,5})?(?:[/?#]\\S*)?)|((www.|(\\S+@))((?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.))+(?:[a-z\\u00a1-\\uffff]{2,63})))$","i");class be extends n.Plugin{static get requires(){return[r.Delete]}static get pluginName(){return"AutoLink"}init(){const e=this.editor.model.document.selection;e.on("change:range",()=>{this.isEnabled=!e.anchor.parent.is("element","codeBlock")}),this._enableTypingHandling()}afterInit(){this._enableEnterHandling(),this._enableShiftEnterHandling()}_enableTypingHandling(){const e=this.editor,t=new r.TextWatcher(e.model,e=>{if(!function(e){return e.length>4&&" "===e[e.length-1]&&" "!==e[e.length-2]}(e))return;const t=pe(e.substr(0,e.length-1));return t?{url:t}:void 0}),i=e.plugins.get("Input");t.on("matched:data",(t,n)=>{const{batch:o,range:r,url:s}=n;if(!i.isInput(o))return;const a=r.end.getShiftedBy(-1),c=a.getShiftedBy(-s.length),l=e.model.createRange(c,a);this._applyAutoLink(s,l)}),t.bind("isEnabled").to(this)}_enableEnterHandling(){const e=this.editor,t=e.model,i=e.commands.get("enter");i&&i.on("execute",()=>{const e=t.document.selection.getFirstPosition();if(!e.parent.previousSibling)return;const i=t.createRangeIn(e.parent.previousSibling);this._checkAndApplyAutoLinkOnRange(i)})}_enableShiftEnterHandling(){const e=this.editor,t=e.model,i=e.commands.get("shiftEnter");i&&i.on("execute",()=>{const e=t.document.selection.getFirstPosition(),i=t.createRange(t.createPositionAt(e.parent,0),e.getShiftedBy(-1));this._checkAndApplyAutoLinkOnRange(i)})}_checkAndApplyAutoLinkOnRange(e){const t=this.editor.model,{text:i,range:n}=Object(r.getLastTextLine)(e,t),o=pe(i);if(o){const e=t.createRange(n.end.getShiftedBy(-o.length),n.end);this._applyAutoLink(o,e)}}_applyAutoLink(e,t){const i=this.editor.model,n=this.editor.plugins.get("Delete");this.isEnabled&&function(e,t){return t.schema.checkAttributeInSelection(t.createSelection(e),"linkHref")}(t,i)&&i.enqueueChange(o=>{const r=this.editor.config.get("link.defaultProtocol"),s=ee(e,r);o.setAttribute("linkHref",s,t),i.enqueueChange(()=>{n.requestUndoOnBackspace()})})}}function pe(e){const t=ge.exec(e);return t?t[2]:null}class we extends n.Plugin{static get requires(){return[re,he,be]}static get pluginName(){return"Link"}}class ve extends n.Plugin{static get requires(){return["ImageEditing","ImageUtils",re]}static get pluginName(){return"LinkImageEditing"}init(){const e=this.editor,t=e.model.schema;e.plugins.has("ImageBlockEditing")&&t.extend("imageBlock",{allowAttributes:["linkHref"]}),e.plugins.has("ImageInlineEditing")&&t.extend("imageInline",{allowAttributes:["linkHref"]}),e.conversion.for("upcast").add(function(e){const t=e.plugins.has("ImageInlineEditing"),i=e.plugins.get("ImageUtils");return e=>{e.on("element:a",(e,n,o)=>{const r=n.viewItem,s=i.findViewImgElement(r);if(!s)return;const a=s.findAncestor(e=>i.isBlockImageView(e));if(t&&!a)return;if(!o.consumable.consume(r,{attributes:["href"]}))return;const c=r.getAttribute("href");if(!c)return;let l=n.modelCursor.parent;if(!l.is("element","imageBlock")){const e=o.convertItem(s,n.modelCursor);n.modelRange=e.modelRange,n.modelCursor=e.modelCursor,l=n.modelCursor.nodeBefore}l&&l.is("element","imageBlock")&&o.writer.setAttribute("linkHref",c,l)},{priority:"high"})}}(e)),e.conversion.for("downcast").add(function(e){const t=e.plugins.get("ImageUtils");return e=>{e.on("attribute:linkHref:imageBlock",(e,i,n)=>{if(!n.consumable.consume(i.item,e.name))return;const o=n.mapper.toViewElement(i.item),r=n.writer,s=Array.from(o.getChildren()).find(e=>"a"===e.name),a=t.findViewImgElement(o),c=a.parent.is("element","picture")?a.parent:a;if(s)i.attributeNewValue?r.setAttribute("href",i.attributeNewValue,s):(r.move(r.createRangeOn(c),r.createPositionAt(o,0)),r.remove(s));else{const e=r.createContainerElement("a",{href:i.attributeNewValue});r.insert(r.createPositionAt(o,0),e),r.move(r.createRangeOn(c),r.createPositionAt(e,0))}},{priority:"high"})}}(e)),this._enableAutomaticDecorators(),this._enableManualDecorators()}_enableAutomaticDecorators(){const e=this.editor,t=e.commands.get("link").automaticDecorators;t.length&&e.conversion.for("downcast").add(t.getDispatcherForLinkedImage())}_enableManualDecorators(){const e=this.editor,t=e.commands.get("link");for(const i of t.manualDecorators)e.plugins.has("ImageBlockEditing")&&e.model.schema.extend("imageBlock",{allowAttributes:i.id}),e.plugins.has("ImageInlineEditing")&&e.model.schema.extend("imageInline",{allowAttributes:i.id}),e.conversion.for("downcast").add(_e(i)),e.conversion.for("upcast").add(ye(e,i))}}function _e(e){return t=>{t.on(`attribute:${e.id}:imageBlock`,(t,i,n)=>{const o=n.mapper.toViewElement(i.item),r=Array.from(o.getChildren()).find(e=>"a"===e.name);if(r){for(const[t,i]of Object(a.toMap)(e.attributes))n.writer.setAttribute(t,i,r);e.classes&&n.writer.addClass(e.classes,r);for(const t in e.styles)n.writer.setStyle(t,e.styles[t],r)}})}}function ye(e,t){const i=e.plugins.get("ImageUtils");return e=>{e.on("element:a",(e,n,r)=>{const s=n.viewItem;if(!i.findViewImgElement(s))return;const a=new o.Matcher(t._createPattern()).match(s);if(!a)return;if(!r.consumable.consume(s,a.match))return;const c=n.modelCursor.nodeBefore||n.modelCursor.parent;r.writer.setAttribute(t.id,!0,c)},{priority:"high"})}}class Ae extends n.Plugin{static get requires(){return[re,he,"ImageBlockEditing"]}static get pluginName(){return"LinkImageUI"}init(){const e=this.editor,t=e.editing.view.document;this.listenTo(t,"click",(t,i)=>{this._isSelectedLinkedImage(e.model.document.selection)&&(i.preventDefault(),t.stop())},{priority:"high"}),this._createToolbarLinkImageButton()}_createToolbarLinkImageButton(){const e=this.editor,t=e.t;e.ui.componentFactory.add("linkImage",i=>{const n=new le.ButtonView(i),o=e.plugins.get("LinkUI"),r=e.commands.get("link");return n.set({isEnabled:!0,label:t("Link image"),icon:fe,keystroke:"Ctrl+K",tooltip:!0,isToggleable:!0}),n.bind("isEnabled").to(r,"isEnabled"),n.bind("isOn").to(r,"value",e=>!!e),this.listenTo(n,"execute",()=>{this._isSelectedLinkedImage(e.model.document.selection)?o._addActionsView():o._showUI(!0)}),n})}_isSelectedLinkedImage(e){const t=e.getSelectedElement();return this.editor.plugins.get("ImageUtils").isImage(t)&&t.hasAttribute("linkHref")}}i(19);class xe extends n.Plugin{static get requires(){return[ve,Ae]}static get pluginName(){return"LinkImage"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/list.js b/core/assets/vendor/ckeditor5/list.js
new file mode 100644
index 0000000000000000000000000000000000000000..df6c1df14dc34c42b527a5d7776b7296cd16ba4d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/list.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Circle:"Circle",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero",Disc:"Disc","Lower-latin":"Lower-latin","Lower–roman":"Lower–roman","Numbered List":"Numbered List","Numbered list styles toolbar":"Numbered list styles toolbar",Square:"Square","To-do List":"To-do List","Toggle the circle list style":"Toggle the circle list style","Toggle the decimal list style":"Toggle the decimal list style","Toggle the decimal with leading zero list style":"Toggle the decimal with leading zero list style","Toggle the disc list style":"Toggle the disc list style","Toggle the lower–latin list style":"Toggle the lower–latin list style","Toggle the lower–roman list style":"Toggle the lower–roman list style","Toggle the square list style":"Toggle the square list style","Toggle the upper–latin list style":"Toggle the upper–latin list style","Toggle the upper–roman list style":"Toggle the upper–roman list style","Upper-latin":"Upper-latin","Upper-roman":"Upper-roman"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.list=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=12)}([function(t,e,i){t.exports=i(3)("./src/core.js")},function(t,e,i){t.exports=i(3)("./src/utils.js")},function(t,e,i){t.exports=i(3)("./src/ui.js")},function(t,e){t.exports=CKEditor5.dll},function(t,e,i){t.exports=i(3)("./src/engine.js")},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 l(t){for(var e=-1,i=0;i<r.length;i++)if(r[i].identifier===t){e=i;break}return e}function a(t,e){for(var i={},n=[],o=0;o<t.length;o++){var s=t[o],a=e.base?s[0]+e.base:s[0],c=i[a]||0,d="".concat(a," ").concat(c);i[a]=c+1;var u=l(d),m={css:s[1],media:s[2],sourceMap:s[3]};-1!==u?(r[u].references++,r[u].updater(m)):r.push({identifier:d,updater:f(m,e),references:1}),n.push(d)}return n}function c(t){var e=document.createElement("style"),n=t.attributes||{};if(void 0===n.nonce){var o=i.nc;o&&(n.nonce=o)}if(Object.keys(n).forEach((function(t){e.setAttribute(t,n[t])})),"function"==typeof t.insert)t.insert(e);else{var r=s(t.insert||"head");if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(e)}return e}var d,u=(d=[],function(t,e){return d[t]=e,d.filter(Boolean).join("\n")});function m(t,e,i,n){var o=i?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(t.styleSheet)t.styleSheet.cssText=u(e,o);else{var s=document.createTextNode(o),r=t.childNodes;r[e]&&t.removeChild(r[e]),r.length?t.insertBefore(s,r[e]):t.appendChild(s)}}function g(t,e,i){var n=i.css,o=i.media,s=i.sourceMap;if(o?t.setAttribute("media",o):t.removeAttribute("media"),s&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(s))))," */")),t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}var p=null,h=0;function f(t,e){var i,n,o;if(e.singleton){var s=h++;i=p||(p=c(e)),n=m.bind(null,i,s,!1),o=m.bind(null,i,s,!0)}else i=c(e),n=g.bind(null,i,e),o=function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(i)};return n(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;n(t=e)}else o()}}t.exports=function(t,e){(e=e||{}).singleton||"boolean"==typeof e.singleton||(e.singleton=o());var i=a(t=t||[],e);return function(t){if(t=t||[],"[object Array]"===Object.prototype.toString.call(t)){for(var n=0;n<i.length;n++){var o=l(i[n]);r[o].references--}for(var s=a(t,e),c=0;c<i.length;c++){var d=l(i[c]);0===r[d].references&&(r[d].updater(),r.splice(d,1))}i=s}}}},function(t,e,i){t.exports=i(3)("./src/enter.js")},function(t,e,i){t.exports=i(3)("./src/typing.js")},function(t,e,i){var n=i(5),o=i(9);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,s);t.exports=o.locals||{}},function(t,e){t.exports=".ck.ck-list-styles-dropdown>.ck-dropdown__panel>.ck-toolbar>.ck-toolbar__items{display:grid}:root{--ck-list-style-button-size:44px}.ck.ck-list-styles-dropdown>.ck-dropdown__panel>.ck-toolbar{background:none;padding:0}.ck.ck-list-styles-dropdown>.ck-dropdown__panel>.ck-toolbar>.ck-toolbar__items{grid-template-columns:repeat(3,auto);row-gap:var(--ck-spacing-medium);column-gap:var(--ck-spacing-medium);padding:var(--ck-spacing-medium)}.ck.ck-list-styles-dropdown>.ck-dropdown__panel>.ck-toolbar>.ck-toolbar__items .ck-button{width:var(--ck-list-style-button-size);height:var(--ck-list-style-button-size);padding:0;margin:0;box-sizing:content-box}.ck.ck-list-styles-dropdown>.ck-dropdown__panel>.ck-toolbar>.ck-toolbar__items .ck-button .ck-icon{width:var(--ck-list-style-button-size);height:var(--ck-list-style-button-size)}"},function(t,e,i){var n=i(5),o=i(11);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,s);t.exports=o.locals||{}},function(t,e){t.exports=':root{--ck-todo-list-checkmark-size:16px}.ck-content .todo-list{list-style:none}.ck-content .todo-list li{margin-bottom:5px}.ck-content .todo-list li .todo-list{margin-top:5px}.ck-content .todo-list .todo-list__label>input{-webkit-appearance:none;display:inline-block;position:relative;width:var(--ck-todo-list-checkmark-size);height:var(--ck-todo-list-checkmark-size);vertical-align:middle;border:0;left:-25px;margin-right:-15px;right:0;margin-left:0}.ck-content .todo-list .todo-list__label>input:before{display:block;position:absolute;box-sizing:border-box;content:"";width:100%;height:100%;border:1px solid #333;border-radius:2px;transition:box-shadow .25s ease-in-out,background .25s ease-in-out,border .25s ease-in-out}.ck-content .todo-list .todo-list__label>input:after{display:block;position:absolute;box-sizing:content-box;pointer-events:none;content:"";left:calc(var(--ck-todo-list-checkmark-size)/3);top:calc(var(--ck-todo-list-checkmark-size)/5.3);width:calc(var(--ck-todo-list-checkmark-size)/5.3);height:calc(var(--ck-todo-list-checkmark-size)/2.6);border-left:0 solid transparent;border-bottom:calc(var(--ck-todo-list-checkmark-size)/8) solid transparent;border-right:calc(var(--ck-todo-list-checkmark-size)/8) solid transparent;border-top:0 solid transparent;transform:rotate(45deg)}.ck-content .todo-list .todo-list__label>input[checked]:before{background:#26ab33;border-color:#26ab33}.ck-content .todo-list .todo-list__label>input[checked]:after{border-color:#fff}.ck-content .todo-list .todo-list__label .todo-list__label__description{vertical-align:middle}[dir=rtl] .todo-list .todo-list__label>input{left:0;margin-right:0;right:-25px;margin-left:-15px}.ck-editor__editable .todo-list .todo-list__label>input{cursor:pointer}.ck-editor__editable .todo-list .todo-list__label>input:hover:before{box-shadow:0 0 0 5px rgba(0,0,0,.1)}'},function(t,e,i){"use strict";i.r(e),i.d(e,"List",(function(){return D})),i.d(e,"ListEditing",(function(){return M})),i.d(e,"ListUI",(function(){return j})),i.d(e,"ListStyle",(function(){return G})),i.d(e,"ListStyleEditing",(function(){return F})),i.d(e,"ListStyleUI",(function(){return $})),i.d(e,"TodoList",(function(){return st})),i.d(e,"TodoListEditing",(function(){return nt})),i.d(e,"TodoListUI",(function(){return ot}));var n=i(0),o=i(1);class s extends n.Command{constructor(t,e){super(t),this.type=e}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model,i=e.document,n=Array.from(i.selection.getSelectedBlocks()).filter(t=>l(t,e.schema)),o=void 0!==t.forceValue?!t.forceValue:this.value;e.change(t=>{if(o){let e=n[n.length-1].nextSibling,i=Number.POSITIVE_INFINITY,o=[];for(;e&&"listItem"==e.name&&0!==e.getAttribute("listIndent");){const t=e.getAttribute("listIndent");t<i&&(i=t);const n=t-i;o.push({element:e,listIndent:n}),e=e.nextSibling}o=o.reverse();for(const e of o)t.setAttribute("listIndent",e.listIndent,e.element)}if(!o){let t=Number.POSITIVE_INFINITY;for(const e of n)e.is("element","listItem")&&e.getAttribute("listIndent")<t&&(t=e.getAttribute("listIndent"));t=0===t?1:t,r(n,!0,t),r(n,!1,t)}for(const e of n.reverse())o&&"listItem"==e.name?t.rename(e,"paragraph"):o||"listItem"==e.name?o||"listItem"!=e.name||e.getAttribute("listType")==this.type||t.setAttribute("listType",this.type,e):(t.setAttributes({listType:this.type,listIndent:0},e),t.rename(e,"listItem"));this.fire("_executeCleanup",n)})}_getValue(){const t=Object(o.first)(this.editor.model.document.selection.getSelectedBlocks());return!!t&&t.is("element","listItem")&&t.getAttribute("listType")==this.type}_checkEnabled(){if(this.value)return!0;const t=this.editor.model.document.selection,e=this.editor.model.schema,i=Object(o.first)(t.getSelectedBlocks());return!!i&&l(i,e)}}function r(t,e,i){const n=e?t[0]:t[t.length-1];if(n.is("element","listItem")){let o=n[e?"previousSibling":"nextSibling"],s=n.getAttribute("listIndent");for(;o&&o.is("element","listItem")&&o.getAttribute("listIndent")>=i;)s>o.getAttribute("listIndent")&&(s=o.getAttribute("listIndent")),o.getAttribute("listIndent")==s&&t[e?"unshift":"push"](o),o=o[e?"previousSibling":"nextSibling"]}}function l(t,e){return e.checkChild(t.parent,"listItem")&&!e.isObject(t)}class a extends n.Command{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)}this.fire("_executeCleanup",i)})}_checkEnabled(){const t=Object(o.first)(this.editor.model.document.selection.getSelectedBlocks());if(!t||!t.is("element","listItem"))return!1;if(this._indentBy>0){const e=t.getAttribute("listIndent"),i=t.getAttribute("listType");let n=t.previousSibling;for(;n&&n.is("element","listItem")&&n.getAttribute("listIndent")>=e;){if(n.getAttribute("listIndent")==e)return n.getAttribute("listType")==i;n=n.previousSibling}return!1}return!0}}var c=i(6),d=i(7),u=i(4),m=i(2);function g(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=A,e}(n),r=n.createContainerElement(o,null);return n.insert(n.createPositionAt(r,0),s),i.bindElements(t,s),s}function p(t,e,i,n){const o=e.parent,s=i.mapper,r=i.writer;let l=s.toViewPosition(n.createPositionBefore(t));const a=b(t.previousSibling,{sameIndent:!0,smallerIndent:!0,listIndent:t.getAttribute("listIndent")}),c=t.previousSibling;if(a&&a.getAttribute("listIndent")==t.getAttribute("listIndent")){const t=s.toViewElement(a);l=r.breakContainer(r.createPositionAfter(t))}else if(c&&"listItem"==c.name){l=s.toViewPosition(n.createPositionAt(c,"end"));const t=s.findMappedViewAncestor(l),e=y(t);l=e?r.createPositionBefore(e):r.createPositionAt(t,"end")}else l=s.toViewPosition(n.createPositionBefore(t));if(l=f(l),r.insert(l,o),c&&"listItem"==c.name){const t=s.toViewElement(c),i=r.createRange(r.createPositionAt(t,0),l).getWalker({ignoreElementEnd:!0});for(const t of i)if(t.item.is("element","li")){const n=r.breakContainer(r.createPositionBefore(t.item)),o=t.item.parent,s=r.createPositionAt(e,"end");h(r,s.nodeBefore,s.nodeAfter),r.move(r.createRangeOn(o),s),i.position=n}}else{const i=o.nextSibling;if(i&&(i.is("element","ul")||i.is("element","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")))}}h(r,o,o.nextSibling),h(r,o.previousSibling,o)}function h(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 f(t){return t.getLastMatchingPosition(t=>t.item.is("uiElement"))}function b(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="forward"===e.direction?s.nextSibling:s.previousSibling}return null}function v(t,e,i,n){t.ui.componentFactory.add(e,o=>{const s=t.commands.get(e),r=new m.ButtonView(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 y(t){for(const e of t.getChildren())if("ul"==e.name||"ol"==e.name)return e;return null}function w(t,e){const i=[],n=t.parent,o={ignoreElementEnd:!0,startPosition:t,shallow:!0,direction:e},s=n.getAttribute("listIndent"),r=[...new u.TreeWalker(o)].filter(t=>t.item.is("element")).map(t=>t.item);for(const t of r){if(!t.is("element","listItem"))break;if(t.getAttribute("listIndent")<s)break;if(!(t.getAttribute("listIndent")>s)){if(t.getAttribute("listType")!==n.getAttribute("listType"))break;if(t.getAttribute("listStyle")!==n.getAttribute("listStyle"))break;"backward"===e?i.unshift(t):i.push(t)}}return i}function A(){const t=!this.isEmpty&&("ul"==this.getChild(0).name||"ol"==this.getChild(0).name);return this.isEmpty||t?0:u.getFillerOffset.call(this)}function I(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;p(s,g(s,n),n,t)}}function k(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 S(t,e,i){const n=i.mapper.toViewElement(e.item).parent,o=i.writer;h(o,n,n.nextSibling),h(o,n.previousSibling,n);for(const t of e.item.getChildren())i.consumable.consume(t,"insert")}function x(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;e<o.length;e++){const i=t.nodeBefore;if(t=n.insert(t,o[e]).end,e>0){const e=h(n,i,i.nextSibling);e&&e.parent==i&&t.offset--}}h(n,t.nodeBefore,t.nodeAfter)}}}function T(t,e,i){const n=i.mapper.toViewPosition(e.position),o=n.nodeBefore,s=n.nodeAfter;h(i.writer,o,s)}function z(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("element","li"))e++;else{const t=i.previousSibling;t&&t.is("element","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";if(t.setAttribute("listType",s,n),!i.safeInsert(n,e.modelCursor))return;const r=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")),l=e.modelRange.start.nodeAfter;l&&l.is("element")&&!o.checkChild(t,l.name)&&(t=e.modelCursor.parent.is("element","listItem")?e.modelCursor.parent:V(e.modelCursor),s=n.createPositionAfter(t))}return s}(n,e.viewItem.getChildren(),i);e.modelRange=t.createRange(e.modelCursor,r),i.updateConversionResult(n,e)}}function C(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("element","li")||B(e))&&e._remove()}}}function _(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;for(const e of t)i&&!B(e)&&e._remove(),B(e)&&(i=!0)}}function L(t){return(e,i)=>{if(i.isPhantom)return;const n=i.modelPosition.nodeBefore;if(n&&n.is("element","listItem")){const e=i.mapper.toViewElement(n),o=e.getAncestors().find(B),s=t.createPositionAt(e,0).getWalker();for(const t of s){if("elementStart"==t.type&&t.item.is("element","li")){i.viewPosition=t.previousPosition;break}if("elementEnd"==t.type&&t.item==o){i.viewPosition=t.nextPosition;break}}}}}function P(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("element","listItem")){const t=n.getFirstPosition();let e=null;if(t.parent.is("element","listItem")?e=t.parent:t.nodeBefore&&t.nodeBefore.is("element","listItem")&&(e=t.nodeBefore),e){const t=e.getAttribute("listIndent");if(t>0)for(;o&&o.is("element","listItem");)o._setAttribute("listIndent",o.getAttribute("listIndent")+t),o=o.nextSibling}}}function V(t){const e=new u.TreeWalker({startPosition:t});let i;do{i=e.next()}while(!i.value.item.is("element","listItem"));return i.value.item}function E(t,e,i,n,o,s){const r=b(e.nodeBefore,{sameIndent:!0,smallerIndent:!0,listIndent:t,foo:"b"}),l=o.mapper,a=o.writer,c=r?r.getAttribute("listIndent"):null;let d;if(r)if(c==t){const t=l.toViewElement(r).parent;d=a.createPositionAfter(t)}else{const t=s.createPositionAt(r,"end");d=l.toViewPosition(t)}else d=i;d=f(d);for(const t of[...n.getChildren()])B(t)&&(d=a.move(a.createRangeOn(t),d).end,h(a,t,t.nextSibling),h(a,t.previousSibling,t))}function B(t){return t.is("element","ol")||t.is("element","ul")}class M extends n.Plugin{static get pluginName(){return"ListEditing"}static get requires(){return[c.Enter,d.Delete]}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),i.hasAttribute("listStyle")&&(e.removeAttribute("listStyle",i),o=!0);for(const e of Array.from(t.createRangeIn(i)).filter(t=>t.item.is("element","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),l(t);return o;function s(t){const e=t.nodeBefore;if(e&&e.is("element","listItem")){let t=e;if(n.has(t))return;for(let e=t.previousSibling;e&&e.is("element","listItem");e=t.previousSibling)if(t=e,n.has(t))return;n.set(e,t)}else{const e=t.nodeAfter;e&&e.is("element","listItem")&&n.set(e,e)}}function r(t){let i=0,n=null;for(;t&&t.is("element","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 l(t){let i=[],n=null;for(;t&&t.is("element","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",H),e.mapper.registerViewToModelLength("li",H),i.mapper.on("modelToViewPosition",L(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 l=1,a=i.nodeBefore;for(;a&&B(a);)l+=s.getModelLength(a),a=a.previousSibling;e.modelPosition=n.createPositionBefore(r).getShiftedBy(l),t.stop()}})),e.mapper.on("modelToViewPosition",L(i.view)),t.conversion.for("editingDowncast").add(e=>{e.on("insert",x,{priority:"high"}),e.on("insert:listItem",I(t.model)),e.on("attribute:listType:listItem",k,{priority:"high"}),e.on("attribute:listType:listItem",S,{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,l=r.previousSibling,a=s.createRangeOn(r);s.remove(a),l&&l.nextSibling&&h(s,l,l.nextSibling),E(i.attributeOldValue+1,i.range.start,a.start,o,n,t),p(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("element","li")).nodeAfter,s=n.writer;s.breakContainer(s.createPositionBefore(o)),s.breakContainer(s.createPositionAfter(o));const r=o.parent,l=r.previousSibling,a=s.createRangeOn(r),c=s.remove(a);l&&l.nextSibling&&h(s,l,l.nextSibling);E(n.mapper.toModelElement(o).getAttribute("listIndent")+1,i.position,a.start,o,n,t);for(const t of s.createRangeIn(c).getItems())n.mapper.unbindViewElement(t);e.stop()}}(t.model)),e.on("remove",T,{priority:"low"})}),t.conversion.for("dataDowncast").add(e=>{e.on("insert",x,{priority:"high"}),e.on("insert:listItem",I(t.model))}),t.conversion.for("upcast").add(t=>{t.on("element:ul",C,{priority:"high"}),t.on("element:ol",C,{priority:"high"}),t.on("element:li",_,{priority:"high"}),t.on("element:li",z)}),t.model.on("insertContent",P,{priority:"high"}),t.commands.add("numberedList",new s(t,"numbered")),t.commands.add("bulletedList",new s(t,"bulleted")),t.commands.add("indentList",new a(t,"forward")),t.commands.add("outdentList",new a(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())},{context:"li"}),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;if("listItem"!==o.name)return;o.previousSibling&&"listItem"===o.previousSibling.name||(this.editor.execute("outdentList"),e.preventDefault(),t.stop())},{context:"li"});const r=t=>(e,i)=>{this.editor.commands.get(t).isEnabled&&(this.editor.execute(t),i())};t.keystrokes.set("Tab",r("indentList")),t.keystrokes.set("Shift+Tab",r("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 H(t){let e=1;for(const i of t.getChildren())if("ul"==i.name||"ol"==i.name)for(const t of i.getChildren())e+=H(t);return e}var N='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5.75c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM3.5 3v5H2V3.7H1v-1h2.5V3zM.343 17.857l2.59-3.257H2.92a.6.6 0 1 0-1.04 0H.302a2 2 0 1 1 3.995 0h-.001c-.048.405-.16.734-.333.988-.175.254-.59.692-1.244 1.312H4.3v1h-4l.043-.043zM7 14.75a.75.75 0 0 1 .75-.75h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75z"/></svg>',O='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5.75c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zm-6 0C1 4.784 1.777 4 2.75 4c.966 0 1.75.777 1.75 1.75 0 .966-.777 1.75-1.75 1.75C1.784 7.5 1 6.723 1 5.75zm6 9c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zm-6 0c0-.966.777-1.75 1.75-1.75.966 0 1.75.777 1.75 1.75 0 .966-.777 1.75-1.75 1.75-.966 0-1.75-.777-1.75-1.75z"/></svg>';class j extends n.Plugin{static get pluginName(){return"ListUI"}init(){const t=this.editor.t;v(this.editor,"numberedList",t("Numbered List"),N),v(this.editor,"bulletedList",t("Bulleted List"),O)}}class D extends n.Plugin{static get requires(){return[M,j]}static get pluginName(){return"List"}}class R extends n.Command{constructor(t,e){super(t),this._defaultType=e}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model;let i=[...e.document.selection.getSelectedBlocks()].filter(t=>t.is("element","listItem")).map(t=>{const i=e.change(e=>e.createPositionAt(t,0));return[...w(i,"backward"),...w(i,"forward")]}).flat();i=[...new Set(i)],i.length&&e.change(e=>{for(const n of i)e.setAttribute("listStyle",t.type||this._defaultType,n)})}_getValue(){const t=this.editor.model.document.selection.getFirstPosition().parent;return t&&t.is("element","listItem")?t.getAttribute("listStyle"):null}_checkEnabled(){const t=this.editor,e=t.commands.get("numberedList"),i=t.commands.get("bulletedList");return e.isEnabled||i.isEnabled}}class F extends n.Plugin{static get requires(){return[M]}static get pluginName(){return"ListStyleEditing"}init(){const t=this.editor,e=t.model;e.schema.extend("listItem",{allowAttributes:["listStyle"]}),t.commands.add("listStyle",new R(t,"default")),this.listenTo(t.commands.get("indentList"),"_executeCleanup",function(t){return(e,i)=>{let n;const o=i[0],s=o.getAttribute("listIndent"),r=i.filter(t=>t.getAttribute("listIndent")===s);if(o.previousSibling.getAttribute("listIndent")+1===s)n="default";else{const t=b(o.previousSibling,{sameIndent:!0,direction:"backward",listIndent:s});n=t.getAttribute("listStyle")}t.model.change(t=>{for(const e of r)t.setAttribute("listStyle",n,e)})}}(t)),this.listenTo(t.commands.get("outdentList"),"_executeCleanup",function(t){return(e,i)=>{if(!(i=i.reverse().filter(t=>t.is("element","listItem"))).length)return;const n=i[0].getAttribute("listIndent"),o=i[0].getAttribute("listType");let s=i[0].previousSibling;if(s.is("element","listItem"))for(;s.getAttribute("listIndent")!==n;)s=s.previousSibling;else s=null;s||(s=i[i.length-1].nextSibling),s&&s.is("element","listItem")&&s.getAttribute("listType")===o&&t.model.change(t=>{const e=i.filter(t=>t.getAttribute("listIndent")===n);for(const i of e)t.setAttribute("listStyle",s.getAttribute("listStyle"),i)})}}(t)),this.listenTo(t.commands.get("bulletedList"),"_executeCleanup",K(t)),this.listenTo(t.commands.get("numberedList"),"_executeCleanup",K(t)),e.document.registerPostFixer(function(t){return e=>{let i=!1;const n=W(t.model.document.differ.getChanges()).filter(t=>"todo"!==t.getAttribute("listType"));if(!n.length)return i;let o=n[n.length-1].nextSibling;if((!o||!o.is("element","listItem"))&&(o=n[n.length-1].previousSibling,o)){const t=n[0].getAttribute("listIndent");for(;o.is("element","listItem")&&o.getAttribute("listIndent")!==t&&(o=o.previousSibling,o););}for(const t of n)if(t.hasAttribute("listStyle")){const n=t.previousSibling;U(n,t)&&(e.setAttribute("listStyle",n.getAttribute("listStyle"),t),i=!0)}else q(o,t)?e.setAttribute("listStyle",o.getAttribute("listStyle"),t):e.setAttribute("listStyle","default",t),i=!0;return i}}(t)),t.conversion.for("upcast").add(t=>{t.on("element:li",(t,e,i)=>{const n=e.viewItem.parent;if(!n)return;const o=n.getStyle("list-style-type")||"default",s=e.modelRange.start.nodeAfter||e.modelRange.end.nodeBefore;i.writer.setAttribute("listStyle",o,s)},{priority:"low"})}),t.conversion.for("downcast").add(t=>{t.on("attribute:listStyle:listItem",(t,e,i)=>{const n=i.writer,o=e.item,s=b(o.previousSibling,{sameIndent:!0,listIndent:o.getAttribute("listIndent"),direction:"backward"}),r=i.mapper.toViewElement(o);var l,a,c,d,u;l=o,(a=s)&&l.getAttribute("listType")===a.getAttribute("listType")&&l.getAttribute("listIndent")===a.getAttribute("listIndent")&&l.getAttribute("listStyle")===a.getAttribute("listStyle")||n.breakContainer(n.createPositionBefore(r)),c=n,d=e.attributeNewValue,u=r.parent,d&&"default"!==d?c.setStyle("list-style-type",d,u):c.removeStyle("list-style-type",u)},{priority:"low"})}),this._mergeListStyleAttributeWhileMergingLists()}afterInit(){const t=this.editor;t.commands.get("todoList")&&t.model.document.registerPostFixer(function(t){return e=>{const i=W(t.model.document.differ.getChanges()).filter(t=>"todo"===t.getAttribute("listType")&&t.hasAttribute("listStyle"));if(!i.length)return!1;for(const t of i)e.removeAttribute("listStyle",t);return!0}}(t))}_mergeListStyleAttributeWhileMergingLists(){const t=this.editor.model;let e;this.listenTo(t,"deleteContent",(t,[i])=>{const n=i.getFirstPosition(),o=i.getLastPosition();if(n.parent===o.parent)return;if(!n.parent.is("element","listItem"))return;const s=o.parent.nextSibling;if(!s||!s.is("element","listItem"))return;const r=b(n.parent,{sameIndent:!0,listIndent:s.getAttribute("listIndent")});r&&r.getAttribute("listType")===s.getAttribute("listType")&&(e=r)},{priority:"high"}),this.listenTo(t,"deleteContent",()=>{e&&(t.change(t=>{const i=b(e.nextSibling,{sameIndent:!0,listIndent:e.getAttribute("listIndent"),direction:"forward"}),n=[i,...w(t.createPositionAt(i,0),"forward")];for(const i of n)t.setAttribute("listStyle",e.getAttribute("listStyle"),i)}),e=null)},{priority:"low"})}}function q(t,e){if(!t)return!1;const i=t.getAttribute("listStyle");return!!i&&("default"!==i&&t.getAttribute("listType")===e.getAttribute("listType"))}function U(t,e){if(!t||!t.is("element","listItem"))return!1;if(e.getAttribute("listType")!==t.getAttribute("listType"))return!1;const i=t.getAttribute("listIndent");if(i<1||i!==e.getAttribute("listIndent"))return!1;const n=t.getAttribute("listStyle");return!(!n||n===e.getAttribute("listStyle"))}function K(t){return(e,i)=>{i=i.filter(t=>t.is("element","listItem")),t.model.change(t=>{for(const e of i)t.removeAttribute("listStyle",e)})}}function W(t){const e=[];for(const i of t){const t=Y(i);t&&t.is("element","listItem")&&e.push(t)}return e}function Y(t){return"attribute"===t.type?t.range.start.nodeAfter:"insert"===t.type?t.position.nodeAfter:null}i(8);class $ extends n.Plugin{static get pluginName(){return"ListStyleUI"}init(){const t=this.editor,e=t.locale.t;t.ui.componentFactory.add("bulletedList",J({editor:t,parentCommandName:"bulletedList",buttonLabel:e("Bulleted List"),buttonIcon:O,toolbarAriaLabel:e("Bulleted list styles toolbar"),styleDefinitions:[{label:e("Toggle the disc list style"),tooltip:e("Disc"),type:"disc",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M11 27a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm0-9a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm0-9a3 3 0 1 1 0 6 3 3 0 0 1 0-6z"/></svg>'},{label:e("Toggle the circle list style"),tooltip:e("Circle"),type:"circle",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M11 27a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm0 1a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm0-10a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm0 1a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm0-10a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm0 1a2 2 0 1 0 0 4 2 2 0 0 0 0-4z"/></svg>'},{label:e("Toggle the square list style"),tooltip:e("Square"),type:"square",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M14 27v6H8v-6h6zm0-9v6H8v-6h6zm0-9v6H8V9h6z"/></svg>'}]})),t.ui.componentFactory.add("numberedList",J({editor:t,parentCommandName:"numberedList",buttonLabel:e("Numbered List"),buttonIcon:N,toolbarAriaLabel:e("Numbered list styles toolbar"),styleDefinitions:[{label:e("Toggle the decimal list style"),tooltip:e("Decimal"),type:"decimal",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M10.29 15V8.531H9.286c-.14.393-.4.736-.778 1.03-.378.295-.728.495-1.05.6v1.121a4.257 4.257 0 0 0 1.595-.936V15h1.235zm3.343 0v-1.235h-1.235V15h1.235zM11.3 24v-1.147H8.848c.064-.111.148-.226.252-.343.104-.117.351-.354.74-.712.39-.357.66-.631.81-.821.225-.288.39-.562.494-.824.104-.263.156-.539.156-.829 0-.51-.182-.936-.545-1.279-.363-.342-.863-.514-1.499-.514-.58 0-1.063.148-1.45.444-.387.296-.617.784-.69 1.463l1.23.124c.024-.36.112-.619.264-.774.153-.155.358-.233.616-.233.26 0 .465.074.613.222.148.148.222.36.222.635 0 .25-.085.501-.255.756-.126.185-.468.536-1.024 1.055-.692.641-1.155 1.156-1.389 1.544-.234.389-.375.8-.422 1.233H11.3zm2.333 0v-1.235h-1.235V24h1.235zM9.204 34.11c.615 0 1.129-.2 1.542-.598.413-.398.62-.88.62-1.446 0-.39-.11-.722-.332-.997a1.5 1.5 0 0 0-.886-.532c.619-.337.928-.788.928-1.353 0-.399-.151-.756-.453-1.073-.366-.386-.852-.58-1.459-.58a2.25 2.25 0 0 0-.96.2 1.617 1.617 0 0 0-.668.55c-.16.232-.28.544-.358.933l1.138.194c.032-.282.123-.495.272-.642.15-.146.33-.22.54-.22.215 0 .386.065.515.194s.193.302.193.518c0 .255-.087.46-.263.613-.176.154-.43.227-.765.218l-.136 1.006c.22-.061.409-.092.567-.092.24 0 .444.09.61.272.168.182.251.428.251.739 0 .328-.087.589-.261.782a.833.833 0 0 1-.644.29.841.841 0 0 1-.607-.242c-.167-.16-.27-.394-.307-.698l-1.196.145c.062.542.285.98.668 1.316.384.335.868.503 1.45.503zm4.43-.11v-1.235h-1.236V34h1.235z"/></svg>'},{label:e("Toggle the decimal with leading zero list style"),tooltip:e("Decimal with leading zero"),type:"decimal-leading-zero",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M5.714 15.11c.624 0 1.11-.22 1.46-.66.421-.533.632-1.408.632-2.627 0-1.222-.21-2.096-.629-2.624-.351-.445-.839-.668-1.463-.668-.624 0-1.11.22-1.459.66-.422.533-.633 1.406-.633 2.619 0 1.236.192 2.095.576 2.577.384.482.89.723 1.516.723zm0-1.024a.614.614 0 0 1-.398-.14c-.115-.094-.211-.283-.287-.565-.077-.283-.115-.802-.115-1.558s.043-1.294.128-1.613c.064-.246.155-.417.272-.512a.617.617 0 0 1 .4-.143.61.61 0 0 1 .398.143c.116.095.211.284.288.567.076.283.114.802.114 1.558s-.043 1.292-.128 1.608c-.064.246-.155.417-.272.512a.617.617 0 0 1-.4.143zm6.078.914V8.531H10.79c-.14.393-.4.736-.778 1.03-.378.295-.728.495-1.05.6v1.121a4.257 4.257 0 0 0 1.595-.936V15h1.235zm3.344 0v-1.235h-1.235V15h1.235zm-9.422 9.11c.624 0 1.11-.22 1.46-.66.421-.533.632-1.408.632-2.627 0-1.222-.21-2.096-.629-2.624-.351-.445-.839-.668-1.463-.668-.624 0-1.11.22-1.459.66-.422.533-.633 1.406-.633 2.619 0 1.236.192 2.095.576 2.577.384.482.89.723 1.516.723zm0-1.024a.614.614 0 0 1-.398-.14c-.115-.094-.211-.283-.287-.565-.077-.283-.115-.802-.115-1.558s.043-1.294.128-1.613c.064-.246.155-.417.272-.512a.617.617 0 0 1 .4-.143.61.61 0 0 1 .398.143c.116.095.211.284.288.567.076.283.114.802.114 1.558s-.043 1.292-.128 1.608c-.064.246-.155.417-.272.512a.617.617 0 0 1-.4.143zm7.088.914v-1.147H10.35c.065-.111.149-.226.253-.343.104-.117.35-.354.74-.712.39-.357.66-.631.81-.821.225-.288.39-.562.493-.824.104-.263.156-.539.156-.829 0-.51-.181-.936-.544-1.279-.364-.342-.863-.514-1.499-.514-.58 0-1.063.148-1.45.444-.387.296-.617.784-.69 1.463l1.23.124c.024-.36.112-.619.264-.774.152-.155.357-.233.615-.233.261 0 .465.074.613.222.148.148.222.36.222.635 0 .25-.085.501-.255.756-.126.185-.467.536-1.024 1.055-.691.641-1.154 1.156-1.388 1.544-.235.389-.375.8-.422 1.233h4.328zm2.334 0v-1.235h-1.235V24h1.235zM5.714 34.11c.624 0 1.11-.22 1.46-.66.421-.533.632-1.408.632-2.627 0-1.222-.21-2.096-.629-2.624-.351-.445-.839-.668-1.463-.668-.624 0-1.11.22-1.459.66-.422.533-.633 1.406-.633 2.619 0 1.236.192 2.095.576 2.577.384.482.89.723 1.516.723zm0-1.024a.614.614 0 0 1-.398-.14c-.115-.094-.211-.283-.287-.565-.077-.283-.115-.802-.115-1.558s.043-1.294.128-1.613c.064-.246.155-.417.272-.512a.617.617 0 0 1 .4-.143.61.61 0 0 1 .398.143c.116.095.211.284.288.567.076.283.114.802.114 1.558s-.043 1.292-.128 1.608c-.064.246-.155.417-.272.512a.617.617 0 0 1-.4.143zm4.992 1.024c.616 0 1.13-.2 1.543-.598.413-.398.62-.88.62-1.446 0-.39-.111-.722-.332-.997a1.5 1.5 0 0 0-.886-.532c.618-.337.927-.788.927-1.353 0-.399-.15-.756-.452-1.073-.366-.386-.853-.58-1.46-.58a2.25 2.25 0 0 0-.96.2 1.617 1.617 0 0 0-.667.55c-.16.232-.28.544-.359.933l1.139.194c.032-.282.123-.495.272-.642.15-.146.33-.22.54-.22.214 0 .386.065.515.194s.193.302.193.518c0 .255-.088.46-.264.613-.175.154-.43.227-.764.218l-.136 1.006c.22-.061.408-.092.566-.092.24 0 .444.09.611.272.167.182.25.428.25.739 0 .328-.086.589-.26.782a.833.833 0 0 1-.644.29.841.841 0 0 1-.607-.242c-.167-.16-.27-.394-.308-.698l-1.195.145c.062.542.284.98.668 1.316.384.335.867.503 1.45.503zm4.43-.11v-1.235h-1.235V34h1.235z"/></svg>'},{label:e("Toggle the lower–roman list style"),tooltip:e("Lower–roman"),type:"lower-roman",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M11.88 8.7V7.558h-1.234V8.7h1.234zm0 5.3V9.333h-1.234V14h1.234zm2.5 0v-1.235h-1.234V14h1.235zm-4.75 4.7v-1.142H8.395V18.7H9.63zm0 5.3v-4.667H8.395V24H9.63zm2.5-5.3v-1.142h-1.234V18.7h1.235zm0 5.3v-4.667h-1.234V24h1.235zm2.501 0v-1.235h-1.235V24h1.235zM7.38 28.7v-1.142H6.145V28.7H7.38zm0 5.3v-4.667H6.145V34H7.38zm2.5-5.3v-1.142H8.646V28.7H9.88zm0 5.3v-4.667H8.646V34H9.88zm2.5-5.3v-1.142h-1.234V28.7h1.235zm0 5.3v-4.667h-1.234V34h1.235zm2.501 0v-1.235h-1.235V34h1.235z"/></svg>'},{label:e("Toggle the upper–roman list style"),tooltip:e("Upper-roman"),type:"upper-roman",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M11.916 15V8.558h-1.301V15h1.3zm2.465 0v-1.235h-1.235V15h1.235zM9.665 25v-6.442h-1.3V25h1.3zm2.5 0v-6.442h-1.3V25h1.3zm2.466 0v-1.235h-1.235V25h1.235zm-7.216 9v-6.442h-1.3V34h1.3zm2.5 0v-6.442h-1.3V34h1.3zm2.501 0v-6.442h-1.3V34h1.3zm2.465 0v-1.235h-1.235V34h1.235z"/></svg>'},{label:e("Toggle the lower–latin list style"),tooltip:e("Lower-latin"),type:"lower-latin",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M9.62 14.105c.272 0 .528-.05.768-.153s.466-.257.677-.462c.009.024.023.072.044.145.047.161.086.283.119.365h1.221a2.649 2.649 0 0 1-.222-.626c-.04-.195-.059-.498-.059-.908l.013-1.441c0-.536-.055-.905-.165-1.105-.11-.201-.3-.367-.569-.497-.27-.13-.68-.195-1.23-.195-.607 0-1.064.108-1.371.325-.308.217-.525.55-.65 1.002l1.12.202c.076-.217.176-.369.299-.455.123-.086.294-.13.514-.13.325 0 .546.05.663.152.118.101.176.27.176.508v.123c-.222.093-.622.194-1.2.303-.427.082-.755.178-.982.288-.227.11-.403.268-.53.474a1.327 1.327 0 0 0-.188.706c0 .398.138.728.415.988.277.261.656.391 1.136.391zm.368-.87a.675.675 0 0 1-.492-.189.606.606 0 0 1-.193-.448c0-.176.08-.32.241-.435.106-.07.33-.142.673-.215a7.19 7.19 0 0 0 .751-.19v.247c0 .296-.016.496-.048.602a.773.773 0 0 1-.295.409 1.07 1.07 0 0 1-.637.22zm4.645.765v-1.235h-1.235V14h1.235zM10.2 25.105c.542 0 1.003-.215 1.382-.646.38-.43.57-1.044.57-1.84 0-.771-.187-1.362-.559-1.774a1.82 1.82 0 0 0-1.41-.617c-.522 0-.973.216-1.354.65v-2.32H7.594V25h1.147v-.686a1.9 1.9 0 0 0 .67.592c.26.133.523.2.79.2zm-.299-.975c-.354 0-.638-.164-.852-.492-.153-.232-.229-.59-.229-1.073 0-.468.098-.818.295-1.048a.93.93 0 0 1 .738-.345c.302 0 .55.118.743.354.193.236.29.62.29 1.154 0 .5-.096.868-.288 1.1-.192.233-.424.35-.697.35zm4.478.87v-1.235h-1.234V25h1.234zm-4.017 9.105c.6 0 1.08-.142 1.437-.426.357-.284.599-.704.725-1.261l-1.213-.207c-.061.326-.167.555-.316.688a.832.832 0 0 1-.576.2.916.916 0 0 1-.75-.343c-.185-.228-.278-.62-.278-1.173 0-.498.091-.853.274-1.066.183-.212.429-.318.736-.318.232 0 .42.061.565.184.145.123.238.306.28.55l1.216-.22c-.146-.501-.387-.874-.722-1.119-.336-.244-.788-.366-1.356-.366-.695 0-1.245.214-1.653.643-.407.43-.61 1.03-.61 1.8 0 .762.202 1.358.608 1.788.406.431.95.646 1.633.646zM14.633 34v-1.235h-1.235V34h1.235z"/></svg>'},{label:e("Toggle the upper–latin list style"),tooltip:e("Upper-latin"),type:"upper-latin",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="m7.88 15 .532-1.463h2.575L11.549 15h1.415l-2.58-6.442H9.01L6.5 15h1.38zm2.69-2.549H8.811l.87-2.39.887 2.39zM14.88 15v-1.235h-1.234V15h1.234zM9.352 25c.83-.006 1.352-.02 1.569-.044.346-.038.636-.14.872-.305.236-.166.422-.387.558-.664.137-.277.205-.562.205-.855 0-.372-.106-.695-.317-.97-.21-.276-.512-.471-.905-.585a1.51 1.51 0 0 0 .661-.567 1.5 1.5 0 0 0 .244-.83c0-.28-.066-.53-.197-.754a1.654 1.654 0 0 0-.495-.539 1.676 1.676 0 0 0-.672-.266c-.25-.042-.63-.063-1.14-.063H7.158V25h2.193zm.142-3.88H8.46v-1.49h.747c.612 0 .983.007 1.112.022.217.026.38.102.49.226.11.125.165.287.165.486a.68.68 0 0 1-.192.503.86.86 0 0 1-.525.23 11.47 11.47 0 0 1-.944.023h.18zm.17 2.795H8.46v-1.723h1.05c.592 0 .977.03 1.154.092.177.062.313.16.406.295a.84.84 0 0 1 .14.492c0 .228-.06.41-.181.547a.806.806 0 0 1-.473.257c-.126.026-.423.04-.892.04zM14.88 25v-1.235h-1.234V25h1.234zm-5.018 9.11c.691 0 1.262-.17 1.711-.512.45-.341.772-.864.965-1.567l-1.261-.4c-.109.472-.287.818-.536 1.037-.25.22-.547.33-.892.33-.47 0-.85-.173-1.143-.519-.293-.345-.44-.925-.44-1.74 0-.767.15-1.322.447-1.665.297-.343.684-.514 1.162-.514.346 0 .64.096.881.29.242.193.4.457.477.79l1.288-.307c-.147-.516-.367-.911-.66-1.187-.492-.465-1.132-.698-1.92-.698-.902 0-1.63.296-2.184.89-.554.593-.83 1.426-.83 2.498 0 1.014.275 1.813.825 2.397.551.585 1.254.877 2.11.877zM14.88 34v-1.235h-1.234V34h1.234z"/></svg>'}]}))}}function J({editor:t,parentCommandName:e,buttonLabel:i,buttonIcon:n,toolbarAriaLabel:o,styleDefinitions:s}){const r=t.commands.get(e),l=t.commands.get("listStyle");return a=>{const c=Object(m.createDropdown)(a,m.SplitButtonView),d=c.buttonView,u=function({editor:t,listStyleCommand:e,parentCommandName:i}){const n=t.locale,o=t.commands.get(i);return({label:s,type:r,icon:l,tooltip:a})=>{const c=new m.ButtonView(n);return c.set({label:s,icon:l,tooltip:a}),e.on("change:value",()=>{c.isOn=e.value===r}),c.on("execute",()=>{o.value?e.value!==r?t.execute("listStyle",{type:r}):t.execute("listStyle",{type:e._defaultType}):t.model.change(()=>{t.execute(i),t.execute("listStyle",{type:r})}),t.editing.view.focus()}),c}}({editor:t,parentCommandName:e,listStyleCommand:l});return Object(m.addToolbarToDropdown)(c,s.map(u)),c.bind("isEnabled").to(r),c.toolbarView.ariaLabel=o,c.class="ck-list-styles-dropdown",d.on("execute",()=>{t.execute(e),t.editing.view.focus()}),d.set({label:i,icon:n,tooltip:!0,isToggleable:!0}),d.bind("isOn").to(r,"value",t=>!!t),c}}class G extends n.Plugin{static get requires(){return[F,$]}static get pluginName(){return"ListStyle"}}class Q extends n.Command{constructor(t){super(t),this._selectedElements=[],this.on("execute",()=>{this.refresh()},{priority:"highest"})}refresh(){this._selectedElements=this._getSelectedItems(),this.value=this._selectedElements.every(t=>!!t.getAttribute("todoListChecked")),this.isEnabled=!!this._selectedElements.length}_getSelectedItems(){const t=this.editor.model,e=t.schema,i=t.document.selection.getFirstRange(),n=i.start.parent,o=[];e.checkAttribute(n,"todoListChecked")&&o.push(n);for(const t of i.getItems())e.checkAttribute(t,"todoListChecked")&&!o.includes(t)&&o.push(t);return o}execute(t={}){this.editor.model.change(e=>{for(const i of this._selectedElements){(void 0===t.forceValue?!this.value:t.forceValue)?e.setAttribute("todoListChecked",!0,i):e.removeAttribute("todoListChecked",i)}})}}function X(t,e,i){const n=e.modelCursor,o=n.parent,s=e.viewItem;if("checkbox"!=s.getAttribute("type")||"listItem"!=o.name||!n.isAtStart)return;if(!i.consumable.consume(s,{name:!0}))return;const r=i.writer;r.setAttribute("listType","todo",o),e.viewItem.hasAttribute("checked")&&r.setAttribute("todoListChecked",!0,o),e.modelRange=r.createRange(n)}function Z(t){return(e,i)=>{const n=i.modelPosition,o=n.parent;if(!o.is("element","listItem")||"todo"!=o.getAttribute("listType"))return;const s=et(i.mapper.toViewElement(o),t);s&&(i.viewPosition=i.mapper.findPositionIn(s,n.offset))}}function tt(t,e,i,n){return e.createUIElement("label",{class:"todo-list__label",contenteditable:!1},(function(e){const s=Object(o.createElement)(document,"input",{type:"checkbox"});i&&s.setAttribute("checked","checked"),s.addEventListener("change",()=>n(t));const r=this.toDomElement(e);return r.appendChild(s),r}))}function et(t,e){const i=e.createRangeIn(t);for(const t of i)if(t.item.is("containerElement","span")&&t.item.hasClass("todo-list__label__description"))return t.item}const it=Object(o.parseKeystroke)("Ctrl+Enter");class nt extends n.Plugin{static get pluginName(){return"TodoListEditing"}static get requires(){return[M]}init(){const t=this.editor,{editing:e,data:i,model:n}=t;n.schema.extend("listItem",{allowAttributes:["todoListChecked"]}),n.schema.addAttributeCheck((t,e)=>{const i=t.last;if("todoListChecked"==e&&"listItem"==i.name&&"todo"!=i.getAttribute("listType"))return!1}),t.commands.add("todoList",new s(t,"todo"));const r=new Q(t);var l,a;t.commands.add("checkTodoList",r),t.commands.add("todoListCheck",r),i.downcastDispatcher.on("insert:listItem",function(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;if("todo"!=i.item.getAttribute("listType"))return;const s=i.item;o.consume(s,"insert"),o.consume(s,"attribute:listType"),o.consume(s,"attribute:listIndent"),o.consume(s,"attribute:todoListChecked");const r=n.writer,l=g(s,n);r.addClass("todo-list",l.parent);const a=r.createContainerElement("label",{class:"todo-list__label"}),c=r.createEmptyElement("input",{type:"checkbox",disabled:"disabled"}),d=r.createContainerElement("span",{class:"todo-list__label__description"});s.getAttribute("todoListChecked")&&r.setAttribute("checked","checked",c),r.insert(r.createPositionAt(l,0),a),r.insert(r.createPositionAt(a,0),c),r.insert(r.createPositionAfter(c),d),p(s,l,n,t)}}(n),{priority:"high"}),i.upcastDispatcher.on("element:input",X,{priority:"high"}),e.downcastDispatcher.on("insert:listItem",function(t,e){return(i,n,o)=>{const s=o.consumable;if(!s.test(n.item,"insert")||!s.test(n.item,"attribute:listType")||!s.test(n.item,"attribute:listIndent"))return;if("todo"!=n.item.getAttribute("listType"))return;const r=n.item;s.consume(r,"insert"),s.consume(r,"attribute:listType"),s.consume(r,"attribute:listIndent"),s.consume(r,"attribute:todoListChecked");const l=o.writer,a=g(r,o),c=!!r.getAttribute("todoListChecked"),d=tt(r,l,c,e),u=l.createContainerElement("span",{class:"todo-list__label__description"});l.addClass("todo-list",a.parent),l.insert(l.createPositionAt(a,0),d),l.insert(l.createPositionAfter(d),u),p(r,a,o,t)}}(n,t=>this._handleCheckmarkChange(t)),{priority:"high"}),e.downcastDispatcher.on("attribute:listType:listItem",(l=t=>this._handleCheckmarkChange(t),a=e.view,(t,e,i)=>{const n=i.mapper.toViewElement(e.item),o=i.writer,s=function(t,e){const i=e.createRangeIn(t);for(const t of i)if(t.item.is("uiElement","label"))return t.item}(n,a);if("todo"==e.attributeNewValue){const t=!!e.item.getAttribute("todoListChecked"),i=tt(e.item,o,t,l),s=o.createContainerElement("span",{class:"todo-list__label__description"}),r=o.createRangeIn(n),a=y(n),c=f(r.start),d=a?o.createPositionBefore(a):r.end,u=o.createRange(c,d);o.addClass("todo-list",n.parent),o.move(u,o.createPositionAt(s,0)),o.insert(o.createPositionAt(n,0),i),o.insert(o.createPositionAfter(i),s)}else if("todo"==e.attributeOldValue){const t=et(n,a);o.removeClass("todo-list",n.parent),o.remove(s),o.move(o.createRangeIn(t),o.createPositionBefore(t)),o.remove(t)}})),e.downcastDispatcher.on("attribute:todoListChecked:listItem",function(t){return(e,i,n)=>{if("todo"!=i.item.getAttribute("listType"))return;if(!n.consumable.consume(i.item,"attribute:todoListChecked"))return;const{mapper:o,writer:s}=n,r=!!i.item.getAttribute("todoListChecked"),l=o.toViewElement(i.item).getChild(0),a=tt(i.item,s,r,t);s.insert(s.createPositionAfter(l),a),s.remove(l)}}(t=>this._handleCheckmarkChange(t))),e.mapper.on("modelToViewPosition",Z(e.view)),i.mapper.on("modelToViewPosition",Z(e.view)),this.listenTo(e.view.document,"arrowKey",function(t,e){return(i,n)=>{if("left"!=Object(o.getLocalizedArrowKeyCodeDirection)(n.keyCode,e.contentLanguageDirection))return;const s=t.schema,r=t.document.selection;if(!r.isCollapsed)return;const l=r.getFirstPosition(),a=l.parent;if("listItem"===a.name&&"todo"==a.getAttribute("listType")&&l.isAtStart){const e=s.getNearestSelectionRange(t.createPositionBefore(a),"backward");e&&t.change(t=>t.setSelection(e)),n.preventDefault(),n.stopPropagation(),i.stop()}}}(n,t.locale),{context:"li"}),this.listenTo(e.view.document,"keydown",(e,i)=>{Object(o.getCode)(i)===it&&(t.execute("checkTodoList"),e.stop())},{priority:"high"});const c=new Set;this.listenTo(n,"applyOperation",(t,e)=>{const i=e[0];if("rename"==i.type&&"listItem"==i.oldName){const t=i.position.nodeAfter;t.hasAttribute("todoListChecked")&&c.add(t)}else if("changeAttribute"==i.type&&"listType"==i.key&&"todo"===i.oldValue)for(const t of i.range.getItems())t.hasAttribute("todoListChecked")&&"todo"!==t.getAttribute("listType")&&c.add(t)}),n.document.registerPostFixer(t=>{let e=!1;for(const i of c)t.removeAttribute("todoListChecked",i),e=!0;return c.clear(),e})}_handleCheckmarkChange(t){const e=this.editor,i=e.model,n=Array.from(i.document.selection.getRanges());i.change(i=>{i.setSelection(t,"end"),e.execute("checkTodoList"),i.setSelection(n)})}}class ot extends n.Plugin{static get pluginName(){return"TodoListUI"}init(){const t=this.editor.t;v(this.editor,"todoList",t("To-do List"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m2.315 14.705 2.224-2.24a.689.689 0 0 1 .963 0 .664.664 0 0 1 0 .949L2.865 16.07a.682.682 0 0 1-.112.089.647.647 0 0 1-.852-.051L.688 14.886a.635.635 0 0 1 0-.903.647.647 0 0 1 .91 0l.717.722zm5.185.045a.75.75 0 0 1 .75-.75h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75zM2.329 5.745l2.21-2.226a.689.689 0 0 1 .963 0 .664.664 0 0 1 0 .95L2.865 7.125a.685.685 0 0 1-.496.196.644.644 0 0 1-.468-.187L.688 5.912a.635.635 0 0 1 0-.903.647.647 0 0 1 .91 0l.73.736zM7.5 5.75A.75.75 0 0 1 8.25 5h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75z"/></svg>')}}i(10);class st extends n.Plugin{static get requires(){return[nt,ot]}static get pluginName(){return"TodoList"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/paste-from-office.js b/core/assets/vendor/ckeditor5/paste-from-office.js
new file mode 100644
index 0000000000000000000000000000000000000000..4cd9ec115b4789d5c85311dc520334c9345e3edc
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/paste-from-office.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+window.CKEditor5=window.CKEditor5||{},window.CKEditor5.pasteFromOffice=function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=4)}([function(e,t,n){e.exports=n(1)("./src/engine.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,n){e.exports=n(1)("./src/core.js")},function(e,t,n){e.exports=n(1)("./src/clipboard.js")},function(e,t,n){"use strict";n.r(t),n.d(t,"PasteFromOffice",(function(){return b}));var r=n(2),i=n(3),o=n(0);function s(e,t){if(!e.childCount)return;const n=new o.UpcastWriter(e.document),r=function(e,t){const n=t.createRangeIn(e),r=new o.Matcher({name:/^p|h\d+$/,styles:{"mso-list":/.*/}}),i=[];for(const e of n)if("elementStart"===e.type&&r.match(e.item)){const t=a(e.item);i.push({element:e.item,id:t.id,order:t.order,indent:t.indent})}return i}(e,n);if(!r.length)return;let i=null,s=1;r.forEach((e,a)=>{const u=function(e,t){if(!e)return!0;if(e.id!==t.id)return t.indent-e.indent!=1;const n=t.element.previousSibling;if(!n)return!0;return r=n,!(r.is("element","ol")||r.is("element","ul"));var r}(r[a-1],e),f=u?null:r[a-1],d=(m=e,(p=f)?m.indent-p.indent:m.indent-1);var p,m;if(u&&(i=null,s=1),!i||0!==d){const r=function(e,t){const n=new RegExp(`@list l${e.id}:level${e.indent}\\s*({[^}]*)`,"gi"),r=/mso-level-number-format:([^;]{0,100});/gi,i=n.exec(t);let o="decimal",s="ol";if(i&&i[1]){const t=r.exec(i[1]);if(t&&t[1]&&(o=t[1].trim(),s="bullet"!==o&&"image"!==o?"ol":"ul"),"bullet"===o){const t=function(e){const t=function(e){if(e.getChild(0).is("$text"))return null;for(const t of e.getChildren()){if(!t.is("element","span"))continue;const e=t.getChild(0);return e.is("$text")?e:e.getChild(0)}}(e);if(!t)return null;const n=t._data;if("o"===n)return"circle";if("·"===n)return"disc";if("§"===n)return"square";return null}(e.element);t&&(o=t)}}return{type:s,style:c(o)}}(e,t);if(i){if(e.indent>s){const e=i.getChild(i.childCount-1),t=e.getChild(e.childCount-1);i=l(r,t,n),s+=1}else if(e.indent<s){const t=s-e.indent;i=function(e,t){const n=e.getAncestors({parentFirst:!0});let r=null,i=0;for(const e of n)if("ul"!==e.name&&"ol"!==e.name||i++,i===t){r=e;break}return r}(i,t),s=parseInt(e.indent)}}else i=l(r,e.element,n);e.indent<=s&&(i.is("element",r.type)||(i=n.rename(r.type,i)))}const g=function(e,t){return function(e,t){const n=new o.Matcher({name:"span",styles:{"mso-list":"Ignore"}}),r=t.createRangeIn(e);for(const e of r)"elementStart"===e.type&&n.match(e.item)&&t.remove(e.item)}(e,t),t.rename("li",e)}(e.element,n);n.appendChild(g,i)})}function c(e){switch(e){case"arabic-leading-zero":return"decimal-leading-zero";case"alpha-upper":return"upper-alpha";case"alpha-lower":return"lower-alpha";case"roman-upper":return"upper-roman";case"roman-lower":return"lower-roman";case"circle":case"disc":case"square":return e;default:return null}}function l(e,t,n){const r=t.parent,i=n.createElement(e.type),o=r.getChildIndex(t)+1;return n.insertChild(o,i,r),e.style&&n.setStyle("list-style-type",e.style,i),i}function a(e){const t={},n=e.getStyle("mso-list");if(n){const e=n.match(/(^|\s{1,100})l(\d+)/i),r=n.match(/\s{0,100}lfo(\d+)/i),i=n.match(/\s{0,100}level(\d+)/i);e&&r&&i&&(t.id=e[2],t.order=r[1],t.indent=i[1])}return t}const u=/id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;class f{constructor(e){this.document=e}isActive(e){return u.test(e)}execute(e){const t=new o.UpcastWriter(this.document),{body:n}=e._parsedData;!function(e,t){for(const n of e.getChildren())if(n.is("element","b")&&"normal"===n.getStyle("font-weight")){const r=e.getChildIndex(n);t.remove(n),t.insertChild(r,n.getChildren(),e)}}(n,t),function(e,t){for(const n of t.createRangeIn(e)){const e=n.item;if(e.is("element","li")){const n=e.getChild(0);n&&n.is("element","p")&&t.unwrapElement(n)}}}(n,t),e.content=n}}function d(e,t){if(!e.childCount)return;const n=new o.UpcastWriter;!function(e,t,n){const r=n.createRangeIn(t),i=new o.Matcher({name:"img"}),s=[];for(const t of r)if(i.match(t.item)){const n=t.item,r=n.getAttribute("v:shapes")?n.getAttribute("v:shapes").split(" "):[];r.length&&r.every(t=>e.indexOf(t)>-1)?s.push(n):n.getAttribute("src")||s.push(n)}for(const e of s)n.remove(e)}(function(e,t){const n=t.createRangeIn(e),r=new o.Matcher({name:/v:(.+)/}),i=[];for(const e of n){if("elementStart"!=e.type)continue;const t=e.item,n=t.previousSibling&&t.previousSibling.name||null;r.match(t)&&t.getAttribute("o:gfxdata")&&"v:shapetype"!==n&&i.push(e.item.getAttribute("id"))}return i}(e,n),e,n),function(e,t){const n=t.createRangeIn(e),r=new o.Matcher({name:/v:(.+)/}),i=[];for(const e of n)"elementStart"==e.type&&r.match(e.item)&&i.push(e.item);for(const e of i)t.remove(e)}(e,n);const r=function(e,t){const n=t.createRangeIn(e),r=new o.Matcher({name:"img"}),i=[];for(const e of n)r.match(e.item)&&e.item.getAttribute("src").startsWith("file://")&&i.push(e.item);return i}(e,n);r.length&&function(e,t,n){if(e.length===t.length)for(let i=0;i<e.length;i++){const o=`data:${t[i].type};base64,${r=t[i].hex,btoa(r.match(/\w{2}/g).map(e=>String.fromCharCode(parseInt(e,16))).join(""))}`;n.setAttribute("src",o,e[i])}var r}(r,function(e){if(!e)return[];const t=/{\\pict[\s\S]+?\\bliptag-?\d+(\\blipupi-?\d+)?({\\\*\\blipuid\s?[\da-fA-F]+)?[\s}]*?/,n=new RegExp("(?:("+t.source+"))([\\da-fA-F\\s]+)\\}","g"),r=e.match(n),i=[];if(r)for(const e of r){let n=!1;e.includes("\\pngblip")?n="image/png":e.includes("\\jpegblip")&&(n="image/jpeg"),n&&i.push({hex:e.replace(t,"").replace(/[^\da-fA-F]/g,""),type:n})}return i}(t),n)}const p=/<meta\s*name="?generator"?\s*content="?microsoft\s*word\s*\d+"?\/?>/i,m=/xmlns:o="urn:schemas-microsoft-com/i;class g{constructor(e){this.document=e}isActive(e){return p.test(e)||m.test(e)}execute(e){const{body:t,stylesString:n}=e._parsedData;s(t,n),d(t,e.dataTransfer.getData("text/rtf")),e.content=t}}function h(e){return e.replace(/<span(?: class="Apple-converted-space"|)>(\s+)<\/span>/g,(e,t)=>1===t.length?" ":Array(t.length+1).join("  ").substr(0,t.length))}function y(e,t){const n=new DOMParser,r=function(e){return h(h(e)).replace(/(<span\s+style=['"]mso-spacerun:yes['"]>[^\S\r\n]*?)[\r\n]+([^\S\r\n]*<\/span>)/g,"$1$2").replace(/<span\s+style=['"]mso-spacerun:yes['"]><\/span>/g,"").replace(/ <\//g," </").replace(/ <o:p><\/o:p>/g," <o:p></o:p>").replace(/<o:p>(&nbsp;|\u00A0)<\/o:p>/g,"").replace(/>([^\S\r\n]*[\r\n]\s*)</g,"><")}(function(e){const t=e.indexOf("</body>");if(t<0)return e;const n=e.indexOf("</html>",t+"</body>".length);return e.substring(0,t+"</body>".length)+(n>=0?e.substring(n):"")}(e=e.replace(/<!--\[if gte vml 1]>/g,""))),i=n.parseFromString(r,"text/html");!function(e){e.querySelectorAll("span[style*=spacerun]").forEach(e=>{const t=e.innerText.length||0;e.innerHTML=Array(t+1).join("  ").substr(0,t)})}(i);const s=i.body.innerHTML,c=function(e,t){const n=new o.ViewDocument(t),r=new o.DomConverter(n,{renderingMode:"data"}),i=e.createDocumentFragment(),s=e.body.childNodes;for(;s.length>0;)i.appendChild(s[0]);return r.domToView(i,{skipComments:!0})}(i,t),l=function(e){const t=[],n=[],r=Array.from(e.getElementsByTagName("style"));for(const e of r)e.sheet&&e.sheet.cssRules&&e.sheet.cssRules.length&&(t.push(e.sheet),n.push(e.innerHTML));return{styles:t,stylesString:n.join(" ")}}(i);return{body:c,bodyString:s,styles:l.styles,stylesString:l.stylesString}}class b extends r.Plugin{static get pluginName(){return"PasteFromOffice"}static get requires(){return[i.ClipboardPipeline]}init(){const e=this.editor,t=e.editing.view.document,n=[];n.push(new g(t)),n.push(new f(t)),e.plugins.get("ClipboardPipeline").on("inputTransformation",(e,r)=>{if(r._isTransformedWithPasteFromOffice)return;const i=r.dataTransfer.getData("text/html"),o=n.find(e=>e.isActive(i));o&&(r._parsedData=y(i,t.stylesProcessor),o.execute(r),r._isTransformedWithPasteFromOffice=!0)},{priority:"high"})}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/remove-format.js b/core/assets/vendor/ckeditor5/remove-format.js
new file mode 100644
index 0000000000000000000000000000000000000000..e98d4a8ea01e0b8846b3f775db2e58b75c4d5373
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/remove-format.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"Remove Format":"Remove Format"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.removeFormat=function(t){var e={};function o(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,o),r.l=!0,r.exports}return o.m=t,o.c=e,o.d=function(t,e,n){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)o.d(n,r,function(e){return t[e]}.bind(null,r));return n},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=4)}([function(t,e,o){t.exports=o(1)("./src/core.js")},function(t,e){t.exports=CKEditor5.dll},function(t,e,o){t.exports=o(1)("./src/utils.js")},function(t,e,o){t.exports=o(1)("./src/ui.js")},function(t,e,o){"use strict";o.r(e),o.d(e,"RemoveFormat",(function(){return u})),o.d(e,"RemoveFormatEditing",(function(){return a})),o.d(e,"RemoveFormatUI",(function(){return i}));var n=o(0),r=o(3);class i extends n.Plugin{static get pluginName(){return"RemoveFormatUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("removeFormat",o=>{const n=t.commands.get("removeFormat"),i=new r.ButtonView(o);return i.set({label:e("Remove Format"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8.69 14.915c.053.052.173.083.36.093a.366.366 0 0 1 .345.485l-.003.01a.738.738 0 0 1-.697.497h-2.67a.374.374 0 0 1-.353-.496l.013-.038a.681.681 0 0 1 .644-.458c.197-.012.325-.043.386-.093a.28.28 0 0 0 .072-.11L9.592 4.5H6.269c-.359-.017-.609.013-.75.09-.142.078-.289.265-.442.563-.192.29-.516.464-.864.464H4.17a.43.43 0 0 1-.407-.569L4.46 3h13.08l-.62 2.043a.81.81 0 0 1-.775.574h-.114a.486.486 0 0 1-.486-.486c.001-.284-.054-.464-.167-.54-.112-.076-.367-.106-.766-.091h-3.28l-2.68 10.257c-.006.074.007.127.038.158zM3 17h8a.5.5 0 1 1 0 1H3a.5.5 0 1 1 0-1zm11.299 1.17a.75.75 0 1 1-1.06-1.06l1.414-1.415-1.415-1.414a.75.75 0 0 1 1.06-1.06l1.415 1.414 1.414-1.415a.75.75 0 1 1 1.06 1.06l-1.413 1.415 1.414 1.415a.75.75 0 0 1-1.06 1.06l-1.415-1.414-1.414 1.414z"/></svg>',tooltip:!0}),i.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(i,"execute",()=>{t.execute("removeFormat"),t.editing.view.focus()}),i})}}var s=o(2);class c extends n.Command{refresh(){const t=this.editor.model;this.isEnabled=!!Object(s.first)(this._getFormattingItems(t.document.selection,t.schema))}execute(){const t=this.editor.model,e=t.schema;t.change(o=>{for(const n of this._getFormattingItems(t.document.selection,e))if(n.is("selection"))for(const t of this._getFormattingAttributes(n,e))o.removeSelectionAttribute(t);else{const t=o.createRangeOn(n);for(const r of this._getFormattingAttributes(n,e))o.removeAttribute(r,t)}})}*_getFormattingItems(t,e){const o=t=>!!Object(s.first)(this._getFormattingAttributes(t,e));for(const n of t.getRanges())for(const t of n.getItems())!e.isBlock(t)&&o(t)&&(yield t);for(const e of t.getSelectedBlocks())o(e)&&(yield e);o(t)&&(yield t)}*_getFormattingAttributes(t,e){for(const[o]of t.getAttributes()){const t=e.getAttributeProperties(o);t&&t.isFormatting&&(yield o)}}}class a extends n.Plugin{static get pluginName(){return"RemoveFormatEditing"}init(){const t=this.editor;t.commands.add("removeFormat",new c(t))}}class u extends n.Plugin{static get requires(){return[a,i]}static get pluginName(){return"RemoveFormat"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/source-editing.js b/core/assets/vendor/ckeditor5/source-editing.js
new file mode 100644
index 0000000000000000000000000000000000000000..19f346094c8b16790ba5b5b70ab016929f48f54f
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/source-editing.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{Source:"Source"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.sourceEditing=function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=7)}([function(e,t,i){e.exports=i(2)("./src/core.js")},function(e,t,i){e.exports=i(2)("./src/utils.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,i){e.exports=i(2)("./src/ui.js")},function(e,t,i){var n=i(5),o=i(6);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,r);e.exports=o.locals||{}},function(e,t,i){"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},r=function(){var e={};return function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}e[t]=i}return e[t]}}(),a=[];function s(e){for(var t=-1,i=0;i<a.length;i++)if(a[i].identifier===e){t=i;break}return t}function d(e,t){for(var i={},n=[],o=0;o<e.length;o++){var r=e[o],d=t.base?r[0]+t.base:r[0],c=i[d]||0,u="".concat(d," ").concat(c);i[d]=c+1;var l=s(u),h={css:r[1],media:r[2],sourceMap:r[3]};-1!==l?(a[l].references++,a[l].updater(h)):a.push({identifier:u,updater:p(h,t),references:1}),n.push(u)}return n}function c(e){var t=document.createElement("style"),n=e.attributes||{};if(void 0===n.nonce){var o=i.nc;o&&(n.nonce=o)}if(Object.keys(n).forEach((function(e){t.setAttribute(e,n[e])})),"function"==typeof e.insert)e.insert(t);else{var a=r(e.insert||"head");if(!a)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");a.appendChild(t)}return t}var u,l=(u=[],function(e,t){return u[e]=t,u.filter(Boolean).join("\n")});function h(e,t,i,n){var o=i?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(e.styleSheet)e.styleSheet.cssText=l(t,o);else{var r=document.createTextNode(o),a=e.childNodes;a[t]&&e.removeChild(a[t]),a.length?e.insertBefore(r,a[t]):e.appendChild(r)}}function f(e,t,i){var n=i.css,o=i.media,r=i.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),r&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}var m=null,g=0;function p(e,t){var i,n,o;if(t.singleton){var r=g++;i=m||(m=c(t)),n=h.bind(null,i,r,!1),o=h.bind(null,i,r,!0)}else i=c(t),n=f.bind(null,i,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(i)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var i=d(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var n=0;n<i.length;n++){var o=s(i[n]);a[o].references--}for(var r=d(e,t),c=0;c<i.length;c++){var u=s(i[c]);0===a[u].references&&(a[u].updater(),a.splice(u,1))}i=r}}}},function(e,t){e.exports='.ck-source-editing-area{position:relative}.ck-source-editing-area:after,.ck-source-editing-area textarea{padding:var(--ck-spacing-large);margin:0;border:1px solid transparent;line-height:var(--ck-line-height-base);font-size:var(--ck-font-size-normal);font-family:monospace;white-space:pre-wrap}.ck-source-editing-area:after{content:attr(data-value) " ";visibility:hidden;display:block}.ck-source-editing-area textarea{position:absolute;width:100%;height:100%;resize:none;outline:none;overflow:hidden;box-sizing:border-box;border-color:var(--ck-color-base-border);border-radius:0}.ck-rounded-corners .ck-source-editing-area textarea,.ck-source-editing-area textarea.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck-source-editing-area textarea:not([readonly]):focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0}'},function(e,t,i){"use strict";i.r(t),i.d(t,"SourceEditing",(function(){return d}));var n=i(0),o=i(3),r=i(1);function a(e){const t=[{name:"address",isVoid:!1},{name:"article",isVoid:!1},{name:"aside",isVoid:!1},{name:"blockquote",isVoid:!1},{name:"br",isVoid:!0},{name:"details",isVoid:!1},{name:"dialog",isVoid:!1},{name:"dd",isVoid:!1},{name:"div",isVoid:!1},{name:"dl",isVoid:!1},{name:"dt",isVoid:!1},{name:"fieldset",isVoid:!1},{name:"figcaption",isVoid:!1},{name:"figure",isVoid:!1},{name:"footer",isVoid:!1},{name:"form",isVoid:!1},{name:"h1",isVoid:!1},{name:"h2",isVoid:!1},{name:"h3",isVoid:!1},{name:"h4",isVoid:!1},{name:"h5",isVoid:!1},{name:"h6",isVoid:!1},{name:"header",isVoid:!1},{name:"hgroup",isVoid:!1},{name:"hr",isVoid:!0},{name:"input",isVoid:!0},{name:"li",isVoid:!1},{name:"main",isVoid:!1},{name:"nav",isVoid:!1},{name:"ol",isVoid:!1},{name:"p",isVoid:!1},{name:"pre",isVoid:!1},{name:"section",isVoid:!1},{name:"table",isVoid:!1},{name:"tbody",isVoid:!1},{name:"td",isVoid:!1},{name:"textarea",isVoid:!1},{name:"th",isVoid:!1},{name:"thead",isVoid:!1},{name:"tr",isVoid:!1},{name:"ul",isVoid:!1}],i=t.map(e=>e.name).join("|"),n=e.replace(new RegExp(`</?(${i})( .*?)?>`,"g"),"\n$&\n").split("\n");let o=0;return n.filter(e=>e.length).map(e=>function(e,t){return t.some(t=>!t.isVoid&&!!new RegExp(`<${t.name}( .*?)?>`).test(e))}(e,t)?s(e,o++):function(e,t){return t.some(t=>new RegExp(`</${t.name}>`).test(e))}(e,t)?s(e,--o):s(e,o)).join("\n")}function s(e,t,i="    "){return`${i.repeat(t)}${e}`}i(4);class d extends n.Plugin{static get pluginName(){return"SourceEditing"}static get requires(){return[n.PendingActions]}constructor(e){super(e),this.set("isSourceEditingMode",!1),this._elementReplacer=new r.ElementReplacer,this._replacedRoots=new Map,this._dataFromRoots=new Map}init(){const e=this.editor,t=e.t;e.ui.componentFactory.add("sourceEditing",i=>{const r=new o.ButtonView(i);return r.set({label:t("Source"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m12.5 0 5 4.5v15.003h-16V0h11zM3 1.5v3.25l-1.497 1-.003 8 1.5 1v3.254L7.685 18l-.001 1.504H17.5V8.002L16 9.428l-.004-4.22-4.222-3.692L3 1.5z"/><path d="M4.06 6.64a.75.75 0 0 1 .958 1.15l-.085.07L2.29 9.75l2.646 1.89c.302.216.4.62.232.951l-.058.095a.75.75 0 0 1-.951.232l-.095-.058-3.5-2.5V9.14l3.496-2.5zm4.194 6.22a.75.75 0 0 1-.958-1.149l.085-.07 2.643-1.89-2.646-1.89a.75.75 0 0 1-.232-.952l.058-.095a.75.75 0 0 1 .95-.232l.096.058 3.5 2.5v1.22l-3.496 2.5zm7.644-.836 2.122 2.122-5.825 5.809-2.125-.005.003-2.116zm2.539-1.847 1.414 1.414a.5.5 0 0 1 0 .707l-1.06 1.06-2.122-2.12 1.061-1.061a.5.5 0 0 1 .707 0z"/></svg>',tooltip:!0,withText:!0,class:"ck-source-editing-button"}),r.bind("isOn").to(this,"isSourceEditingMode"),r.bind("isEnabled").to(this,"isEnabled",e,"isReadOnly",e.plugins.get(n.PendingActions),"hasAny",(e,t,i)=>!!e&&(!t&&!i)),this.listenTo(r,"execute",()=>{this.isSourceEditingMode=!this.isSourceEditingMode}),r}),this._isAllowedToHandleSourceEditingMode()&&(this.on("change:isSourceEditingMode",(e,t,i)=>{i?(this._showSourceEditing(),this._disableCommands()):(this._hideSourceEditing(),this._enableCommands())}),this.on("change:isEnabled",(e,t,i)=>this._handleReadOnlyMode(!i)),this.listenTo(e,"change:isReadOnly",(e,t,i)=>this._handleReadOnlyMode(i))),e.data.on("get",()=>{this.isSourceEditingMode&&this._updateEditorData()},{priority:"high"})}afterInit(){const e=this.editor;["RealTimeCollaborativeEditing","CommentsEditing","TrackChangesEditing","RevisionHistory"].some(t=>e.plugins.has(t))&&console.warn("You initialized the editor with the source editing feature and at least one of the collaboration features. Please be advised that the source editing feature may not work, and be careful when editing document source that contains markers created by the collaboration features."),e.plugins.has("RestrictedEditingModeEditing")&&console.warn("You initialized the editor with the source editing feature and restricted editing feature. Please be advised that the source editing feature may not work, and be careful when editing document source that contains markers created by the restricted editing feature.")}_showSourceEditing(){const e=this.editor,t=e.editing.view,i=e.model;i.change(e=>{e.setSelection(null),e.removeSelectionAttribute(i.document.selection.getAttributeKeys())});for(const[i,n]of t.domRoots){const o=c(e.data.get({rootName:i})),a=Object(r.createElement)(n.ownerDocument,"textarea",{rows:"1"}),s=Object(r.createElement)(n.ownerDocument,"div",{class:"ck-source-editing-area","data-value":o},[a]);a.value=o,a.setSelectionRange(0,0),a.addEventListener("input",()=>{s.dataset.value=a.value}),t.change(e=>{const n=t.document.getRoot(i);e.addClass("ck-hidden",n)}),this._replacedRoots.set(i,s),this._elementReplacer.replace(n,s),this._dataFromRoots.set(i,o)}this._focusSourceEditing()}_hideSourceEditing(){const e=this.editor.editing.view;this._updateEditorData(),e.change(t=>{for(const[i]of this._replacedRoots)t.removeClass("ck-hidden",e.document.getRoot(i))}),this._elementReplacer.restore(),this._replacedRoots.clear(),this._dataFromRoots.clear(),e.focus()}_updateEditorData(){const e=this.editor,t={};for(const[e,i]of this._replacedRoots){const n=this._dataFromRoots.get(e),o=i.dataset.value;n!==o&&(t[e]=o)}Object.keys(t).length&&e.data.set(t,{batchType:"default"})}_focusSourceEditing(){const[e]=this._replacedRoots.values();e.querySelector("textarea").focus()}_disableCommands(){const e=this.editor;for(const t of e.commands.commands())t.forceDisabled("SourceEditingMode")}_enableCommands(){const e=this.editor;for(const t of e.commands.commands())t.clearForceDisabled("SourceEditingMode")}_handleReadOnlyMode(e){if(this.isSourceEditingMode)for(const[,t]of this._replacedRoots)t.querySelector("textarea").readOnly=e}_isAllowedToHandleSourceEditingMode(){const e=this.editor.ui.view.editable;return e&&!e._hasExternalElement}}function c(e){return function(e){return e.startsWith("<")}(e)?a(e):e}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/special-characters.js b/core/assets/vendor/ckeditor5/special-characters.js
new file mode 100644
index 0000000000000000000000000000000000000000..3e2e3cab77c27816284cd0cc671cb9fc06af0592
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/special-characters.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above","Bitcoin sign":"Bitcoin sign","Cedi sign":"Cedi sign","Cent sign":"Cent sign","Character categories":"Character categories","Colon sign":"Colon sign","Contains as member":"Contains as member","Copyright sign":"Copyright sign","Cruzeiro sign":"Cruzeiro sign","Currency sign":"Currency sign","Degree sign":"Degree sign","Division sign":"Division sign","Dollar sign":"Dollar sign","Dong sign":"Dong sign","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","Drachma sign":"Drachma sign","Element of":"Element of","Em dash":"Em dash","Empty set":"Empty set","En dash":"En dash","end with leftwards arrow above":"end with leftwards arrow above","Euro sign":"Euro sign","Euro-currency sign":"Euro-currency sign","Exclamation question mark":"Exclamation question mark","For all":"For all","Fraction slash":"Fraction slash","French franc sign":"French franc sign","German penny sign":"German penny sign","Greater-than or equal to":"Greater-than or equal to","Greater-than sign":"Greater-than sign","Guarani sign":"Guarani sign","Horizontal ellipsis":"Horizontal ellipsis","Hryvnia sign":"Hryvnia sign","Identical to":"Identical to","Indian rupee sign":"Indian rupee sign",Infinity:"Infinity",Integral:"Integral",Intersection:"Intersection","Inverted exclamation mark":"Inverted exclamation mark","Inverted question mark":"Inverted question mark","Kip sign":"Kip sign","Latin capital letter a with breve":"Latin capital letter a with breve","Latin capital letter a with macron":"Latin capital letter a with macron","Latin capital letter a with ogonek":"Latin capital letter a with ogonek","Latin capital letter c with acute":"Latin capital letter c with acute","Latin capital letter c with caron":"Latin capital letter c with caron","Latin capital letter c with circumflex":"Latin capital letter c with circumflex","Latin capital letter c with dot above":"Latin capital letter c with dot above","Latin capital letter d with caron":"Latin capital letter d with caron","Latin capital letter d with stroke":"Latin capital letter d with stroke","Latin capital letter e with breve":"Latin capital letter e with breve","Latin capital letter e with caron":"Latin capital letter e with caron","Latin capital letter e with dot above":"Latin capital letter e with dot above","Latin capital letter e with macron":"Latin capital letter e with macron","Latin capital letter e with ogonek":"Latin capital letter e with ogonek","Latin capital letter eng":"Latin capital letter eng","Latin capital letter g with breve":"Latin capital letter g with breve","Latin capital letter g with cedilla":"Latin capital letter g with cedilla","Latin capital letter g with circumflex":"Latin capital letter g with circumflex","Latin capital letter g with dot above":"Latin capital letter g with dot above","Latin capital letter h with circumflex":"Latin capital letter h with circumflex","Latin capital letter h with stroke":"Latin capital letter h with stroke","Latin capital letter i with breve":"Latin capital letter i with breve","Latin capital letter i with dot above":"Latin capital letter i with dot above","Latin capital letter i with macron":"Latin capital letter i with macron","Latin capital letter i with ogonek":"Latin capital letter i with ogonek","Latin capital letter i with tilde":"Latin capital letter i with tilde","Latin capital letter j with circumflex":"Latin capital letter j with circumflex","Latin capital letter k with cedilla":"Latin capital letter k with cedilla","Latin capital letter l with acute":"Latin capital letter l with acute","Latin capital letter l with caron":"Latin capital letter l with caron","Latin capital letter l with cedilla":"Latin capital letter l with cedilla","Latin capital letter l with middle dot":"Latin capital letter l with middle dot","Latin capital letter l with stroke":"Latin capital letter l with stroke","Latin capital letter n with acute":"Latin capital letter n with acute","Latin capital letter n with caron":"Latin capital letter n with caron","Latin capital letter n with cedilla":"Latin capital letter n with cedilla","Latin capital letter o with breve":"Latin capital letter o with breve","Latin capital letter o with double acute":"Latin capital letter o with double acute","Latin capital letter o with macron":"Latin capital letter o with macron","Latin capital letter r with acute":"Latin capital letter r with acute","Latin capital letter r with caron":"Latin capital letter r with caron","Latin capital letter r with cedilla":"Latin capital letter r with cedilla","Latin capital letter s with acute":"Latin capital letter s with acute","Latin capital letter s with caron":"Latin capital letter s with caron","Latin capital letter s with cedilla":"Latin capital letter s with cedilla","Latin capital letter s with circumflex":"Latin capital letter s with circumflex","Latin capital letter t with caron":"Latin capital letter t with caron","Latin capital letter t with cedilla":"Latin capital letter t with cedilla","Latin capital letter t with stroke":"Latin capital letter t with stroke","Latin capital letter u with breve":"Latin capital letter u with breve","Latin capital letter u with double acute":"Latin capital letter u with double acute","Latin capital letter u with macron":"Latin capital letter u with macron","Latin capital letter u with ogonek":"Latin capital letter u with ogonek","Latin capital letter u with ring above":"Latin capital letter u with ring above","Latin capital letter u with tilde":"Latin capital letter u with tilde","Latin capital letter w with circumflex":"Latin capital letter w with circumflex","Latin capital letter y with circumflex":"Latin capital letter y with circumflex","Latin capital letter y with diaeresis":"Latin capital letter y with diaeresis","Latin capital letter z with acute":"Latin capital letter z with acute","Latin capital letter z with caron":"Latin capital letter z with caron","Latin capital letter z with dot above":"Latin capital letter z with dot above","Latin capital ligature ij":"Latin capital ligature ij","Latin capital ligature oe":"Latin capital ligature oe","Latin small letter a with breve":"Latin small letter a with breve","Latin small letter a with macron":"Latin small letter a with macron","Latin small letter a with ogonek":"Latin small letter a with ogonek","Latin small letter c with acute":"Latin small letter c with acute","Latin small letter c with caron":"Latin small letter c with caron","Latin small letter c with circumflex":"Latin small letter c with circumflex","Latin small letter c with dot above":"Latin small letter c with dot above","Latin small letter d with caron":"Latin small letter d with caron","Latin small letter d with stroke":"Latin small letter d with stroke","Latin small letter dotless i":"Latin small letter dotless i","Latin small letter e with breve":"Latin small letter e with breve","Latin small letter e with caron":"Latin small letter e with caron","Latin small letter e with dot above":"Latin small letter e with dot above","Latin small letter e with macron":"Latin small letter e with macron","Latin small letter e with ogonek":"Latin small letter e with ogonek","Latin small letter eng":"Latin small letter eng","Latin small letter f with hook":"Latin small letter f with hook","Latin small letter g with breve":"Latin small letter g with breve","Latin small letter g with cedilla":"Latin small letter g with cedilla","Latin small letter g with circumflex":"Latin small letter g with circumflex","Latin small letter g with dot above":"Latin small letter g with dot above","Latin small letter h with circumflex":"Latin small letter h with circumflex","Latin small letter h with stroke":"Latin small letter h with stroke","Latin small letter i with breve":"Latin small letter i with breve","Latin small letter i with macron":"Latin small letter i with macron","Latin small letter i with ogonek":"Latin small letter i with ogonek","Latin small letter i with tilde":"Latin small letter i with tilde","Latin small letter j with circumflex":"Latin small letter j with circumflex","Latin small letter k with cedilla":"Latin small letter k with cedilla","Latin small letter kra":"Latin small letter kra","Latin small letter l with acute":"Latin small letter l with acute","Latin small letter l with caron":"Latin small letter l with caron","Latin small letter l with cedilla":"Latin small letter l with cedilla","Latin small letter l with middle dot":"Latin small letter l with middle dot","Latin small letter l with stroke":"Latin small letter l with stroke","Latin small letter long s":"Latin small letter long s","Latin small letter n preceded by apostrophe":"Latin small letter n preceded by apostrophe","Latin small letter n with acute":"Latin small letter n with acute","Latin small letter n with caron":"Latin small letter n with caron","Latin small letter n with cedilla":"Latin small letter n with cedilla","Latin small letter o with breve":"Latin small letter o with breve","Latin small letter o with double acute":"Latin small letter o with double acute","Latin small letter o with macron":"Latin small letter o with macron","Latin small letter r with acute":"Latin small letter r with acute","Latin small letter r with caron":"Latin small letter r with caron","Latin small letter r with cedilla":"Latin small letter r with cedilla","Latin small letter s with acute":"Latin small letter s with acute","Latin small letter s with caron":"Latin small letter s with caron","Latin small letter s with cedilla":"Latin small letter s with cedilla","Latin small letter s with circumflex":"Latin small letter s with circumflex","Latin small letter t with caron":"Latin small letter t with caron","Latin small letter t with cedilla":"Latin small letter t with cedilla","Latin small letter t with stroke":"Latin small letter t with stroke","Latin small letter u with breve":"Latin small letter u with breve","Latin small letter u with double acute":"Latin small letter u with double acute","Latin small letter u with macron":"Latin small letter u with macron","Latin small letter u with ogonek":"Latin small letter u with ogonek","Latin small letter u with ring above":"Latin small letter u with ring above","Latin small letter u with tilde":"Latin small letter u with tilde","Latin small letter w with circumflex":"Latin small letter w with circumflex","Latin small letter y with circumflex":"Latin small letter y with circumflex","Latin small letter z with acute":"Latin small letter z with acute","Latin small letter z with caron":"Latin small letter z with caron","Latin small letter z with dot above":"Latin small letter z with dot above","Latin small ligature ij":"Latin small ligature ij","Latin small ligature oe":"Latin small ligature oe","Left double quotation mark":"Left double quotation mark","Left single quotation mark":"Left single quotation mark","Left-pointing double angle quotation mark":"Left-pointing double angle quotation mark","leftwards arrow to bar":"leftwards arrow to bar","leftwards dashed arrow":"leftwards dashed arrow","leftwards double arrow":"leftwards double arrow","Less-than or equal to":"Less-than or equal to","Less-than sign":"Less-than sign","Lira sign":"Lira sign","Livre tournois sign":"Livre tournois sign","Logical and":"Logical and","Logical or":"Logical or",Macron:"Macron","Manat sign":"Manat sign","Mill sign":"Mill sign","Minus sign":"Minus sign","Multiplication sign":"Multiplication sign","N-ary product":"N-ary product","N-ary summation":"N-ary summation",Nabla:"Nabla","Naira sign":"Naira sign","New sheqel sign":"New sheqel sign","Nordic mark sign":"Nordic mark sign","Not an element of":"Not an element of","Not equal to":"Not equal to","Not sign":"Not sign","on with exclamation mark with left right arrow above":"on with exclamation mark with left right arrow above",Overline:"Overline","Paragraph sign":"Paragraph sign","Partial differential":"Partial differential","Per mille sign":"Per mille sign","Per ten thousand sign":"Per ten thousand sign","Peseta sign":"Peseta sign","Peso sign":"Peso sign","Plus-minus sign":"Plus-minus sign","Pound sign":"Pound sign","Proportional to":"Proportional to","Question exclamation mark":"Question exclamation mark","Registered sign":"Registered sign","Reversed paragraph sign":"Reversed paragraph sign","Right double quotation mark":"Right double quotation mark","Right single quotation mark":"Right single quotation mark","Right-pointing double angle quotation mark":"Right-pointing double angle quotation mark","rightwards arrow to bar":"rightwards arrow to bar","rightwards dashed arrow":"rightwards dashed arrow","rightwards double arrow":"rightwards double arrow","Ruble sign":"Ruble sign","Rupee sign":"Rupee sign","Section sign":"Section sign","Single left-pointing angle quotation mark":"Single left-pointing angle quotation mark","Single low-9 quotation mark":"Single low-9 quotation mark","Single right-pointing angle quotation mark":"Single right-pointing angle quotation mark","soon with rightwards arrow above":"soon with rightwards arrow above","Special characters":"Special characters","Spesmilo sign":"Spesmilo sign","Square root":"Square root","Tenge sign":"Tenge sign","There exists":"There exists","Tilde operator":"Tilde operator","top with upwards arrow above":"top with upwards arrow above","Trade mark sign":"Trade mark sign","Tugrik sign":"Tugrik sign","Turkish lira sign":"Turkish lira sign","Two dot leader":"Two dot leader",Union:"Union","up down arrow with base":"up down arrow with base","upwards arrow to bar":"upwards arrow to bar","upwards dashed arrow":"upwards dashed arrow","upwards double arrow":"upwards double arrow","Vulgar fraction one half":"Vulgar fraction one half","Vulgar fraction one quarter":"Vulgar fraction one quarter","Vulgar fraction three quarters":"Vulgar fraction three quarters","Won sign":"Won sign","Yen sign":"Yen sign"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.specialCharacters=function(t){var e={};function a(i){if(e[i])return e[i].exports;var r=e[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,a),r.l=!0,r.exports}return a.m=t,a.c=e,a.d=function(t,e,i){a.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},a.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},a.t=function(t,e){if(1&e&&(t=a(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(a.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)a.d(i,r,function(e){return t[e]}.bind(null,r));return i},a.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return a.d(e,"a",e),e},a.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},a.p="",a(a.s=12)}([function(t,e,a){t.exports=a(2)("./src/core.js")},function(t,e,a){t.exports=a(2)("./src/ui.js")},function(t,e){t.exports=CKEditor5.dll},function(t,e,a){t.exports=a(2)("./src/utils.js")},function(t,e,a){"use strict";var i,r=function(){return void 0===i&&(i=Boolean(window&&document&&document.all&&!window.atob)),i},l=function(){var t={};return function(e){if(void 0===t[e]){var a=document.querySelector(e);if(window.HTMLIFrameElement&&a instanceof window.HTMLIFrameElement)try{a=a.contentDocument.head}catch(t){a=null}t[e]=a}return t[e]}}(),c=[];function n(t){for(var e=-1,a=0;a<c.length;a++)if(c[a].identifier===t){e=a;break}return e}function o(t,e){for(var a={},i=[],r=0;r<t.length;r++){var l=t[r],o=e.base?l[0]+e.base:l[0],s=a[o]||0,h="".concat(o," ").concat(s);a[o]=s+1;var u=n(h),w={css:l[1],media:l[2],sourceMap:l[3]};-1!==u?(c[u].references++,c[u].updater(w)):c.push({identifier:h,updater:p(w,e),references:1}),i.push(h)}return i}function s(t){var e=document.createElement("style"),i=t.attributes||{};if(void 0===i.nonce){var r=a.nc;r&&(i.nonce=r)}if(Object.keys(i).forEach((function(t){e.setAttribute(t,i[t])})),"function"==typeof t.insert)t.insert(e);else{var c=l(t.insert||"head");if(!c)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");c.appendChild(e)}return e}var h,u=(h=[],function(t,e){return h[t]=e,h.filter(Boolean).join("\n")});function w(t,e,a,i){var r=a?"":i.media?"@media ".concat(i.media," {").concat(i.css,"}"):i.css;if(t.styleSheet)t.styleSheet.cssText=u(e,r);else{var l=document.createTextNode(r),c=t.childNodes;c[e]&&t.removeChild(c[e]),c.length?t.insertBefore(l,c[e]):t.appendChild(l)}}function d(t,e,a){var i=a.css,r=a.media,l=a.sourceMap;if(r?t.setAttribute("media",r):t.removeAttribute("media"),l&&"undefined"!=typeof btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(l))))," */")),t.styleSheet)t.styleSheet.cssText=i;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(i))}}var g=null,m=0;function p(t,e){var a,i,r;if(e.singleton){var l=m++;a=g||(g=s(e)),i=w.bind(null,a,l,!1),r=w.bind(null,a,l,!0)}else a=s(e),i=d.bind(null,a,e),r=function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(a)};return i(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;i(t=e)}else r()}}t.exports=function(t,e){(e=e||{}).singleton||"boolean"==typeof e.singleton||(e.singleton=r());var a=o(t=t||[],e);return function(t){if(t=t||[],"[object Array]"===Object.prototype.toString.call(t)){for(var i=0;i<a.length;i++){var r=n(a[i]);c[r].references--}for(var l=o(t,e),s=0;s<a.length;s++){var h=n(a[s]);0===c[h].references&&(c[h].updater(),c.splice(h,1))}a=l}}}},function(t,e,a){t.exports=a(2)("./src/typing.js")},function(t,e,a){var i=a(4),r=a(7);"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[t.i,r,""]]);var l={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,l);t.exports=r.locals||{}},function(t,e){t.exports=".ck.ck-character-grid{max-width:100%}.ck.ck-character-grid .ck-character-grid__tiles{display:grid}:root{--ck-character-grid-tile-size:24px}.ck.ck-character-grid{overflow-y:auto;overflow-x:hidden;width:350px;max-height:200px}.ck.ck-character-grid .ck-character-grid__tiles{grid-template-columns:repeat(auto-fit,minmax(var(--ck-character-grid-tile-size),1fr));margin:var(--ck-spacing-standard) var(--ck-spacing-large);grid-gap:var(--ck-spacing-standard)}.ck.ck-character-grid .ck-character-grid__tile{width:var(--ck-character-grid-tile-size);height:var(--ck-character-grid-tile-size);min-width:var(--ck-character-grid-tile-size);min-height:var(--ck-character-grid-tile-size);font-size:1.2em;padding:0;transition:box-shadow .2s ease;border:0}.ck.ck-character-grid .ck-character-grid__tile:focus:not(.ck-disabled),.ck.ck-character-grid .ck-character-grid__tile:hover:not(.ck-disabled){border:0;box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-focus-border)}.ck.ck-character-grid .ck-character-grid__tile .ck-button__label{line-height:var(--ck-character-grid-tile-size);width:100%;text-align:center}"},function(t,e,a){var i=a(4),r=a(9);"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[t.i,r,""]]);var l={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,l);t.exports=r.locals||{}},function(t,e){t.exports=".ck.ck-character-info{display:flex;justify-content:space-between;padding:var(--ck-spacing-small) var(--ck-spacing-large);border-top:1px solid var(--ck-color-base-border)}.ck.ck-character-info>*{text-transform:uppercase;font-size:var(--ck-font-size-small)}.ck.ck-character-info .ck-character-info__name{max-width:280px;text-overflow:ellipsis;overflow:hidden}.ck.ck-character-info .ck-character-info__code{opacity:.6}"},function(t,e,a){var i=a(4),r=a(11);"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[t.i,r,""]]);var l={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,l);t.exports=r.locals||{}},function(t,e){t.exports=".ck.ck-special-characters-navigation>.ck-label{max-width:160px;text-overflow:ellipsis;overflow:hidden}.ck.ck-special-characters-navigation>.ck-dropdown .ck-dropdown__panel{max-height:250px;overflow-y:auto;overflow-x:hidden}"},function(t,e,a){"use strict";a.r(e),a.d(e,"SpecialCharacters",(function(){return u})),a.d(e,"SpecialCharactersArrows",(function(){return w})),a.d(e,"SpecialCharactersText",(function(){return d})),a.d(e,"SpecialCharactersMathematical",(function(){return g})),a.d(e,"SpecialCharactersLatin",(function(){return m})),a.d(e,"SpecialCharactersEssentials",(function(){return L})),a.d(e,"SpecialCharactersCurrency",(function(){return p}));var i=a(0),r=a(5),l=a(1),c=a(3);class n extends l.FormHeaderView{constructor(t,e){super(t);const a=t.t;this.set("class","ck-special-characters-navigation"),this.groupDropdownView=this._createGroupDropdown(e),this.groupDropdownView.panelPosition="rtl"===t.uiLanguageDirection?"se":"sw",this.label=a("Special characters"),this.children.add(this.groupDropdownView)}get currentGroupName(){return this.groupDropdownView.value}_createGroupDropdown(t){const e=this.locale,a=e.t,i=Object(l.createDropdown)(e),r=this._getCharacterGroupListItemDefinitions(i,t);return i.set("value",r.first.model.label),i.buttonView.bind("label").to(i,"value"),i.buttonView.set({isOn:!1,withText:!0,tooltip:a("Character categories"),class:["ck-dropdown__button_label-width_auto"]}),i.on("execute",t=>{i.value=t.source.label}),i.delegate("execute").to(this),Object(l.addListToDropdown)(i,r),i}_getCharacterGroupListItemDefinitions(t,e){const a=new c.Collection;for(const i of e){const e={type:"button",model:new l.Model({label:i,withText:!0})};e.model.bind("isOn").to(t,"value",t=>t===e.model.label),a.add(e)}return a}}a(6);class o extends l.View{constructor(t){super(t),this.tiles=this.createCollection(),this.setTemplate({tag:"div",children:[{tag:"div",attributes:{class:["ck","ck-character-grid__tiles"]},children:this.tiles}],attributes:{class:["ck","ck-character-grid"]}})}createTile(t,e){const a=new l.ButtonView(this.locale);return a.set({label:t,withText:!0,class:"ck-character-grid__tile"}),a.extendTemplate({attributes:{title:e},on:{mouseover:a.bindTemplate.to("mouseover")}}),a.on("mouseover",()=>{this.fire("tileHover",{name:e,character:t})}),a.on("execute",()=>{this.fire("execute",{name:e,character:t})}),a}}a(8);class s extends l.View{constructor(t){super(t);const e=this.bindTemplate;this.set("character",null),this.set("name",null),this.bind("code").to(this,"character",h),this.setTemplate({tag:"div",children:[{tag:"span",attributes:{class:["ck-character-info__name"]},children:[{text:e.to("name",t=>t||"​")}]},{tag:"span",attributes:{class:["ck-character-info__code"]},children:[{text:e.to("code")}]}],attributes:{class:["ck","ck-character-info"]}})}}function h(t){if(null===t)return"";return"U+"+("0000"+t.codePointAt(0).toString(16)).slice(-4)}a(10);class u extends i.Plugin{static get requires(){return[r.Typing]}static get pluginName(){return"SpecialCharacters"}constructor(t){super(t),this._characters=new Map,this._groups=new Map}init(){const t=this.editor,e=t.t,a=t.commands.get("input");t.ui.componentFactory.add("specialCharacters",i=>{const r=Object(l.createDropdown)(i);let c;return r.buttonView.set({label:e("Special characters"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10 2.5a7.47 7.47 0 0 1 4.231 1.31 7.268 7.268 0 0 1 2.703 3.454 7.128 7.128 0 0 1 .199 4.353c-.39 1.436-1.475 2.72-2.633 3.677h2.013c0-.226.092-.443.254-.603a.876.876 0 0 1 1.229 0c.163.16.254.377.254.603v.853c0 .209-.078.41-.22.567a.873.873 0 0 1-.547.28l-.101.006h-4.695a.517.517 0 0 1-.516-.518v-1.265c0-.21.128-.398.317-.489a5.601 5.601 0 0 0 2.492-2.371 5.459 5.459 0 0 0 .552-3.693 5.53 5.53 0 0 0-1.955-3.2A5.71 5.71 0 0 0 10 4.206 5.708 5.708 0 0 0 6.419 5.46 5.527 5.527 0 0 0 4.46 8.663a5.457 5.457 0 0 0 .554 3.695 5.6 5.6 0 0 0 2.497 2.37.55.55 0 0 1 .317.49v1.264c0 .286-.23.518-.516.518H2.618a.877.877 0 0 1-.614-.25.845.845 0 0 1-.254-.603v-.853c0-.226.091-.443.254-.603a.876.876 0 0 1 1.228 0c.163.16.255.377.255.603h1.925c-1.158-.958-2.155-2.241-2.545-3.678a7.128 7.128 0 0 1 .199-4.352 7.268 7.268 0 0 1 2.703-3.455A7.475 7.475 0 0 1 10 2.5z"/></svg>',tooltip:!0}),r.bind("isEnabled").to(a),r.on("execute",(e,a)=>{t.execute("input",{text:a.character}),t.editing.view.focus()}),r.on("change:isOpen",()=>{c||(c=this._createDropdownPanelContent(i,r),r.panelView.children.add(c.navigationView),r.panelView.children.add(c.gridView),r.panelView.children.add(c.infoView)),c.infoView.set({character:null,name:null})}),r})}addItems(t,e){if("All"===t)throw new c.CKEditorError('special-character-invalid-group-name: The name "All" is reserved and cannot be used.');const a=this._getGroup(t);for(const t of e)a.add(t.title),this._characters.set(t.title,t.character)}getGroups(){return this._groups.keys()}getCharactersForGroup(t){return"All"===t?new Set(this._characters.keys()):this._groups.get(t)}getCharacter(t){return this._characters.get(t)}_getGroup(t){return this._groups.has(t)||this._groups.set(t,new Set),this._groups.get(t)}_updateGrid(t,e){e.tiles.clear();const a=this.getCharactersForGroup(t);for(const t of a){const a=this.getCharacter(t);e.tiles.add(e.createTile(a,t))}}_createDropdownPanelContent(t,e){const a=[...this.getGroups()];a.unshift("All");const i=new n(t,a),r=new o(t),l=new s(t);return r.delegate("execute").to(e),r.on("tileHover",(t,e)=>{l.set(e)}),i.on("execute",()=>{this._updateGrid(i.currentGroupName,r)}),this._updateGrid(i.currentGroupName,r),{navigationView:i,gridView:r,infoView:l}}}class w extends i.Plugin{static get pluginName(){return"SpecialCharactersArrows"}init(){const t=this.editor,e=t.t;t.plugins.get("SpecialCharacters").addItems("Arrows",[{title:e("leftwards double arrow"),character:"⇐"},{title:e("rightwards double arrow"),character:"⇒"},{title:e("upwards double arrow"),character:"⇑"},{title:e("downwards double arrow"),character:"⇓"},{title:e("leftwards dashed arrow"),character:"⇠"},{title:e("rightwards dashed arrow"),character:"⇢"},{title:e("upwards dashed arrow"),character:"⇡"},{title:e("downwards dashed arrow"),character:"⇣"},{title:e("leftwards arrow to bar"),character:"⇤"},{title:e("rightwards arrow to bar"),character:"⇥"},{title:e("upwards arrow to bar"),character:"⤒"},{title:e("downwards arrow to bar"),character:"⤓"},{title:e("up down arrow with base"),character:"↨"},{title:e("back with leftwards arrow above"),character:"🔙"},{title:e("end with leftwards arrow above"),character:"🔚"},{title:e("on with exclamation mark with left right arrow above"),character:"🔛"},{title:e("soon with rightwards arrow above"),character:"🔜"},{title:e("top with upwards arrow above"),character:"🔝"}])}}class d extends i.Plugin{static get pluginName(){return"SpecialCharactersText"}init(){const t=this.editor,e=t.t;t.plugins.get("SpecialCharacters").addItems("Text",[{character:"‹",title:e("Single left-pointing angle quotation mark")},{character:"›",title:e("Single right-pointing angle quotation mark")},{character:"«",title:e("Left-pointing double angle quotation mark")},{character:"»",title:e("Right-pointing double angle quotation mark")},{character:"‘",title:e("Left single quotation mark")},{character:"’",title:e("Right single quotation mark")},{character:"“",title:e("Left double quotation mark")},{character:"”",title:e("Right double quotation mark")},{character:"‚",title:e("Single low-9 quotation mark")},{character:"„",title:e("Double low-9 quotation mark")},{character:"¡",title:e("Inverted exclamation mark")},{character:"¿",title:e("Inverted question mark")},{character:"‥",title:e("Two dot leader")},{character:"…",title:e("Horizontal ellipsis")},{character:"‡",title:e("Double dagger")},{character:"‰",title:e("Per mille sign")},{character:"‱",title:e("Per ten thousand sign")},{character:"‼",title:e("Double exclamation mark")},{character:"⁈",title:e("Question exclamation mark")},{character:"⁉",title:e("Exclamation question mark")},{character:"⁇",title:e("Double question mark")},{character:"©",title:e("Copyright sign")},{character:"®",title:e("Registered sign")},{character:"™",title:e("Trade mark sign")},{character:"§",title:e("Section sign")},{character:"¶",title:e("Paragraph sign")},{character:"⁋",title:e("Reversed paragraph sign")}])}}class g extends i.Plugin{static get pluginName(){return"SpecialCharactersMathematical"}init(){const t=this.editor,e=t.t;t.plugins.get("SpecialCharacters").addItems("Mathematical",[{character:"<",title:e("Less-than sign")},{character:">",title:e("Greater-than sign")},{character:"≤",title:e("Less-than or equal to")},{character:"≥",title:e("Greater-than or equal to")},{character:"–",title:e("En dash")},{character:"—",title:e("Em dash")},{character:"¯",title:e("Macron")},{character:"‾",title:e("Overline")},{character:"°",title:e("Degree sign")},{character:"−",title:e("Minus sign")},{character:"±",title:e("Plus-minus sign")},{character:"÷",title:e("Division sign")},{character:"⁄",title:e("Fraction slash")},{character:"×",title:e("Multiplication sign")},{character:"ƒ",title:e("Latin small letter f with hook")},{character:"∫",title:e("Integral")},{character:"∑",title:e("N-ary summation")},{character:"∞",title:e("Infinity")},{character:"√",title:e("Square root")},{character:"∼",title:e("Tilde operator")},{character:"≅",title:e("Approximately equal to")},{character:"≈",title:e("Almost equal to")},{character:"≠",title:e("Not equal to")},{character:"≡",title:e("Identical to")},{character:"∈",title:e("Element of")},{character:"∉",title:e("Not an element of")},{character:"∋",title:e("Contains as member")},{character:"∏",title:e("N-ary product")},{character:"∧",title:e("Logical and")},{character:"∨",title:e("Logical or")},{character:"¬",title:e("Not sign")},{character:"∩",title:e("Intersection")},{character:"∪",title:e("Union")},{character:"∂",title:e("Partial differential")},{character:"∀",title:e("For all")},{character:"∃",title:e("There exists")},{character:"∅",title:e("Empty set")},{character:"∇",title:e("Nabla")},{character:"∗",title:e("Asterisk operator")},{character:"∝",title:e("Proportional to")},{character:"∠",title:e("Angle")},{character:"¼",title:e("Vulgar fraction one quarter")},{character:"½",title:e("Vulgar fraction one half")},{character:"¾",title:e("Vulgar fraction three quarters")}])}}class m extends i.Plugin{static get pluginName(){return"SpecialCharactersLatin"}init(){const t=this.editor,e=t.t;t.plugins.get("SpecialCharacters").addItems("Latin",[{character:"Ā",title:e("Latin capital letter a with macron")},{character:"ā",title:e("Latin small letter a with macron")},{character:"Ă",title:e("Latin capital letter a with breve")},{character:"ă",title:e("Latin small letter a with breve")},{character:"Ą",title:e("Latin capital letter a with ogonek")},{character:"ą",title:e("Latin small letter a with ogonek")},{character:"Ć",title:e("Latin capital letter c with acute")},{character:"ć",title:e("Latin small letter c with acute")},{character:"Ĉ",title:e("Latin capital letter c with circumflex")},{character:"ĉ",title:e("Latin small letter c with circumflex")},{character:"Ċ",title:e("Latin capital letter c with dot above")},{character:"ċ",title:e("Latin small letter c with dot above")},{character:"Č",title:e("Latin capital letter c with caron")},{character:"č",title:e("Latin small letter c with caron")},{character:"Ď",title:e("Latin capital letter d with caron")},{character:"ď",title:e("Latin small letter d with caron")},{character:"Đ",title:e("Latin capital letter d with stroke")},{character:"đ",title:e("Latin small letter d with stroke")},{character:"Ē",title:e("Latin capital letter e with macron")},{character:"ē",title:e("Latin small letter e with macron")},{character:"Ĕ",title:e("Latin capital letter e with breve")},{character:"ĕ",title:e("Latin small letter e with breve")},{character:"Ė",title:e("Latin capital letter e with dot above")},{character:"ė",title:e("Latin small letter e with dot above")},{character:"Ę",title:e("Latin capital letter e with ogonek")},{character:"ę",title:e("Latin small letter e with ogonek")},{character:"Ě",title:e("Latin capital letter e with caron")},{character:"ě",title:e("Latin small letter e with caron")},{character:"Ĝ",title:e("Latin capital letter g with circumflex")},{character:"ĝ",title:e("Latin small letter g with circumflex")},{character:"Ğ",title:e("Latin capital letter g with breve")},{character:"ğ",title:e("Latin small letter g with breve")},{character:"Ġ",title:e("Latin capital letter g with dot above")},{character:"ġ",title:e("Latin small letter g with dot above")},{character:"Ģ",title:e("Latin capital letter g with cedilla")},{character:"ģ",title:e("Latin small letter g with cedilla")},{character:"Ĥ",title:e("Latin capital letter h with circumflex")},{character:"ĥ",title:e("Latin small letter h with circumflex")},{character:"Ħ",title:e("Latin capital letter h with stroke")},{character:"ħ",title:e("Latin small letter h with stroke")},{character:"Ĩ",title:e("Latin capital letter i with tilde")},{character:"ĩ",title:e("Latin small letter i with tilde")},{character:"Ī",title:e("Latin capital letter i with macron")},{character:"ī",title:e("Latin small letter i with macron")},{character:"Ĭ",title:e("Latin capital letter i with breve")},{character:"ĭ",title:e("Latin small letter i with breve")},{character:"Į",title:e("Latin capital letter i with ogonek")},{character:"į",title:e("Latin small letter i with ogonek")},{character:"İ",title:e("Latin capital letter i with dot above")},{character:"ı",title:e("Latin small letter dotless i")},{character:"IJ",title:e("Latin capital ligature ij")},{character:"ij",title:e("Latin small ligature ij")},{character:"Ĵ",title:e("Latin capital letter j with circumflex")},{character:"ĵ",title:e("Latin small letter j with circumflex")},{character:"Ķ",title:e("Latin capital letter k with cedilla")},{character:"ķ",title:e("Latin small letter k with cedilla")},{character:"ĸ",title:e("Latin small letter kra")},{character:"Ĺ",title:e("Latin capital letter l with acute")},{character:"ĺ",title:e("Latin small letter l with acute")},{character:"Ļ",title:e("Latin capital letter l with cedilla")},{character:"ļ",title:e("Latin small letter l with cedilla")},{character:"Ľ",title:e("Latin capital letter l with caron")},{character:"ľ",title:e("Latin small letter l with caron")},{character:"Ŀ",title:e("Latin capital letter l with middle dot")},{character:"ŀ",title:e("Latin small letter l with middle dot")},{character:"Ł",title:e("Latin capital letter l with stroke")},{character:"ł",title:e("Latin small letter l with stroke")},{character:"Ń",title:e("Latin capital letter n with acute")},{character:"ń",title:e("Latin small letter n with acute")},{character:"Ņ",title:e("Latin capital letter n with cedilla")},{character:"ņ",title:e("Latin small letter n with cedilla")},{character:"Ň",title:e("Latin capital letter n with caron")},{character:"ň",title:e("Latin small letter n with caron")},{character:"ʼn",title:e("Latin small letter n preceded by apostrophe")},{character:"Ŋ",title:e("Latin capital letter eng")},{character:"ŋ",title:e("Latin small letter eng")},{character:"Ō",title:e("Latin capital letter o with macron")},{character:"ō",title:e("Latin small letter o with macron")},{character:"Ŏ",title:e("Latin capital letter o with breve")},{character:"ŏ",title:e("Latin small letter o with breve")},{character:"Ő",title:e("Latin capital letter o with double acute")},{character:"ő",title:e("Latin small letter o with double acute")},{character:"Œ",title:e("Latin capital ligature oe")},{character:"œ",title:e("Latin small ligature oe")},{character:"Ŕ",title:e("Latin capital letter r with acute")},{character:"ŕ",title:e("Latin small letter r with acute")},{character:"Ŗ",title:e("Latin capital letter r with cedilla")},{character:"ŗ",title:e("Latin small letter r with cedilla")},{character:"Ř",title:e("Latin capital letter r with caron")},{character:"ř",title:e("Latin small letter r with caron")},{character:"Ś",title:e("Latin capital letter s with acute")},{character:"ś",title:e("Latin small letter s with acute")},{character:"Ŝ",title:e("Latin capital letter s with circumflex")},{character:"ŝ",title:e("Latin small letter s with circumflex")},{character:"Ş",title:e("Latin capital letter s with cedilla")},{character:"ş",title:e("Latin small letter s with cedilla")},{character:"Š",title:e("Latin capital letter s with caron")},{character:"š",title:e("Latin small letter s with caron")},{character:"Ţ",title:e("Latin capital letter t with cedilla")},{character:"ţ",title:e("Latin small letter t with cedilla")},{character:"Ť",title:e("Latin capital letter t with caron")},{character:"ť",title:e("Latin small letter t with caron")},{character:"Ŧ",title:e("Latin capital letter t with stroke")},{character:"ŧ",title:e("Latin small letter t with stroke")},{character:"Ũ",title:e("Latin capital letter u with tilde")},{character:"ũ",title:e("Latin small letter u with tilde")},{character:"Ū",title:e("Latin capital letter u with macron")},{character:"ū",title:e("Latin small letter u with macron")},{character:"Ŭ",title:e("Latin capital letter u with breve")},{character:"ŭ",title:e("Latin small letter u with breve")},{character:"Ů",title:e("Latin capital letter u with ring above")},{character:"ů",title:e("Latin small letter u with ring above")},{character:"Ű",title:e("Latin capital letter u with double acute")},{character:"ű",title:e("Latin small letter u with double acute")},{character:"Ų",title:e("Latin capital letter u with ogonek")},{character:"ų",title:e("Latin small letter u with ogonek")},{character:"Ŵ",title:e("Latin capital letter w with circumflex")},{character:"ŵ",title:e("Latin small letter w with circumflex")},{character:"Ŷ",title:e("Latin capital letter y with circumflex")},{character:"ŷ",title:e("Latin small letter y with circumflex")},{character:"Ÿ",title:e("Latin capital letter y with diaeresis")},{character:"Ź",title:e("Latin capital letter z with acute")},{character:"ź",title:e("Latin small letter z with acute")},{character:"Ż",title:e("Latin capital letter z with dot above")},{character:"ż",title:e("Latin small letter z with dot above")},{character:"Ž",title:e("Latin capital letter z with caron")},{character:"ž",title:e("Latin small letter z with caron")},{character:"ſ",title:e("Latin small letter long s")}])}}class p extends i.Plugin{static get pluginName(){return"SpecialCharactersCurrency"}init(){const t=this.editor,e=t.t;t.plugins.get("SpecialCharacters").addItems("Currency",[{character:"$",title:e("Dollar sign")},{character:"€",title:e("Euro sign")},{character:"¥",title:e("Yen sign")},{character:"£",title:e("Pound sign")},{character:"¢",title:e("Cent sign")},{character:"₠",title:e("Euro-currency sign")},{character:"₡",title:e("Colon sign")},{character:"₢",title:e("Cruzeiro sign")},{character:"₣",title:e("French franc sign")},{character:"₤",title:e("Lira sign")},{character:"¤",title:e("Currency sign")},{character:"₿",title:e("Bitcoin sign")},{character:"₥",title:e("Mill sign")},{character:"₦",title:e("Naira sign")},{character:"₧",title:e("Peseta sign")},{character:"₨",title:e("Rupee sign")},{character:"₩",title:e("Won sign")},{character:"₪",title:e("New sheqel sign")},{character:"₫",title:e("Dong sign")},{character:"₭",title:e("Kip sign")},{character:"₮",title:e("Tugrik sign")},{character:"₯",title:e("Drachma sign")},{character:"₰",title:e("German penny sign")},{character:"₱",title:e("Peso sign")},{character:"₲",title:e("Guarani sign")},{character:"₳",title:e("Austral sign")},{character:"₴",title:e("Hryvnia sign")},{character:"₵",title:e("Cedi sign")},{character:"₶",title:e("Livre tournois sign")},{character:"₷",title:e("Spesmilo sign")},{character:"₸",title:e("Tenge sign")},{character:"₹",title:e("Indian rupee sign")},{character:"₺",title:e("Turkish lira sign")},{character:"₻",title:e("Nordic mark sign")},{character:"₼",title:e("Manat sign")},{character:"₽",title:e("Ruble sign")}])}}class L extends i.Plugin{static get requires(){return[p,d,g,w,m]}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/table.js b/core/assets/vendor/ckeditor5/table.js
new file mode 100644
index 0000000000000000000000000000000000000000..32fff31f0b244f5caa1f59558eb8fdacf4773136
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/table.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",Background:"Background",Border:"Border","Cell properties":"Cell properties","Center table":"Center table",Color:"Color","Color picker":"Color picker",Column:"Column",Dashed:"Dashed","Delete column":"Delete column","Delete row":"Delete row",Dimensions:"Dimensions",Dotted:"Dotted",Double:"Double","Enter table caption":"Enter table caption",Groove:"Groove","Header column":"Header column","Header row":"Header row",Height:"Height","Horizontal text alignment toolbar":"Horizontal text alignment toolbar","Insert column left":"Insert column left","Insert column right":"Insert column right","Insert row above":"Insert row above","Insert row below":"Insert row below","Insert table":"Insert table",Inset:"Inset","Justify cell text":"Justify cell text","Merge cell down":"Merge cell down","Merge cell left":"Merge cell left","Merge cell right":"Merge cell right","Merge cell up":"Merge cell up","Merge cells":"Merge cells",None:"None",Outset:"Outset",Padding:"Padding",Ridge:"Ridge",Row:"Row","Select column":"Select column","Select row":"Select row",Solid:"Solid","Split cell horizontally":"Split cell horizontally","Split cell vertically":"Split cell vertically",Style:"Style","Table alignment toolbar":"Table alignment toolbar","Table cell text alignment":"Table cell text alignment","Table properties":"Table properties","Table toolbar":"Table toolbar",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'The value is invalid. Try "10px" or "2em" or simply "2".',"Toggle caption off":"Toggle caption off","Toggle caption on":"Toggle caption on","Vertical text alignment toolbar":"Vertical text alignment toolbar",Width:"Width"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.table=function(e){var t={};function o(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,o),i.l=!0,i.exports}return o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)o.d(n,i,function(t){return e[t]}.bind(null,i));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=32)}([function(e,t,o){e.exports=o(6)("./src/ui.js")},function(e,t,o){e.exports=o(6)("./src/core.js")},function(e,t,o){e.exports=o(6)("./src/utils.js")},function(e,t,o){e.exports=o(6)("./src/engine.js")},function(e,t,o){e.exports=o(6)("./src/widget.js")},function(e,t,o){"use strict";var n,i=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},r=function(){var e={};return function(t){if(void 0===e[t]){var o=document.querySelector(t);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(e){o=null}e[t]=o}return e[t]}}(),l=[];function s(e){for(var t=-1,o=0;o<l.length;o++)if(l[o].identifier===e){t=o;break}return t}function a(e,t){for(var o={},n=[],i=0;i<e.length;i++){var r=e[i],a=t.base?r[0]+t.base:r[0],c=o[a]||0,d="".concat(a," ").concat(c);o[a]=c+1;var u=s(d),h={css:r[1],media:r[2],sourceMap:r[3]};-1!==u?(l[u].references++,l[u].updater(h)):l.push({identifier:d,updater:p(h,t),references:1}),n.push(d)}return n}function c(e){var t=document.createElement("style"),n=e.attributes||{};if(void 0===n.nonce){var i=o.nc;i&&(n.nonce=i)}if(Object.keys(n).forEach((function(e){t.setAttribute(e,n[e])})),"function"==typeof e.insert)e.insert(t);else{var l=r(e.insert||"head");if(!l)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");l.appendChild(t)}return t}var d,u=(d=[],function(e,t){return d[e]=t,d.filter(Boolean).join("\n")});function h(e,t,o,n){var i=o?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(e.styleSheet)e.styleSheet.cssText=u(t,i);else{var r=document.createTextNode(i),l=e.childNodes;l[t]&&e.removeChild(l[t]),l.length?e.insertBefore(r,l[t]):e.appendChild(r)}}function b(e,t,o){var n=o.css,i=o.media,r=o.sourceMap;if(i?e.setAttribute("media",i):e.removeAttribute("media"),r&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}var m=null,g=0;function p(e,t){var o,n,i;if(t.singleton){var r=g++;o=m||(m=c(t)),n=h.bind(null,o,r,!1),i=h.bind(null,o,r,!0)}else o=c(t),n=b.bind(null,o,t),i=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(o)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else i()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=i());var o=a(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var n=0;n<o.length;n++){var i=s(o[n]);l[i].references--}for(var r=a(e,t),c=0;c<o.length;c++){var d=s(o[c]);0===l[d].references&&(l[d].updater(),l.splice(d,1))}o=r}}}},function(e,t){e.exports=CKEditor5.dll},,function(e,t,o){var n=o(5),i=o(23);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t,o){var n=o(5),i=o(24);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t,o){"use strict";(function(e){var o="object"==typeof e&&e&&e.Object===Object&&e;t.a=o}).call(this,o(27))},function(e,t,o){var n=o(5),i=o(12);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=":root{--ck-color-table-focused-cell-background:rgba(158,207,250,0.3)}.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table td.ck-editor__nested-editable:focus,.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table th.ck-editor__nested-editable:focus{background:var(--ck-color-table-focused-cell-background);border-style:none;outline:1px solid var(--ck-color-focus-border);outline-offset:-1px}"},function(e,t,o){var n=o(5),i=o(14);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.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(e,t,o){var n=o(5),i=o(16);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=':root{--ck-table-selected-cell-background:rgba(158,207,250,0.3)}.ck.ck-editor__editable .table table td.ck-editor__editable_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected{position:relative;caret-color:transparent;outline:unset;box-shadow:unset}.ck.ck-editor__editable .table table td.ck-editor__editable_selected:after,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:after{content:"";pointer-events:none;background-color:var(--ck-table-selected-cell-background);position:absolute;top:0;left:0;right:0;bottom:0}.ck.ck-editor__editable .table table td.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table td.ck-editor__editable_selected:focus,.ck.ck-editor__editable .table table th.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:focus{background-color:transparent}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget{outline:unset}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle{display:none}'},function(e,t,o){var n=o(5),i=o(18);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=".ck-content .table{margin:.9em 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:1px solid #bfbfbf}.ck-content .table table th{font-weight:700;background:hsla(0,0%,0%,5%)}.ck-content[dir=rtl] .table th{text-align:right}.ck-content[dir=ltr] .table th{text-align:left}.ck-editor__editable .ck-table-bogus-paragraph{display:inline-block;width:100%}"},function(e,t,o){var n=o(5),i=o(20);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=".ck.ck-input-color{width:100%;display:flex;flex-direction:row-reverse}.ck.ck-input-color>input.ck.ck-input-text{min-width:auto;flex-grow:1}.ck.ck-input-color>div.ck.ck-dropdown{min-width:auto}.ck.ck-input-color>div.ck.ck-dropdown>.ck-input-color__button .ck-dropdown__arrow{display:none}.ck.ck-input-color .ck.ck-input-color__button{display:flex}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview{position:relative;overflow:hidden}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{position:absolute;display:block}[dir=ltr] .ck.ck-input-color>.ck.ck-input-text{border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-input-text{border-top-left-radius:0;border-bottom-left-radius:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{padding:0}[dir=ltr] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-left-width:0;border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-right-width:0;border-top-right-radius:0;border-bottom-right-radius:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button.ck-disabled{background:var(--ck-color-input-disabled-background)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{border-radius:0}.ck-rounded-corners .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview,.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{width:20px;height:20px;border:1px solid var(--ck-color-input-border)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{top:-30%;left:50%;height:150%;width:8%;background:red;border-radius:2px;transform:rotate(45deg);transform-origin:50%}.ck.ck-input-color .ck.ck-input-color__remove-color{width:100%;border-bottom:1px solid var(--ck-color-input-border);padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard);border-bottom-left-radius:0;border-bottom-right-radius:0}[dir=ltr] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-right-radius:0}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-left-radius:0}.ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-right:0;margin-left:var(--ck-spacing-standard)}"},function(e,t,o){var n=o(5),i=o(22);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=".ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-table-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-table-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row{padding:var(--ck-spacing-standard) var(--ck-spacing-large) 0}[dir=ltr] .ck.ck-form__row>:not(.ck-label)+*{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-form__row>:not(.ck-label)+*{margin-right:var(--ck-spacing-large)}.ck.ck-form__row>.ck-label{width:100%;min-width:100%}.ck.ck-form__row.ck-table-form__action-row{margin-top:var(--ck-spacing-large)}.ck.ck-form__row.ck-table-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}"},function(e,t){e.exports=".ck.ck-form{padding:0 0 var(--ck-spacing-large)}.ck.ck-form:focus{outline:none}.ck.ck-form .ck.ck-input-text{min-width:100%;width:0}.ck.ck-form .ck.ck-dropdown{min-width:100%}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button:not(:focus){border:1px solid var(--ck-color-base-border)}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button .ck-button__label{width:100%}"},function(e,t){e.exports='.ck.ck-table-form .ck-form__row.ck-table-form__background-row,.ck.ck-table-form .ck-form__row.ck-table-form__border-row{flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{flex-wrap:wrap;align-items:center}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view{display:flex;flex-direction:column-reverse;align-items:center}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view .ck.ck-dropdown,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{flex-grow:0}.ck.ck-table-form .ck.ck-labeled-field-view{position:relative}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{position:absolute;left:50%;bottom:calc(var(--ck-table-properties-error-arrow-size)*-1);transform:translate(-50%,100%);z-index:1}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{content:"";position:absolute;top:calc(var(--ck-table-properties-error-arrow-size)*-1);left:50%;transform:translateX(-50%)}:root{--ck-table-properties-error-arrow-size:6px;--ck-table-properties-min-error-width:150px}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-labeled-field-view>.ck-label{font-size:var(--ck-font-size-tiny);text-align:center}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-style,.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-width{width:80px;min-width:80px;max-width:80px}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{padding:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__height,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__width{margin:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{align-self:flex-end;display:inline-block;height:var(--ck-ui-component-min-height);line-height:var(--ck-ui-component-min-height);margin:0 var(--ck-spacing-small)}.ck.ck-table-form .ck.ck-labeled-field-view{padding-top:var(--ck-spacing-standard)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{border-radius:0}.ck-rounded-corners .ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status,.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{background:var(--ck-color-base-error);color:var(--ck-color-base-background);padding:var(--ck-spacing-small) var(--ck-spacing-medium);min-width:var(--ck-table-properties-min-error-width);text-align:center}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{border-left:var(--ck-table-properties-error-arrow-size) solid transparent;border-bottom:var(--ck-table-properties-error-arrow-size) solid var(--ck-color-base-error);border-right:var(--ck-table-properties-error-arrow-size) solid transparent;border-top:0 solid transparent}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{animation:ck-table-form-labeled-view-status-appear .15s ease both}.ck.ck-table-form .ck.ck-labeled-field-view .ck-input.ck-error:not(:focus)+.ck.ck-labeled-field-view__status{display:none}@keyframes ck-table-form-labeled-view-status-appear{0%{opacity:0}to{opacity:1}}'},function(e,t,o){var n=o(5),i=o(26);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=".ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row{flex-wrap:wrap}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar:first-of-type{flex-grow:0.57}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar:last-of-type{flex-grow:0.43}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar .ck-button{flex-grow:1}.ck.ck-table-cell-properties-form{width:320px}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__padding-row{align-self:flex-end;padding:0;width:25%}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}"},function(e,t){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(e){"object"==typeof window&&(o=window)}e.exports=o},function(e,t,o){var n=o(5),i=o(29);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=".ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{flex-wrap:wrap;flex-basis:0;align-content:baseline}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items{flex-wrap:nowrap}.ck.ck-table-properties-form{width:320px}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{align-self:flex-end;padding:0}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items>*{width:40px}"},function(e,t,o){var n=o(5),i=o(31);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=":root{--ck-color-table-caption-background:#f7f7f7;--ck-color-table-caption-text:#333;--ck-color-table-caption-highlighted-background:#fd0}.ck-content .table>figcaption{display:table-caption;caption-side:top;word-break:break-word;text-align:center;color:var(--ck-color-table-caption-text);background-color:var(--ck-color-table-caption-background);padding:.6em;font-size:.75em;outline-offset:-1px}.ck.ck-editor__editable .table>figcaption.table__caption_highlighted{animation:ck-table-caption-highlight .6s ease-out}.ck.ck-editor__editable .table>figcaption.ck-placeholder:before{padding-left:inherit;padding-right:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@keyframes ck-table-caption-highlight{0%{background-color:var(--ck-color-table-caption-highlighted-background)}to{background-color:var(--ck-color-table-caption-background)}}"},function(e,t,o){"use strict";o.r(t),o.d(t,"Table",(function(){return He})),o.d(t,"TableEditing",(function(){return ye})),o.d(t,"TableUI",(function(){return Se})),o.d(t,"TableToolbar",(function(){return Ue})),o.d(t,"TableCellProperties",(function(){return go})),o.d(t,"TableCellPropertiesEditing",(function(){return bo})),o.d(t,"TableCellPropertiesUI",(function(){return Gt})),o.d(t,"TableProperties",(function(){return Bo})),o.d(t,"TablePropertiesEditing",(function(){return Ao})),o.d(t,"TablePropertiesUI",(function(){return Eo})),o.d(t,"TableCaption",(function(){return Wo})),o.d(t,"TableCaptionEditing",(function(){return Ho})),o.d(t,"TableCaptionUI",(function(){return Do})),o.d(t,"TableClipboard",(function(){return Pe})),o.d(t,"TableMouse",(function(){return Me})),o.d(t,"TableKeyboard",(function(){return Le})),o.d(t,"TableSelection",(function(){return Ie})),o.d(t,"TableUtils",(function(){return te}));var n=o(1),i=o(4);function r(e,t,o,n,i=1){t>i?n.setAttribute(e,t,o):n.removeAttribute(e,o)}function l(e,t,o={}){const n=e.createElement("tableCell",o);return e.insertElement("paragraph",n),e.insert(n,t),n}function s(e,t){const o=t.parent.parent,n=parseInt(o.getAttribute("headingColumns")||0),{column:i}=e.getCellLocation(t);return!!n&&i<n}var a=o(2);function c(){return e=>{e.on("element:table",(e,t,o)=>{const n=t.viewItem;if(!o.consumable.test(n,{name:!0}))return;const{rows:i,headingRows:r,headingColumns:s}=function(e){const t={headingRows:0,headingColumns:0},o=[],n=[];let i;for(const r of Array.from(e.getChildren()))if("tbody"===r.name||"thead"===r.name||"tfoot"===r.name){"thead"!==r.name||i||(i=r);const e=Array.from(r.getChildren()).filter(e=>e.is("element","tr"));for(const r of e)if("thead"===r.parent.name&&r.parent===i)t.headingRows++,o.push(r);else{n.push(r);const e=u(r);e>t.headingColumns&&(t.headingColumns=e)}}return t.rows=[...o,...n],t}(n),a={};s&&(a.headingColumns=s),r&&(a.headingRows=r);const c=o.writer.createElement("table",a);if(o.safeInsert(c,t.modelCursor)){if(o.consumable.consume(n,{name:!0}),i.forEach(e=>o.convertItem(e,o.writer.createPositionAt(c,"end"))),o.convertChildren(n,o.writer.createPositionAt(c,"end")),c.isEmpty){const e=o.writer.createElement("tableRow");o.writer.insert(e,o.writer.createPositionAt(c,"end")),l(o.writer,o.writer.createPositionAt(e,"end"))}o.updateConversionResult(c,t)}})}}function d(e){return t=>{t.on("element:"+e,(e,t,o)=>{if(t.modelRange&&t.viewItem.isEmpty){const e=t.modelRange.start.nodeAfter,n=o.writer.createPositionAt(e,0);o.writer.insertElement("paragraph",n)}},{priority:"low"})}}function u(e){let t=0,o=0;const n=Array.from(e.getChildren()).filter(e=>"th"===e.name||"td"===e.name);for(;o<n.length&&"th"===n[o].name;){const e=n[o];t+=parseInt(e.getAttribute("colspan")||1),o++}return t}class h{constructor(e,t={}){this._table=e,this._startRow=void 0!==t.row?t.row:t.startRow||0,this._endRow=void 0!==t.row?t.row:t.endRow,this._startColumn=void 0!==t.column?t.column:t.startColumn||0,this._endColumn=void 0!==t.column?t.column:t.endColumn,this._includeAllSlots=!!t.includeAllSlots,this._skipRows=new Set,this._row=0,this._rowIndex=0,this._column=0,this._cellIndex=0,this._spannedCells=new Map,this._nextCellAtColumn=-1}[Symbol.iterator](){return this}next(){const e=this._table.getChild(this._rowIndex);if(!e||this._isOverEndRow())return{done:!0};if(!e.is("element","tableRow"))return this._rowIndex++,this.next();if(this._isOverEndColumn())return this._advanceToNextRow();let t=null;const o=this._getSpanned();if(o)this._includeAllSlots&&!this._shouldSkipSlot()&&(t=this._formatOutValue(o.cell,o.row,o.column));else{const o=e.getChild(this._cellIndex);if(!o)return this._advanceToNextRow();const n=parseInt(o.getAttribute("colspan")||1),i=parseInt(o.getAttribute("rowspan")||1);(n>1||i>1)&&this._recordSpans(o,i,n),this._shouldSkipSlot()||(t=this._formatOutValue(o)),this._nextCellAtColumn=this._column+n}return this._column++,this._column==this._nextCellAtColumn&&this._cellIndex++,t||this.next()}skipRow(e){this._skipRows.add(e)}_advanceToNextRow(){return this._row++,this._rowIndex++,this._column=0,this._cellIndex=0,this._nextCellAtColumn=-1,this.next()}_isOverEndRow(){return void 0!==this._endRow&&this._row>this._endRow}_isOverEndColumn(){return void 0!==this._endColumn&&this._column>this._endColumn}_formatOutValue(e,t=this._row,o=this._column){return{done:!1,value:new b(this,e,t,o)}}_shouldSkipSlot(){const e=this._skipRows.has(this._row),t=this._row<this._startRow,o=this._column<this._startColumn,n=void 0!==this._endColumn&&this._column>this._endColumn;return e||t||o||n}_getSpanned(){const e=this._spannedCells.get(this._row);return e&&e.get(this._column)||null}_recordSpans(e,t,o){const n={cell:e,row:this._row,column:this._column};for(let e=this._row;e<this._row+t;e++)for(let t=this._column;t<this._column+o;t++)e==this._row&&t==this._column||this._markSpannedCell(e,t,n)}_markSpannedCell(e,t,o){this._spannedCells.has(e)||this._spannedCells.set(e,new Map);this._spannedCells.get(e).set(t,o)}}class b{constructor(e,t,o,n){this.cell=t,this.row=e._row,this.column=e._column,this.cellAnchorRow=o,this.cellAnchorColumn=n,this._cellIndex=e._cellIndex,this._rowIndex=e._rowIndex,this._table=e._table}get isAnchor(){return this.row===this.cellAnchorRow&&this.column===this.cellAnchorColumn}get cellWidth(){return parseInt(this.cell.getAttribute("colspan")||1)}get cellHeight(){return parseInt(this.cell.getAttribute("rowspan")||1)}get rowIndex(){return this._rowIndex}getPositionBefore(){return this._table.root.document.model.createPositionAt(this._table.getChild(this.row),this._cellIndex)}}function m(e={}){return t=>t.on("insert:table",(t,o,n)=>{const r=o.item;if(!n.consumable.consume(r,"insert"))return;n.consumable.consume(r,"attribute:headingRows:table"),n.consumable.consume(r,"attribute:headingColumns:table");const l=e&&e.asWidget,s=n.writer.createContainerElement("figure",{class:"table"}),a=n.writer.createContainerElement("table");let c;var d,u;n.writer.insert(n.writer.createPositionAt(s,0),a),l&&(d=s,(u=n.writer).setCustomProperty("table",!0,d),c=Object(i.toWidget)(d,u,{hasSelectionHandle:!0}));const b=new h(r),m={headingRows:r.getAttribute("headingRows")||0,headingColumns:r.getAttribute("headingColumns")||0},g=new Map;for(const t of b){const{row:o,cell:i}=t,l=r.getChild(o),s=g.get(o)||_(a,l,o,m,n);g.set(o,s),n.consumable.consume(i,"insert");w(t,m,n.writer.createPositionAt(s,"end"),n,e)}for(const e of r.getChildren()){const t=e.index;e.is("element","tableRow")&&!g.has(t)&&g.set(t,_(a,e,t,m,n))}const p=n.mapper.toViewPosition(o.range.start);n.mapper.bindElements(r,l?c:s),n.writer.insert(p,l?c:s)})}function g(e,t){const{writer:o}=t;if(e.parent.is("element","tableCell"))return p(e)?o.createContainerElement("span",{class:"ck-table-bogus-paragraph"}):o.createContainerElement("p")}function p(e){return 1===e.parent.childCount&&!y(e)}function f(e,t,o){const{cell:n}=e,r=k(e,t),l=o.mapper.toViewElement(n);l&&l.name!==r&&function(e,t,o){const n=o.writer,r=o.mapper.toViewElement(e),l=n.createEditableElement(t,r.getAttributes()),s=Object(i.toWidgetEditable)(l,n);n.insert(n.createPositionAfter(r),s),n.move(n.createRangeIn(r),n.createPositionAt(s,0)),n.remove(n.createRangeOn(r)),o.mapper.unbindViewElement(r),o.mapper.bindElements(e,s)}(n,r,o)}function w(e,t,o,n,r){const l=r&&r.asWidget,s=k(e,t),a=l?Object(i.toWidgetEditable)(n.writer.createEditableElement(s),n.writer):n.writer.createContainerElement(s),c=e.cell,d=c.getChild(0),u=1===c.childCount&&"paragraph"===d.name;if(n.writer.insert(o,a),n.mapper.bindElements(c,a),!l&&u&&!y(d)){const e=c.getChild(0);n.consumable.consume(e,"insert"),n.mapper.bindElements(e,a)}}function _(e,t,o,n,i){i.consumable.consume(t,"insert");const r=t.isEmpty?i.writer.createEmptyElement("tr"):i.writer.createContainerElement("tr");i.mapper.bindElements(t,r);const l=n.headingRows,s=function(e,t,o){const n=v(e,t);return n||function(e,t,o){const n=o.writer.createContainerElement(e),i=o.writer.createPositionAt(t,"tbody"==e?"end":0);return o.writer.insert(i,n),n}(e,t,o)}(function(e,t){return e<t.headingRows?"thead":"tbody"}(o,n),e,i),a=l>0&&o>=l?o-l:o,c=i.writer.createPositionAt(s,a);return i.writer.insert(c,r),r}function k(e,t){const{row:o,column:n}=e,{headingColumns:i,headingRows:r}=t;if(r&&r>o)return"th";return i&&i>n?"th":"td"}function v(e,t){for(const o of t.getChildren())if(o.name==e)return o}function C(e,t,o){const n=v(e,t);n&&0===n.childCount&&o.writer.remove(o.writer.createRangeOn(n))}function y(e){return!![...e.getAttributeKeys()].length}class T extends n.Command{refresh(){const e=this.editor.model,t=e.document.selection,o=e.schema;this.isEnabled=function(e,t){const o=e.getFirstPosition().parent,n=o===o.root?o:o.parent;return t.checkChild(n,"table")}(t,o)}execute(e={}){const t=this.editor.model,o=t.document.selection,n=this.editor.plugins.get("TableUtils"),r=this.editor.config.get("table"),l=Object(i.findOptimalInsertionRange)(o,t),s=r.defaultHeadings.rows,a=r.defaultHeadings.columns;void 0===e.headingRows&&s&&(e.headingRows=s),void 0===e.headingColumns&&a&&(e.headingColumns=a),t.change(o=>{const i=n.createTable(o,e);t.insertContent(i,l),o.setSelection(o.createPositionAt(i.getNodeByPath([0,0,0]),0))})}}function x(e){const t=[];for(const o of P(e.getRanges())){const e=o.getContainedElement();e&&e.is("element","tableCell")&&t.push(e)}return t}function A(e){const t=[];for(const o of e.getRanges()){const e=o.start.findAncestor("tableCell");e&&t.push(e)}return t}function V(e){const t=x(e);return t.length?t:A(e)}function S(e){return E(e.map(e=>e.parent.index))}function R(e){const t=e[0].findAncestor("table");return E([...new h(t)].filter(t=>e.includes(t.cell)).map(e=>e.column))}function I(e,t){if(e.length<2||!function(e){const t=e[0].findAncestor("table"),o=S(e),n=parseInt(t.getAttribute("headingRows")||0);if(!O(o,n))return!1;const i=parseInt(t.getAttribute("headingColumns")||0);return O(R(e),i)}(e))return!1;const o=new Set,n=new Set;let i=0;for(const r of e){const{row:e,column:l}=t.getCellLocation(r),s=parseInt(r.getAttribute("rowspan")||1),a=parseInt(r.getAttribute("colspan")||1);o.add(e),n.add(l),s>1&&o.add(e+s-1),a>1&&n.add(l+a-1),i+=s*a}return function(e,t){const o=Array.from(e.values()),n=Array.from(t.values()),i=Math.max(...o),r=Math.min(...o),l=Math.max(...n),s=Math.min(...n);return(i-r+1)*(l-s+1)}(o,n)==i}function P(e){return Array.from(e).sort(B)}function E(e){const t=e.sort((e,t)=>e-t);return{first:t[0],last:t[t.length-1]}}function B(e,t){const o=e.start,n=t.start;return o.isBefore(n)?-1:1}function O({first:e,last:t},o){return e<o===t<o}class L extends n.Command{constructor(e,t={}){super(e),this.order=t.order||"below"}refresh(){const e=!!V(this.editor.model.document.selection).length;this.isEnabled=e}execute(){const e=this.editor,t=e.model.document.selection,o=e.plugins.get("TableUtils"),n="above"===this.order,i=V(t),r=S(i),l=n?r.first:r.last,s=i[0].findAncestor("table");o.insertRows(s,{at:n?l:l+1,copyStructureFromAbove:!n})}}class N extends n.Command{constructor(e,t={}){super(e),this.order=t.order||"right"}refresh(){const e=!!V(this.editor.model.document.selection).length;this.isEnabled=e}execute(){const e=this.editor,t=e.model.document.selection,o=e.plugins.get("TableUtils"),n="left"===this.order,i=V(t),r=R(i),l=n?r.first:r.last,s=i[0].findAncestor("table");o.insertColumns(s,{columns:1,at:n?l:l+1})}}class z extends n.Command{constructor(e,t={}){super(e),this.direction=t.direction||"horizontally"}refresh(){const e=V(this.editor.model.document.selection);this.isEnabled=1===e.length}execute(){const e=V(this.editor.model.document.selection)[0],t="horizontally"===this.direction,o=this.editor.plugins.get("TableUtils");t?o.splitCellHorizontally(e,2):o.splitCellVertically(e,2)}}function M(e,t,o){const{startRow:n,startColumn:i,endRow:s,endColumn:a}=t,c=o.createElement("table"),d=s-n+1;for(let e=0;e<d;e++)o.insertElement("tableRow",c,"end");const u=[...new h(e,{startRow:n,endRow:s,startColumn:i,endColumn:a,includeAllSlots:!0})];for(const{row:e,column:t,cell:r,isAnchor:d,cellAnchorRow:h,cellAnchorColumn:b}of u){const u=e-n,m=c.getChild(u);if(d){const n=o.cloneElement(r);o.append(n,m),j(n,e,t,s,a,o)}else(h<n||b<i)&&l(o,o.createPositionAt(m,"end"))}return function(e,t,o,n,i){const l=parseInt(t.getAttribute("headingRows")||0);if(l>0){r("headingRows",l-o,e,i,0)}const s=parseInt(t.getAttribute("headingColumns")||0);if(s>0){r("headingColumns",s-n,e,i,0)}}(c,e,n,i,o),c}function F(e,t,o=0){const n=[],i=new h(e,{startRow:o,endRow:t-1});for(const e of i){const{row:o,cellHeight:i}=e,r=o+i-1;o<t&&t<=r&&n.push(e)}return n}function H(e,t,o){const n=e.parent,i=n.parent,s=n.index,a=t-s,c={},d=parseInt(e.getAttribute("rowspan"))-a;d>1&&(c.rowspan=d);const u=parseInt(e.getAttribute("colspan")||1);u>1&&(c.colspan=u);const b=s+a,m=[...new h(i,{startRow:s,endRow:b,includeAllSlots:!0})];let g,p=null;for(const t of m){const{row:n,column:i,cell:r}=t;r===e&&void 0===g&&(g=i),void 0!==g&&g===i&&n===b&&(p=l(o,t.getPositionBefore(),c))}return r("rowspan",a,e,o),p}function D(e,t){const o=[],n=new h(e);for(const e of n){const{column:n,cellWidth:i}=e,r=n+i-1;n<t&&t<=r&&o.push(e)}return o}function W(e,t,o,n){const i=o-t,s={},a=parseInt(e.getAttribute("colspan"))-i;a>1&&(s.colspan=a);const c=parseInt(e.getAttribute("rowspan")||1);c>1&&(s.rowspan=c);const d=l(n,n.createPositionAfter(e),s);return r("colspan",i,e,n),d}function j(e,t,o,n,i,l){const s=parseInt(e.getAttribute("colspan")||1),a=parseInt(e.getAttribute("rowspan")||1);if(o+s-1>i){r("colspan",i-o+1,e,l,1)}if(t+a-1>n){r("rowspan",n-t+1,e,l,1)}}function U(e,t){const o=t.getColumns(e),n=new Array(o).fill(0);for(const{column:t}of new h(e))n[t]++;const i=n.reduce((e,t,o)=>t?e:[...e,o],[]);if(i.length>0){const o=i[i.length-1];return t.removeColumns(e,{at:o}),!0}return!1}function K(e,t){const o=[],n=t.getRows(e);for(let t=0;t<n;t++){e.getChild(t).isEmpty&&o.push(t)}if(o.length>0){const n=o[o.length-1];return t.removeRows(e,{at:n}),!0}return!1}function $(e,t){U(e,t)||K(e,t)}function q(e,t){const o=Array.from(new h(e,{startColumn:t.firstColumn,endColumn:t.lastColumn,row:t.lastRow}));if(o.every(({cellHeight:e})=>1===e))return t.lastRow;const n=o[0].cellHeight-1;return t.lastRow+n}function G(e,t){const o=Array.from(new h(e,{startRow:t.firstRow,endRow:t.lastRow,column:t.lastColumn}));if(o.every(({cellWidth:e})=>1===e))return t.lastColumn;const n=o[0].cellWidth-1;return t.lastColumn+n}class J extends n.Command{constructor(e,t){super(e),this.direction=t.direction,this.isHorizontal="right"==this.direction||"left"==this.direction}refresh(){const e=this._getMergeableCell();this.value=e,this.isEnabled=!!e}execute(){const e=this.editor.model,t=A(e.document.selection)[0],o=this.value,n=this.direction;e.change(e=>{const i="right"==n||"down"==n,r=i?t:o,l=i?o:t,s=l.parent;!function(e,t,o){X(e)||(X(t)&&o.remove(o.createRangeIn(t)),o.move(o.createRangeIn(e),o.createPositionAt(t,"end")));o.remove(e)}(l,r,e);const a=this.isHorizontal?"colspan":"rowspan",c=parseInt(t.getAttribute(a)||1),d=parseInt(o.getAttribute(a)||1);e.setAttribute(a,c+d,r),e.setSelection(e.createRangeIn(r));const u=this.editor.plugins.get("TableUtils");$(s.findAncestor("table"),u)})}_getMergeableCell(){const e=A(this.editor.model.document.selection)[0];if(!e)return;const t=this.editor.plugins.get("TableUtils"),o=this.isHorizontal?function(e,t,o){const n=e.parent.parent,i="right"==t?e.nextSibling:e.previousSibling,r=(n.getAttribute("headingColumns")||0)>0;if(!i)return;const l="right"==t?e:i,a="right"==t?i:e,{column:c}=o.getCellLocation(l),{column:d}=o.getCellLocation(a),u=parseInt(l.getAttribute("colspan")||1),h=s(o,l),b=s(o,a);if(r&&h!=b)return;return c+u===d?i:void 0}(e,this.direction,t):function(e,t,o){const n=e.parent,i=n.parent,r=i.getChildIndex(n);if("down"==t&&r===o.getRows(i)-1||"up"==t&&0===r)return;const l=parseInt(e.getAttribute("rowspan")||1),s=i.getAttribute("headingRows")||0,a="down"==t&&r+l===s,c="up"==t&&r===s;if(s&&(a||c))return;const d=parseInt(e.getAttribute("rowspan")||1),u="down"==t?r+d:r,b=[...new h(i,{endRow:u})],m=b.find(t=>t.cell===e).column,g=b.find(({row:e,cellHeight:o,column:n})=>n===m&&("down"==t?e===u:u===e+o));return g&&g.cell}(e,this.direction,t);if(!o)return;const n=this.isHorizontal?"rowspan":"colspan",i=parseInt(e.getAttribute(n)||1);return parseInt(o.getAttribute(n)||1)===i?o:void 0}}function X(e){return 1==e.childCount&&e.getChild(0).is("element","paragraph")&&e.getChild(0).isEmpty}class Y extends n.Command{refresh(){const e=V(this.editor.model.document.selection),t=e[0];if(t){const o=t.findAncestor("table"),n=this.editor.plugins.get("TableUtils").getRows(o)-1,i=S(e),r=0===i.first&&i.last===n;this.isEnabled=!r}else this.isEnabled=!1}execute(){const e=this.editor.model,t=this.editor.plugins.get("TableUtils"),o=V(e.document.selection),n=S(o),i=o[0],r=i.findAncestor("table"),l=t.getCellLocation(i).column;e.change(e=>{const o=n.last-n.first+1;t.removeRows(r,{at:n.first,rows:o});const i=function(e,t,o,n){const i=e.getChild(Math.min(t,n-1));let r=i.getChild(0),l=0;for(const e of i.getChildren()){if(l>o)return r;r=e,l+=parseInt(e.getAttribute("colspan")||1)}return r}(r,n.first,l,t.getRows(r));e.setSelection(e.createPositionAt(i,0))})}}class Q extends n.Command{refresh(){const e=V(this.editor.model.document.selection),t=e[0];if(t){const o=t.findAncestor("table"),n=this.editor.plugins.get("TableUtils").getColumns(o),{first:i,last:r}=R(e);this.isEnabled=r-i<n-1}else this.isEnabled=!1}execute(){const[e,t]=function(e){const t=V(e),o=t[0],n=t.pop(),i=[o,n];return o.isBefore(n)?i:i.reverse()}(this.editor.model.document.selection),o=e.parent.parent,n=[...new h(o)],i={first:n.find(t=>t.cell===e).column,last:n.find(e=>e.cell===t).column},r=function(e,t,o,n){return parseInt(o.getAttribute("colspan")||1)>1?o:t.previousSibling||o.nextSibling?o.nextSibling||t.previousSibling:n.first?e.reverse().find(({column:e})=>e<n.first).cell:e.reverse().find(({column:e})=>e>n.last).cell}(n,e,t,i);this.editor.model.change(e=>{const t=i.last-i.first+1;this.editor.plugins.get("TableUtils").removeColumns(o,{at:i.first,columns:t}),e.setSelection(e.createPositionAt(r,0))})}}class Z extends n.Command{refresh(){const e=V(this.editor.model.document.selection),t=e.length>0;this.isEnabled=t,this.value=t&&e.every(e=>this._isInHeading(e,e.parent.parent))}execute(e={}){if(e.forceValue===this.value)return;const t=this.editor.model,o=V(t.document.selection),n=o[0].findAncestor("table"),{first:i,last:l}=S(o),s=this.value?i:l+1,a=n.getAttribute("headingRows")||0;t.change(e=>{if(s){const t=F(n,s,s>a?a:0);for(const{cell:o}of t)H(o,s,e)}r("headingRows",s,n,e,0)})}_isInHeading(e,t){const o=parseInt(t.getAttribute("headingRows")||0);return!!o&&e.parent.index<o}}class ee extends n.Command{refresh(){const e=V(this.editor.model.document.selection),t=this.editor.plugins.get("TableUtils"),o=e.length>0;this.isEnabled=o,this.value=o&&e.every(e=>s(t,e))}execute(e={}){if(e.forceValue===this.value)return;const t=this.editor.model,o=V(t.document.selection),n=o[0].findAncestor("table"),{first:i,last:l}=R(o),s=this.value?i:l+1;t.change(e=>{if(s){const t=D(n,s);for(const{cell:o,column:n}of t)W(o,n,s,e)}r("headingColumns",s,n,e,0)})}}class te extends n.Plugin{static get pluginName(){return"TableUtils"}init(){this.decorate("insertColumns"),this.decorate("insertRows")}getCellLocation(e){const t=e.parent,o=t.parent,n=o.getChildIndex(t),i=new h(o,{row:n});for(const{cell:t,row:o,column:n}of i)if(t===e)return{row:o,column:n}}createTable(e,t){const o=e.createElement("table"),n=parseInt(t.rows)||2,i=parseInt(t.columns)||2;return oe(e,o,0,n,i),t.headingRows&&r("headingRows",Math.min(t.headingRows,n),o,e,0),t.headingColumns&&r("headingColumns",Math.min(t.headingColumns,i),o,e,0),o}insertRows(e,t={}){const o=this.editor.model,n=t.at||0,i=t.rows||1,s=void 0!==t.copyStructureFromAbove,c=t.copyStructureFromAbove?n-1:n,d=this.getRows(e),u=this.getColumns(e);if(n>d)throw new a.CKEditorError("tableutils-insertrows-insert-out-of-range",this,{options:t});o.change(t=>{const o=e.getAttribute("headingRows")||0;if(o>n&&r("headingRows",o+i,e,t,0),!s&&(0===n||n===d))return void oe(t,e,n,i,u);const a=s?Math.max(n,c):n,b=new h(e,{endRow:a}),m=new Array(u).fill(1);for(const{row:e,column:o,cellHeight:r,cellWidth:l,cell:a}of b){const d=e+r-1,u=e<=c&&c<=d;e<n&&n<=d?(t.setAttribute("rowspan",r+i,a),m[o]=-l):s&&u&&(m[o]=l)}for(let o=0;o<i;o++){const o=t.createElement("tableRow");t.insert(o,e,n);for(let e=0;e<m.length;e++){const n=m[e],i=t.createPositionAt(o,"end");n>0&&l(t,i,n>1?{colspan:n}:null),e+=Math.abs(n)-1}}})}insertColumns(e,t={}){const o=this.editor.model,n=t.at||0,i=t.columns||1;o.change(t=>{const o=e.getAttribute("headingColumns");n<o&&t.setAttribute("headingColumns",o+i,e);const r=this.getColumns(e);if(0===n||r===n){for(const o of e.getChildren())o.is("element","tableRow")&&ne(i,t,t.createPositionAt(o,n?"end":0));return}const l=new h(e,{column:n,includeAllSlots:!0});for(const e of l){const{row:o,cell:r,cellAnchorColumn:s,cellAnchorRow:a,cellWidth:c,cellHeight:d}=e;if(s<n){t.setAttribute("colspan",c+i,r);const e=a+d-1;for(let t=o;t<=e;t++)l.skipRow(t)}else ne(i,t,e.getPositionBefore())}})}removeRows(e,t){const o=this.editor.model,n=t.rows||1,i=this.getRows(e),l=t.at,s=l+n-1;if(s>i-1)throw new a.CKEditorError("tableutils-removerows-row-index-out-of-range",this,{table:e,options:t});o.change(t=>{const{cellsToMove:o,cellsToTrim:n}=function(e,t,o){const n=new Map,i=[];for(const{row:r,column:l,cellHeight:s,cell:a}of new h(e,{endRow:o})){const e=r+s-1;if(r>=t&&r<=o&&e>o){const e=s-(o-r+1);n.set(l,{cell:a,rowspan:e})}if(r<t&&e>=t){let n;n=e>=o?o-t+1:e-t+1,i.push({cell:a,rowspan:s-n})}}return{cellsToMove:n,cellsToTrim:i}}(e,l,s);if(o.size){!function(e,t,o,n){const i=[...new h(e,{includeAllSlots:!0,row:t})],l=e.getChild(t);let s;for(const{column:e,cell:t,isAnchor:a}of i)if(o.has(e)){const{cell:t,rowspan:i}=o.get(e),a=s?n.createPositionAfter(s):n.createPositionAt(l,0);n.move(n.createRangeOn(t),a),r("rowspan",i,t,n),s=t}else a&&(s=t)}(e,s+1,o,t)}for(let o=s;o>=l;o--)t.remove(e.getChild(o));for(const{rowspan:e,cell:o}of n)r("rowspan",e,o,t);!function(e,t,o,n){const i=e.getAttribute("headingRows")||0;if(t<i){r("headingRows",o<i?i-(o-t+1):t,e,n,0)}}(e,l,s,t),U(e,this)||K(e,this)})}removeColumns(e,t){const o=this.editor.model,n=t.at,i=t.columns||1,l=t.at+i-1;o.change(t=>{!function(e,t,o){const n=e.getAttribute("headingColumns")||0;if(n&&t.first<n){const i=Math.min(n-1,t.last)-t.first+1;o.setAttribute("headingColumns",n-i,e)}}(e,{first:n,last:l},t);for(let o=l;o>=n;o--)for(const{cell:n,column:i,cellWidth:l}of[...new h(e)])i<=o&&l>1&&i+l>o?r("colspan",l-1,n,t):i===o&&t.remove(n);K(e,this)||U(e,this)})}splitCellVertically(e,t=2){const o=this.editor.model,n=e.parent.parent,i=parseInt(e.getAttribute("rowspan")||1),l=parseInt(e.getAttribute("colspan")||1);o.change(o=>{if(l>1){const{newCellsSpan:n,updatedSpan:s}=ie(l,t);r("colspan",s,e,o);const a={};n>1&&(a.colspan=n),i>1&&(a.rowspan=i);ne(l>t?t-1:l-1,o,o.createPositionAfter(e),a)}if(l<t){const s=t-l,a=[...new h(n)],{column:c}=a.find(({cell:t})=>t===e),d=a.filter(({cell:t,cellWidth:o,column:n})=>t!==e&&n===c||n<c&&n+o>c);for(const{cell:e,cellWidth:t}of d)o.setAttribute("colspan",t+s,e);const u={};i>1&&(u.rowspan=i),ne(s,o,o.createPositionAfter(e),u);const b=n.getAttribute("headingColumns")||0;b>c&&r("headingColumns",b+s,n,o)}})}splitCellHorizontally(e,t=2){const o=this.editor.model,n=e.parent,i=n.parent,l=i.getChildIndex(n),s=parseInt(e.getAttribute("rowspan")||1),a=parseInt(e.getAttribute("colspan")||1);o.change(o=>{if(s>1){const n=[...new h(i,{startRow:l,endRow:l+s-1,includeAllSlots:!0})],{newCellsSpan:c,updatedSpan:d}=ie(s,t);r("rowspan",d,e,o);const{column:u}=n.find(({cell:t})=>t===e),b={};c>1&&(b.rowspan=c),a>1&&(b.colspan=a);for(const e of n){const{column:t,row:n}=e,i=t===u,r=(n+l+d)%c==0;n>=l+d&&i&&r&&ne(1,o,e.getPositionBefore(),b)}}if(s<t){const n=t-s,c=[...new h(i,{startRow:0,endRow:l})];for(const{cell:t,cellHeight:i,row:r}of c)if(t!==e&&r+i>l){const e=i+n;o.setAttribute("rowspan",e,t)}const d={};a>1&&(d.colspan=a),oe(o,i,l+1,n,1,d);const u=i.getAttribute("headingRows")||0;u>l&&r("headingRows",u+n,i,o)}})}getColumns(e){return[...e.getChild(0).getChildren()].reduce((e,t)=>e+parseInt(t.getAttribute("colspan")||1),0)}getRows(e){return Array.from(e.getChildren()).reduce((e,t)=>t.is("element","tableRow")?e+1:e,0)}}function oe(e,t,o,n,i,r={}){for(let l=0;l<n;l++){const n=e.createElement("tableRow");e.insert(n,t,o),ne(i,e,e.createPositionAt(n,"end"),r)}}function ne(e,t,o,n={}){for(let i=0;i<e;i++)l(t,o,n)}function ie(e,t){if(e<t)return{newCellsSpan:1,updatedSpan:1};const o=Math.floor(e/t);return{newCellsSpan:o,updatedSpan:e-o*t+o}}class re extends n.Command{refresh(){const e=x(this.editor.model.document.selection);this.isEnabled=I(e,this.editor.plugins.get(te))}execute(){const e=this.editor.model,t=this.editor.plugins.get(te);e.change(o=>{const n=x(e.document.selection),i=n.shift(),{mergeWidth:l,mergeHeight:s}=function(e,t,o){let n=0,i=0;for(const e of t){const{row:t,column:r}=o.getCellLocation(e);n=ae(e,r,n,"colspan"),i=ae(e,t,i,"rowspan")}const{row:r,column:l}=o.getCellLocation(e);return{mergeWidth:n-l,mergeHeight:i-r}}(i,n,t);r("colspan",l,i,o),r("rowspan",s,i,o);for(const e of n)le(e,i,o);$(i.findAncestor("table"),t),o.setSelection(i,"in")})}}function le(e,t,o){se(e)||(se(t)&&o.remove(o.createRangeIn(t)),o.move(o.createRangeIn(e),o.createPositionAt(t,"end"))),o.remove(e)}function se(e){return 1==e.childCount&&e.getChild(0).is("element","paragraph")&&e.getChild(0).isEmpty}function ae(e,t,o,n){const i=parseInt(e.getAttribute(n)||1);return Math.max(o,t+i)}class ce extends n.Command{constructor(e){super(e),this.affectsData=!1}refresh(){const e=V(this.editor.model.document.selection);this.isEnabled=e.length>0}execute(){const e=this.editor.model,t=V(e.document.selection),o=S(t),n=t[0].findAncestor("table"),i=[];for(let t=o.first;t<=o.last;t++)for(const o of n.getChild(t).getChildren())i.push(e.createRangeOn(o));e.change(e=>{e.setSelection(i)})}}class de extends n.Command{constructor(e){super(e),this.affectsData=!1}refresh(){const e=V(this.editor.model.document.selection);this.isEnabled=e.length>0}execute(){const e=this.editor.model,t=V(e.document.selection),o=t[0],n=t.pop(),i=o.findAncestor("table"),r=this.editor.plugins.get("TableUtils"),l=r.getCellLocation(o),s=r.getCellLocation(n),a=Math.min(l.column,s.column),c=Math.max(l.column,s.column),d=[];for(const t of new h(i,{startColumn:a,endColumn:c}))d.push(e.createRangeOn(t.cell));e.change(e=>{e.setSelection(d)})}}function ue(e){e.document.registerPostFixer(t=>function(e,t){const o=t.document.differ.getChanges();let n=!1;const i=new Set;for(const t of o){let o;"table"==t.name&&"insert"==t.type&&(o=t.position.nodeAfter),"tableRow"!=t.name&&"tableCell"!=t.name||(o=t.position.findAncestor("table")),me(t)&&(o=t.range.start.findAncestor("table")),o&&!i.has(o)&&(n=he(o,e)||n,n=be(o,e)||n,i.add(o))}return n}(t,e))}function he(e,t){let o=!1;const n=function(e){const t=parseInt(e.getAttribute("headingRows")||0),o=Array.from(e.getChildren()).reduce((e,t)=>t.is("element","tableRow")?e+1:e,0),n=[];for(const{row:i,cell:r,cellHeight:l}of new h(e)){if(l<2)continue;const e=i<t?t:o;if(i+l>e){const t=e-i;n.push({cell:r,rowspan:t})}}return n}(e);if(n.length){o=!0;for(const e of n)r("rowspan",e.rowspan,e.cell,t,1)}return o}function be(e,t){let o=!1;const n=function(e){const t=new Array(e.childCount).fill(0);for(const{rowIndex:o}of new h(e,{includeAllSlots:!0}))t[o]++;return t}(e),i=[];for(const[t,o]of n.entries())!o&&e.getChild(t).is("element","tableRow")&&i.push(t);if(i.length){o=!0;for(const o of i.reverse())t.remove(e.getChild(o)),n.splice(o,1)}const r=n.filter((t,o)=>e.getChild(o).is("element","tableRow")),s=r[0];if(!r.every(e=>e===s)){const n=r.reduce((e,t)=>t>e?t:e,0);for(const[i,s]of r.entries()){const r=n-s;if(r){for(let o=0;o<r;o++)l(t,t.createPositionAt(e.getChild(i),"end"));o=!0}}}return o}function me(e){const t="attribute"===e.type,o=e.attributeKey;return t&&("headingRows"===o||"colspan"===o||"rowspan"===o)}function ge(e){e.document.registerPostFixer(t=>function(e,t){const o=t.document.differ.getChanges();let n=!1;for(const t of o)"insert"==t.type&&"table"==t.name&&(n=pe(t.position.nodeAfter,e)||n),"insert"==t.type&&"tableRow"==t.name&&(n=fe(t.position.nodeAfter,e)||n),"insert"==t.type&&"tableCell"==t.name&&(n=we(t.position.nodeAfter,e)||n),_e(t)&&(n=we(t.position.parent,e)||n);return n}(t,e))}function pe(e,t){let o=!1;for(const n of e.getChildren())n.is("element","tableRow")&&(o=fe(n,t)||o);return o}function fe(e,t){let o=!1;for(const n of e.getChildren())o=we(n,t)||o;return o}function we(e,t){if(0==e.childCount)return t.insertElement("paragraph",e),!0;const o=Array.from(e.getChildren()).filter(e=>e.is("$text"));for(const e of o)t.wrap(t.createRangeOn(e),"paragraph");return!!o.length}function _e(e){return!(!e.position||!e.position.parent.is("element","tableCell"))&&("insert"==e.type&&"$text"==e.name||"remove"==e.type)}function ke(e,t){e.document.registerPostFixer(()=>function(e,t){const o=new Set;for(const t of e.getChanges()){const e="attribute"==t.type?t.range.start.parent:t.position.parent;e.is("element","tableCell")&&o.add(e)}for(const n of o.values())for(const o of[...n.getChildren()].filter(e=>ve(e,t)))e.refreshItem(o);return!1}(e.document.differ,t))}function ve(e,t){if(!e.is("element","paragraph"))return!1;const o=t.toViewElement(e);return!!o&&p(e)!==o.is("element","span")}function Ce(e){e.document.registerPostFixer(()=>function(e){const t=e.document.differ,o=new Set;for(const e of t.getChanges())if("attribute"===e.type){const t=e.range.start.nodeAfter;t&&t.is("element","table")&&"headingRows"===e.attributeKey&&o.add(t)}else if("insert"===e.type||"remove"===e.type)if("tableRow"===e.name){const t=e.position.findAncestor("table"),n=t.getAttribute("headingRows")||0;e.position.offset<n&&o.add(t)}else if("tableCell"===e.name){const t=e.position.findAncestor("table"),n=t.getAttribute("headingColumns")||0;e.position.offset<n&&o.add(t)}if(o.size){for(const e of o.values())t.refreshItem(e);return!0}return!1}(e))}o(11);class ye extends n.Plugin{static get pluginName(){return"TableEditing"}init(){const e=this.editor,t=e.model,o=t.schema,n=e.conversion;o.register("table",{allowWhere:"$block",allowAttributes:["headingRows","headingColumns"],isObject:!0,isBlock:!0}),o.register("tableRow",{allowIn:"table",isLimit:!0}),o.register("tableCell",{allowIn:"tableRow",allowChildren:"$block",allowAttributes:["colspan","rowspan"],isLimit:!0,isSelectable:!0}),n.for("upcast").add(e=>{e.on("element:figure",(e,t,o)=>{if(!o.consumable.test(t.viewItem,{name:!0,classes:"table"}))return;const n=function(e){for(const t of e.getChildren())if(t.is("element","table"))return t}(t.viewItem);if(!n||!o.consumable.test(n,{name:!0}))return;const i=o.convertItem(n,t.modelCursor),r=Object(a.first)(i.modelRange.getItems());r&&(o.consumable.consume(t.viewItem,{name:!0,classes:"table"}),o.convertChildren(t.viewItem,o.writer.createPositionAt(r,"end")),o.updateConversionResult(r,t))})}),n.for("upcast").add(c()),n.for("editingDowncast").add(m({asWidget:!0})),n.for("dataDowncast").add(m()),n.for("upcast").elementToElement({model:"tableRow",view:"tr"}),n.for("upcast").add(e=>{e.on("element:tr",(e,t)=>{t.viewItem.isEmpty&&0==t.modelCursor.index&&e.stop()},{priority:"high"})}),n.for("editingDowncast").add(e=>e.on("insert:tableRow",(e,t,o)=>{const n=t.item;if(!o.consumable.consume(n,"insert"))return;const i=n.parent,r=function(e){for(const t of e.getChildren())if("table"===t.name)return t}(o.mapper.toViewElement(i)),l=i.getChildIndex(n),s=new h(i,{row:l}),a={headingRows:i.getAttribute("headingRows")||0,headingColumns:i.getAttribute("headingColumns")||0},c=new Map;for(const e of s){const t=c.get(l)||_(r,n,l,a,o);c.set(l,t),o.consumable.consume(e.cell,"insert"),w(e,a,o.writer.createPositionAt(t,"end"),o,{asWidget:!0})}})),n.for("editingDowncast").add(e=>e.on("remove:tableRow",(e,t,o)=>{e.stop();const n=o.writer,i=o.mapper,r=i.toViewPosition(t.position).getLastMatchingPosition(e=>!e.item.is("element","tr")).nodeAfter,l=r.parent.parent,s=n.createRangeOn(r),a=n.remove(s);for(const e of n.createRangeIn(a).getItems())i.unbindViewElement(e);C("thead",l,o),C("tbody",l,o)},{priority:"higher"})),n.for("upcast").elementToElement({model:"tableCell",view:"td"}),n.for("upcast").elementToElement({model:"tableCell",view:"th"}),n.for("upcast").add(d("td")),n.for("upcast").add(d("th")),n.for("editingDowncast").add(e=>e.on("insert:tableCell",(e,t,o)=>{const n=t.item;if(!o.consumable.consume(n,"insert"))return;const i=n.parent,r=i.parent,l=r.getChildIndex(i),s=new h(r,{row:l}),a={headingRows:r.getAttribute("headingRows")||0,headingColumns:r.getAttribute("headingColumns")||0};for(const e of s)if(e.cell===n){const t=o.mapper.toViewElement(i);return void w(e,a,o.writer.createPositionAt(t,i.getChildIndex(n)),o,{asWidget:!0})}})),n.for("editingDowncast").elementToElement({model:"paragraph",view:g,converterPriority:"high"}),n.for("downcast").attributeToAttribute({model:"colspan",view:"colspan"}),n.for("upcast").attributeToAttribute({model:{key:"colspan",value:Te("colspan")},view:"colspan"}),n.for("downcast").attributeToAttribute({model:"rowspan",view:"rowspan"}),n.for("upcast").attributeToAttribute({model:{key:"rowspan",value:Te("rowspan")},view:"rowspan"}),n.for("editingDowncast").add(e=>e.on("attribute:headingColumns:table",(e,t,o)=>{const n=t.item;if(!o.consumable.consume(t.item,e.name))return;const i={headingRows:n.getAttribute("headingRows")||0,headingColumns:n.getAttribute("headingColumns")||0},r=t.attributeOldValue,l=t.attributeNewValue,s=(r>l?r:l)-1;for(const e of new h(n,{endColumn:s}))f(e,i,o)})),e.data.mapper.on("modelToViewPosition",(e,t)=>{const o=t.modelPosition.parent,n=t.modelPosition.nodeBefore;if(!o.is("element","tableCell"))return;if(!n||!n.is("element","paragraph"))return;const i=t.mapper.toViewElement(n),r=t.mapper.toViewElement(o);i===r&&(t.viewPosition=t.mapper.findPositionIn(r,n.maxOffset))}),e.config.define("table.defaultHeadings.rows",0),e.config.define("table.defaultHeadings.columns",0),e.commands.add("insertTable",new T(e)),e.commands.add("insertTableRowAbove",new L(e,{order:"above"})),e.commands.add("insertTableRowBelow",new L(e,{order:"below"})),e.commands.add("insertTableColumnLeft",new N(e,{order:"left"})),e.commands.add("insertTableColumnRight",new N(e,{order:"right"})),e.commands.add("removeTableRow",new Y(e)),e.commands.add("removeTableColumn",new Q(e)),e.commands.add("splitTableCellVertically",new z(e,{direction:"vertically"})),e.commands.add("splitTableCellHorizontally",new z(e,{direction:"horizontally"})),e.commands.add("mergeTableCells",new re(e)),e.commands.add("mergeTableCellRight",new J(e,{direction:"right"})),e.commands.add("mergeTableCellLeft",new J(e,{direction:"left"})),e.commands.add("mergeTableCellDown",new J(e,{direction:"down"})),e.commands.add("mergeTableCellUp",new J(e,{direction:"up"})),e.commands.add("setTableColumnHeader",new ee(e)),e.commands.add("setTableRowHeader",new Z(e)),e.commands.add("selectTableRow",new ce(e)),e.commands.add("selectTableColumn",new de(e)),Ce(t),ue(t),ke(t,e.editing.mapper),ge(t)}static get requires(){return[te]}}function Te(e){return t=>{const o=parseInt(t.getAttribute(e));return Number.isNaN(o)||o<=0?null:o}}var xe=o(0);o(13);class Ae extends xe.View{constructor(e){super(e);const t=this.bindTemplate;this.items=this._createGridCollection(),this.set("rows",0),this.set("columns",0),this.bind("label").to(this,"columns",this,"rows",(e,t)=>`${t} × ${e}`),this.setTemplate({tag:"div",attributes:{class:["ck"]},children:[{tag:"div",attributes:{class:["ck-insert-table-dropdown__grid"]},on:{"mouseover@.ck-insert-table-dropdown-grid-box":t.to("boxover")},children:this.items},{tag:"div",attributes:{class:["ck-insert-table-dropdown__label"]},children:[{text:t.to("label")}]}],on:{mousedown:t.to(e=>{e.preventDefault()}),click:t.to(()=>{this.fire("execute")})}}),this.on("boxover",(e,t)=>{const{row:o,column:n}=t.target.dataset;this.set({rows:parseInt(o),columns:parseInt(n)})}),this.on("change:columns",()=>{this._highlightGridBoxes()}),this.on("change:rows",()=>{this._highlightGridBoxes()})}focus(){}focusLast(){}_highlightGridBoxes(){const e=this.rows,t=this.columns;this.items.map((o,n)=>{const i=Math.floor(n/10)<e&&n%10<t;o.set("isOn",i)})}_createGridCollection(){const e=[];for(let t=0;t<100;t++){const o=Math.floor(t/10),n=t%10;e.push(new Ve(this.locale,o+1,n+1))}return this.createCollection(e)}}class Ve extends xe.View{constructor(e,t,o){super(e);const n=this.bindTemplate;this.set("isOn",!1),this.setTemplate({tag:"div",attributes:{class:["ck-insert-table-dropdown-grid-box",n.if("isOn","ck-on")],"data-row":t,"data-column":o}})}}class Se extends n.Plugin{static get pluginName(){return"TableUI"}init(){const e=this.editor,t=this.editor.t,o="ltr"===e.locale.contentLanguageDirection;e.ui.componentFactory.add("insertTable",o=>{const n=e.commands.get("insertTable"),i=Object(xe.createDropdown)(o);let r;return i.bind("isEnabled").to(n),i.buttonView.set({icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 6v3h4V6H3zm0 4v3h4v-3H3zm0 4v3h4v-3H3zm5 3h4v-3H8v3zm5 0h4v-3h-4v3zm4-4v-3h-4v3h4zm0-4V6h-4v3h4zm1.5 8a1.5 1.5 0 0 1-1.5 1.5H3A1.5 1.5 0 0 1 1.5 17V4c.222-.863 1.068-1.5 2-1.5h13c.932 0 1.778.637 2 1.5v13zM12 13v-3H8v3h4zm0-4V6H8v3h4z"/></svg>',label:t("Insert table"),tooltip:!0}),i.on("change:isOpen",()=>{r||(r=new Ae(o),i.panelView.children.add(r),r.delegate("execute").to(i),i.buttonView.on("open",()=>{r.rows=0,r.columns=0}),i.on("execute",()=>{e.execute("insertTable",{rows:r.rows,columns:r.columns}),e.editing.view.focus()}))}),i}),e.ui.componentFactory.add("tableColumn",e=>{const n=[{type:"switchbutton",model:{commandName:"setTableColumnHeader",label:t("Header column"),bindIsOn:!0}},{type:"separator"},{type:"button",model:{commandName:o?"insertTableColumnLeft":"insertTableColumnRight",label:t("Insert column left")}},{type:"button",model:{commandName:o?"insertTableColumnRight":"insertTableColumnLeft",label:t("Insert column right")}},{type:"button",model:{commandName:"removeTableColumn",label:t("Delete column")}},{type:"button",model:{commandName:"selectTableColumn",label:t("Select column")}}];return this._prepareDropdown(t("Column"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M18 7v1H2V7h16zm0 5v1H2v-1h16z" opacity=".6"/><path d="M14 1v18a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1zm-2 1H8v4h4V2zm0 6H8v4h4V8zm0 6H8v4h4v-4z"/></svg>',n,e)}),e.ui.componentFactory.add("tableRow",e=>{const o=[{type:"switchbutton",model:{commandName:"setTableRowHeader",label:t("Header row"),bindIsOn:!0}},{type:"separator"},{type:"button",model:{commandName:"insertTableRowAbove",label:t("Insert row above")}},{type:"button",model:{commandName:"insertTableRowBelow",label:t("Insert row below")}},{type:"button",model:{commandName:"removeTableRow",label:t("Delete row")}},{type:"button",model:{commandName:"selectTableRow",label:t("Select row")}}];return this._prepareDropdown(t("Row"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M7 2h1v16H7V2zm5 0h1v16h-1V2z" opacity=".6"/><path d="M1 6h18a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm1 2v4h4V8H2zm6 0v4h4V8H8zm6 0v4h4V8h-4z"/></svg>',o,e)}),e.ui.componentFactory.add("mergeTableCells",e=>{const n=[{type:"button",model:{commandName:"mergeTableCellUp",label:t("Merge cell up")}},{type:"button",model:{commandName:o?"mergeTableCellRight":"mergeTableCellLeft",label:t("Merge cell right")}},{type:"button",model:{commandName:"mergeTableCellDown",label:t("Merge cell down")}},{type:"button",model:{commandName:o?"mergeTableCellLeft":"mergeTableCellRight",label:t("Merge cell left")}},{type:"separator"},{type:"button",model:{commandName:"splitTableCellVertically",label:t("Split cell vertically")}},{type:"button",model:{commandName:"splitTableCellHorizontally",label:t("Split cell horizontally")}}];return this._prepareMergeSplitButtonDropdown(t("Merge cells"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M7 2h1v16H7V2zm5 0h1v7h-1V2zm6 5v1H2V7h16zM8 12v1H2v-1h6z" opacity=".6"/><path d="M7 7h12a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1zm1 2v9h10V9H8z"/></svg>',n,e)})}_prepareDropdown(e,t,o,n){const i=this.editor,r=Object(xe.createDropdown)(n),l=this._fillDropdownWithListOptions(r,o);return r.buttonView.set({label:e,icon:t,tooltip:!0}),r.bind("isEnabled").toMany(l,"isEnabled",(...e)=>e.some(e=>e)),this.listenTo(r,"execute",e=>{i.execute(e.source.commandName),i.editing.view.focus()}),r}_prepareMergeSplitButtonDropdown(e,t,o,n){const i=this.editor,r=Object(xe.createDropdown)(n,xe.SplitButtonView),l=i.commands.get("mergeTableCells"),s=this._fillDropdownWithListOptions(r,o);return r.buttonView.set({label:e,icon:t,tooltip:!0,isEnabled:!0}),r.bind("isEnabled").toMany([l,...s],"isEnabled",(...e)=>e.some(e=>e)),this.listenTo(r.buttonView,"execute",()=>{i.execute("mergeTableCells"),i.editing.view.focus()}),this.listenTo(r,"execute",e=>{i.execute(e.source.commandName),i.editing.view.focus()}),r}_fillDropdownWithListOptions(e,t){const o=this.editor,n=[],i=new a.Collection;for(const e of t)Re(e,o,n,i);return Object(xe.addListToDropdown)(e,i,o.ui.componentFactory),n}}function Re(e,t,o,n){const i=e.model=new xe.Model(e.model),{commandName:r,bindIsOn:l}=e.model;if("button"===e.type||"switchbutton"===e.type){const e=t.commands.get(r);o.push(e),i.set({commandName:r}),i.bind("isEnabled").to(e),l&&i.bind("isOn").to(e,"value")}i.set({withText:!0}),n.add(e)}o(15);class Ie extends n.Plugin{static get pluginName(){return"TableSelection"}static get requires(){return[te]}init(){const e=this.editor.model;this.listenTo(e,"deleteContent",(e,t)=>this._handleDeleteContent(e,t),{priority:"high"}),this._defineSelectionConverter(),this._enablePluginDisabling()}getSelectedTableCells(){const e=x(this.editor.model.document.selection);return 0==e.length?null:e}getSelectionAsFragment(){const e=this.getSelectedTableCells();return e?this.editor.model.change(t=>{const o=t.createDocumentFragment(),n=this.editor.plugins.get("TableUtils"),{first:i,last:r}=R(e),{first:l,last:s}=S(e),a=e[0].findAncestor("table");let c=s,d=r;if(I(e,n)){const e={firstColumn:i,lastColumn:r,firstRow:l,lastRow:s};c=q(a,e),d=G(a,e)}const u=M(a,{startRow:l,startColumn:i,endRow:c,endColumn:d},t);return t.insert(u,o,0),o}):null}setCellSelection(e,t){const o=this._getCellsToSelect(e,t);this.editor.model.change(e=>{e.setSelection(o.cells.map(t=>e.createRangeOn(t)),{backward:o.backward})})}getFocusCell(){const e=[...this.editor.model.document.selection.getRanges()].pop().getContainedElement();return e&&e.is("element","tableCell")?e:null}getAnchorCell(){const e=this.editor.model.document.selection,t=Object(a.first)(e.getRanges()).getContainedElement();return t&&t.is("element","tableCell")?t:null}_defineSelectionConverter(){const e=this.editor,t=new Set;e.conversion.for("editingDowncast").add(e=>e.on("selection",(e,o,n)=>{const i=n.writer;!function(e){for(const o of t)e.removeClass("ck-editor__editable_selected",o);t.clear()}(i);const r=this.getSelectedTableCells();if(!r)return;for(const e of r){const o=n.mapper.toViewElement(e);i.addClass("ck-editor__editable_selected",o),t.add(o)}const l=n.mapper.toViewElement(r[r.length-1]);i.setSelection(l,0)},{priority:"lowest"}))}_enablePluginDisabling(){const e=this.editor;this.on("change:isEnabled",()=>{if(!this.isEnabled){const t=this.getSelectedTableCells();if(!t)return;e.model.change(o=>{const n=o.createPositionAt(t[0],0),i=e.model.schema.getNearestSelectionRange(n);o.setSelection(i)})}})}_handleDeleteContent(e,t){const[o,n]=t,i=this.editor.model,r=!n||"backward"==n.direction,l=x(o);l.length&&(e.stop(),i.change(e=>{const t=l[r?l.length-1:0];i.change(e=>{for(const t of l)i.deleteContent(e.createSelection(t,"in"))});const n=i.schema.getNearestSelectionRange(e.createPositionAt(t,0));o.is("documentSelection")?e.setSelection(n):o.setTo(n)}))}_getCellsToSelect(e,t){const o=this.editor.plugins.get("TableUtils"),n=o.getCellLocation(e),i=o.getCellLocation(t),r=Math.min(n.row,i.row),l=Math.max(n.row,i.row),s=Math.min(n.column,i.column),a=Math.max(n.column,i.column),c=new Array(l-r+1).fill(null).map(()=>[]),d={startRow:r,endRow:l,startColumn:s,endColumn:a};for(const{row:t,cell:o}of new h(e.findAncestor("table"),d))c[t-r].push(o);const u=i.row<n.row,b=i.column<n.column;return u&&c.reverse(),b&&c.forEach(e=>e.reverse()),{cells:c.flat(),backward:u||b}}}class Pe extends n.Plugin{static get pluginName(){return"TableClipboard"}static get requires(){return[Ie,te]}init(){const e=this.editor,t=e.editing.view.document;this.listenTo(t,"copy",(e,t)=>this._onCopyCut(e,t)),this.listenTo(t,"cut",(e,t)=>this._onCopyCut(e,t)),this.listenTo(e.model,"insertContent",(e,t)=>this._onInsertContent(e,...t),{priority:"high"}),this.decorate("_replaceTableSlotCell")}_onCopyCut(e,t){const o=this.editor.plugins.get(Ie);if(!o.getSelectedTableCells())return;if("cut"==e.name&&this.editor.isReadOnly)return;t.preventDefault(),e.stop();const n=this.editor.data,i=this.editor.editing.view.document,r=n.toView(o.getSelectionAsFragment());i.fire("clipboardOutput",{dataTransfer:t.dataTransfer,content:r,method:e.name})}_onInsertContent(e,t,o){if(o&&!o.is("documentSelection"))return;const n=this.editor.model,i=this.editor.plugins.get(te);let r=function(e,t){if(!e.is("documentFragment")&&!e.is("element"))return null;if(e.is("element","table"))return e;if(1==e.childCount&&e.getChild(0).is("element","table"))return e.getChild(0);const o=t.createRangeIn(e);for(const e of o.getItems())if(e.is("element","table")){const n=t.createRange(o.start,t.createPositionBefore(e));if(t.hasContent(n,{ignoreWhitespaces:!0}))return null;const i=t.createRange(t.createPositionAfter(e),o.end);return t.hasContent(i,{ignoreWhitespaces:!0})?null:e}return null}(t,n);if(!r)return;const l=V(n.document.selection);l.length?(e.stop(),n.change(e=>{const t={width:i.getColumns(r),height:i.getRows(r)},o=function(e,t,o,n){const i=e[0].findAncestor("table"),r=R(e),l=S(e),s={firstColumn:r.first,lastColumn:r.last,firstRow:l.first,lastRow:l.last},a=1===e.length;a&&(s.lastRow+=t.height-1,s.lastColumn+=t.width-1,function(e,t,o,n){const i=n.getColumns(e),r=n.getRows(e);o>i&&n.insertColumns(e,{at:i,columns:o-i});t>r&&n.insertRows(e,{at:r,rows:t-r})}(i,s.lastRow+1,s.lastColumn+1,n));a||!I(e,n)?function(e,t,o){const{firstRow:n,lastRow:i,firstColumn:r,lastColumn:l}=t,s={first:n,last:i},a={first:r,last:l};Be(e,r,s,o),Be(e,l+1,s,o),Ee(e,n,a,o),Ee(e,i+1,a,o,n)}(i,s,o):(s.lastRow=q(i,s),s.lastColumn=G(i,s));return s}(l,t,e,i),n=o.lastRow-o.firstRow+1,s=o.lastColumn-o.firstColumn+1,a={startRow:0,startColumn:0,endRow:Math.min(n,t.height)-1,endColumn:Math.min(s,t.width)-1};r=M(r,a,e);const c=l[0].findAncestor("table"),d=this._replaceSelectedCellsWithPasted(r,t,c,o,e);if(this.editor.plugins.get("TableSelection").isEnabled){const t=P(d.map(t=>e.createRangeOn(t)));e.setSelection(t)}else e.setSelection(d[0],0)})):$(r,i)}_replaceSelectedCellsWithPasted(e,t,o,n,i){const{width:r,height:l}=t,s=function(e,t,o){const n=new Array(o).fill(null).map(()=>new Array(t).fill(null));for(const{column:t,row:o,cell:i}of new h(e))n[o][t]=i;return n}(e,r,l),a=[...new h(o,{startRow:n.firstRow,endRow:n.lastRow,startColumn:n.firstColumn,endColumn:n.lastColumn,includeAllSlots:!0})],c=[];let d;for(const e of a){const{row:t,column:o}=e;o===n.firstColumn&&(d=e.getPositionBefore());const a=t-n.firstRow,u=o-n.firstColumn,h=s[a%l][u%r],b=h?i.cloneElement(h):null,m=this._replaceTableSlotCell(e,b,d,i);m&&(j(m,t,o,n.lastRow,n.lastColumn,i),c.push(m),d=i.createPositionAfter(m))}const u=parseInt(o.getAttribute("headingRows")||0),b=parseInt(o.getAttribute("headingColumns")||0),m=n.firstRow<u&&u<=n.lastRow,g=n.firstColumn<b&&b<=n.lastColumn;if(m){const e=Ee(o,u,{first:n.firstColumn,last:n.lastColumn},i,n.firstRow);c.push(...e)}if(g){const e=Be(o,b,{first:n.firstRow,last:n.lastRow},i);c.push(...e)}return c}_replaceTableSlotCell(e,t,o,n){const{cell:i,isAnchor:r}=e;return r&&n.remove(i),t?(n.insert(t,o),t):null}}function Ee(e,t,o,n,i=0){if(t<1)return;return F(e,t,i).filter(({column:e,cellWidth:t})=>Oe(e,t,o)).map(({cell:e})=>H(e,t,n))}function Be(e,t,o,n){if(t<1)return;return D(e,t).filter(({row:e,cellHeight:t})=>Oe(e,t,o)).map(({cell:e,column:o})=>W(e,o,t,n))}function Oe(e,t,o){const n=e+t-1,{first:i,last:r}=o;return e>=i&&e<=r||e<i&&n>=i}class Le extends n.Plugin{static get pluginName(){return"TableKeyboard"}static get requires(){return[Ie]}init(){const e=this.editor.editing.view.document;this.editor.keystrokes.set("Tab",(...e)=>this._handleTabOnSelectedTable(...e),{priority:"low"}),this.editor.keystrokes.set("Tab",this._getTabHandler(!0),{priority:"low"}),this.editor.keystrokes.set("Shift+Tab",this._getTabHandler(!1),{priority:"low"}),this.listenTo(e,"arrowKey",(...e)=>this._onArrowKey(...e),{context:"table"})}_handleTabOnSelectedTable(e,t){const o=this.editor,n=o.model.document.selection.getSelectedElement();n&&n.is("element","table")&&(t(),o.model.change(e=>{e.setSelection(e.createRangeIn(n.getChild(0).getChild(0)))}))}_getTabHandler(e){const t=this.editor;return(o,n)=>{let i=A(t.model.document.selection)[0];if(i||(i=this.editor.plugins.get("TableSelection").getFocusCell()),!i)return;n();const r=i.parent,l=r.parent,s=l.getChildIndex(r),a=r.getChildIndex(i),c=0===a;if(!e&&c&&0===s)return void t.model.change(e=>{e.setSelection(e.createRangeOn(l))});const d=this.editor.plugins.get("TableUtils"),u=a===r.childCount-1,h=s===d.getRows(l)-1;if(e&&h&&u&&(t.execute("insertTableRowBelow"),s===d.getRows(l)-1))return void t.model.change(e=>{e.setSelection(e.createRangeOn(l))});let b;if(e&&u){const e=l.getChild(s+1);b=e.getChild(0)}else if(!e&&c){const e=l.getChild(s-1);b=e.getChild(e.childCount-1)}else b=r.getChild(a+(e?1:-1));t.model.change(e=>{e.setSelection(e.createRangeIn(b))})}}_onArrowKey(e,t){const o=this.editor,n=t.keyCode,i=Object(a.getLocalizedArrowKeyCodeDirection)(n,o.locale.contentLanguageDirection);this._handleArrowKeys(i,t.shiftKey)&&(t.preventDefault(),t.stopPropagation(),e.stop())}_handleArrowKeys(e,t){const o=this.editor.model,n=o.document.selection,i=["right","down"].includes(e),r=x(n);if(r.length){let o;return o=t?this.editor.plugins.get("TableSelection").getFocusCell():i?r[r.length-1]:r[0],this._navigateFromCellInDirection(o,e,t),!0}const l=n.focus.findAncestor("tableCell");if(!l)return!1;if(!n.isCollapsed)if(t){if(n.isBackward==i&&!n.containsEntireContent(l))return!1}else{const e=n.getSelectedElement();if(!e||!o.schema.isObject(e))return!1}return!!this._isSelectionAtCellEdge(n,l,i)&&(this._navigateFromCellInDirection(l,e,t),!0)}_isSelectionAtCellEdge(e,t,o){const n=this.editor.model,i=this.editor.model.schema,r=o?e.getLastPosition():e.getFirstPosition();if(!i.getLimitElement(r).is("element","tableCell")){return n.createPositionAt(t,o?"end":0).isTouching(r)}const l=n.createSelection(r);return n.modifySelection(l,{direction:o?"forward":"backward"}),r.isEqual(l.focus)}_navigateFromCellInDirection(e,t,o=!1){const n=this.editor.model,i=e.findAncestor("table"),r=[...new h(i,{includeAllSlots:!0})],{row:l,column:s}=r[r.length-1],a=r.find(({cell:t})=>t==e);let{row:c,column:d}=a;switch(t){case"left":d--;break;case"up":c--;break;case"right":d+=a.cellWidth;break;case"down":c+=a.cellHeight}if(c<0||c>l||d<0&&c<=0||d>s&&c>=l)return void n.change(e=>{e.setSelection(e.createRangeOn(i))});d<0?(d=o?0:s,c--):d>s&&(d=o?s:0,c++);const u=r.find(e=>e.row==c&&e.column==d).cell,b=["right","down"].includes(t),m=this.editor.plugins.get("TableSelection");if(o&&m.isEnabled){const t=m.getAnchorCell()||e;m.setCellSelection(t,u)}else{const e=n.createPositionAt(u,b?0:"end");n.change(t=>{t.setSelection(e)})}}}var Ne=o(3);class ze extends Ne.DomEventObserver{constructor(e){super(e),this.domEventType=["mousemove","mouseleave"]}onDomEvent(e){this.fire(e.type,e)}}class Me extends n.Plugin{static get pluginName(){return"TableMouse"}static get requires(){return[Ie]}init(){this.editor.editing.view.addObserver(ze),this._enableShiftClickSelection(),this._enableMouseDragSelection()}_enableShiftClickSelection(){const e=this.editor;let t=!1;const o=e.plugins.get(Ie);this.listenTo(e.editing.view.document,"mousedown",(n,i)=>{if(!this.isEnabled||!o.isEnabled)return;if(!i.domEvent.shiftKey)return;const r=o.getAnchorCell()||A(e.model.document.selection)[0];if(!r)return;const l=this._getModelTableCellFromDomEvent(i);l&&Fe(r,l)&&(t=!0,o.setCellSelection(r,l),i.preventDefault())}),this.listenTo(e.editing.view.document,"mouseup",()=>{t=!1}),this.listenTo(e.editing.view.document,"selectionChange",e=>{t&&e.stop()},{priority:"highest"})}_enableMouseDragSelection(){const e=this.editor;let t,o,n=!1,i=!1;const r=e.plugins.get(Ie);this.listenTo(e.editing.view.document,"mousedown",(e,o)=>{this.isEnabled&&r.isEnabled&&(o.domEvent.shiftKey||o.domEvent.ctrlKey||o.domEvent.altKey||(t=this._getModelTableCellFromDomEvent(o)))}),this.listenTo(e.editing.view.document,"mousemove",(e,l)=>{if(!l.domEvent.buttons)return;if(!t)return;const s=this._getModelTableCellFromDomEvent(l);s&&Fe(t,s)&&(o=s,n||o==t||(n=!0)),n&&(i=!0,r.setCellSelection(t,o),l.preventDefault())}),this.listenTo(e.editing.view.document,"mouseup",()=>{n=!1,i=!1,t=null,o=null}),this.listenTo(e.editing.view.document,"selectionChange",e=>{i&&e.stop()},{priority:"highest"})}_getModelTableCellFromDomEvent(e){const t=e.target,o=this.editor.editing.view.createPositionAt(t,0);return this.editor.editing.mapper.toModelPosition(o).parent.findAncestor("tableCell",{includeSelf:!0})}}function Fe(e,t){return e.parent.parent==t.parent.parent}o(17);class He extends n.Plugin{static get requires(){return[ye,Se,Ie,Me,Le,Pe,i.Widget]}static get pluginName(){return"Table"}}function De(e){const t=e.getSelectedElement();return t&&je(t)?t:null}function We(e){let t=e.getFirstPosition().parent;for(;t;){if(t.is("element")&&je(t))return t;t=t.parent}return null}function je(e){return!!e.getCustomProperty("table")&&Object(i.isWidget)(e)}class Ue extends n.Plugin{static get requires(){return[i.WidgetToolbarRepository]}static get pluginName(){return"TableToolbar"}afterInit(){const e=this.editor,t=e.t,o=e.plugins.get(i.WidgetToolbarRepository),n=e.config.get("table.contentToolbar"),r=e.config.get("table.tableToolbar");n&&o.register("tableContent",{ariaLabel:t("Table toolbar"),items:n,getRelatedElement:We}),r&&o.register("table",{ariaLabel:t("Table toolbar"),items:r,getRelatedElement:De})}}o(19);class Ke extends xe.View{constructor(e,t){super(e);const o=this.bindTemplate;this.set("value",""),this.set("id"),this.set("isReadOnly",!1),this.set("hasError",!1),this.set("isFocused",!1),this.set("isEmpty",!0),this.set("ariaDescribedById"),this.options=t,this._dropdownView=this._createDropdownView(),this._inputView=this._createInputTextView(),this._stillTyping=!1,this.setTemplate({tag:"div",attributes:{class:["ck","ck-input-color",o.if("hasError","ck-error")],id:o.to("id"),"aria-invalid":o.if("hasError",!0),"aria-describedby":o.to("ariaDescribedById")},children:[this._dropdownView,this._inputView]}),this.on("change:value",(e,t,o)=>this._setInputValue(o))}focus(){this._inputView.focus()}_createDropdownView(){const e=this.locale,t=e.t,o=this.bindTemplate,n=this._createColorGrid(e),i=Object(xe.createDropdown)(e),r=new xe.View,l=this._createRemoveColorButton();return r.setTemplate({tag:"span",attributes:{class:["ck","ck-input-color__button__preview"],style:{backgroundColor:o.to("value")}},children:[{tag:"span",attributes:{class:["ck","ck-input-color__button__preview__no-color-indicator",o.if("value","ck-hidden",e=>""!=e)]}}]}),i.buttonView.extendTemplate({attributes:{class:"ck-input-color__button"}}),i.buttonView.children.add(r),i.buttonView.tooltip=t("Color picker"),i.panelPosition="rtl"===e.uiLanguageDirection?"se":"sw",i.panelView.children.add(l),i.panelView.children.add(n),i.bind("isEnabled").to(this,"isReadOnly",e=>!e),i}_createInputTextView(){const e=this.locale,t=new xe.InputTextView(e);return t.extendTemplate({on:{blur:t.bindTemplate.to("blur")}}),t.value=this.value,t.bind("isReadOnly","hasError").to(this),this.bind("isFocused","isEmpty").to(t),t.on("input",()=>{const e=t.element.value,o=this.options.colorDefinitions.find(t=>e===t.label);this._stillTyping=!0,this.value=o&&o.color||e}),t.on("blur",()=>{this._stillTyping=!1,this._setInputValue(t.element.value)}),t.delegate("input").to(this),t}_createRemoveColorButton(){const e=this.locale,t=e.t,o=new xe.ButtonView(e),i=this.options.defaultColorValue||"",r=t(i?"Restore default":"Remove color");return o.class="ck-input-color__remove-color",o.withText=!0,o.icon=n.icons.eraser,o.label=r,o.on("execute",()=>{this.value=i,this._dropdownView.isOpen=!1,this.fire("input")}),o}_createColorGrid(e){const t=new xe.ColorGridView(e,{colorDefinitions:this.options.colorDefinitions,columns:this.options.columns});return t.on("execute",(e,t)=>{this.value=t.value,this._dropdownView.isOpen=!1,this.fire("input")}),t.bind("selectedColor").to(this,"value"),t}_setInputValue(e){if(!this._stillTyping){const t=$e(e),o=this.options.colorDefinitions.find(e=>t===$e(e.color));this._inputView.value=o?o.label:e||""}}}function $e(e){return e.replace(/([(,])\s+/g,"$1").replace(/^\s+|\s+(?=[),\s]|$)/g,"").replace(/,|\s/g," ")}const qe=e=>""===e;function Ge(e){return{none:e("None"),solid:e("Solid"),dotted:e("Dotted"),dashed:e("Dashed"),double:e("Double"),groove:e("Groove"),ridge:e("Ridge"),inset:e("Inset"),outset:e("Outset")}}function Je(e){return e('The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".')}function Xe(e){return e('The value is invalid. Try "10px" or "2em" or simply "2".')}function Ye(e){return e=e.trim(),qe(e)||Object(Ne.isColor)(e)}function Qe(e){return e=e.trim(),qe(e)||it(e)||Object(Ne.isLength)(e)||Object(Ne.isPercentage)(e)}function Ze(e){return e=e.trim(),qe(e)||it(e)||Object(Ne.isLength)(e)}function et(e,t){const o=new a.Collection,n=Ge(e.t);for(const i in n){const r={type:"button",model:new xe.Model({_borderStyleValue:i,label:n[i],withText:!0})};"none"===i?r.model.bind("isOn").to(e,"borderStyle",e=>"none"===t?!e:e===i):r.model.bind("isOn").to(e,"borderStyle",e=>e===i),o.add(r)}return o}function tt(e){const{view:t,icons:o,toolbar:n,labels:i,propertyName:r,nameToValue:l,defaultValue:s}=e;for(const e in i){const a=new xe.ButtonView(t.locale);a.set({label:i[e],icon:o[e],tooltip:i[e]});const c=l?l(e):e;a.bind("isOn").to(t,r,e=>{let t=e;return""===e&&s&&(t=s),c===t}),a.on("execute",()=>{t[r]=c}),n.items.add(a)}}const ot=[{color:"hsl(0, 0%, 0%)",label:"Black"},{color:"hsl(0, 0%, 30%)",label:"Dim grey"},{color:"hsl(0, 0%, 60%)",label:"Grey"},{color:"hsl(0, 0%, 90%)",label:"Light grey"},{color:"hsl(0, 0%, 100%)",label:"White",hasBorder:!0},{color:"hsl(0, 75%, 60%)",label:"Red"},{color:"hsl(30, 75%, 60%)",label:"Orange"},{color:"hsl(60, 75%, 60%)",label:"Yellow"},{color:"hsl(90, 75%, 60%)",label:"Light green"},{color:"hsl(120, 75%, 60%)",label:"Green"},{color:"hsl(150, 75%, 60%)",label:"Aquamarine"},{color:"hsl(180, 75%, 60%)",label:"Turquoise"},{color:"hsl(210, 75%, 60%)",label:"Light blue"},{color:"hsl(240, 75%, 60%)",label:"Blue"},{color:"hsl(270, 75%, 60%)",label:"Purple"}];function nt(e){return(t,o,n)=>{const i=new Ke(t.locale,{colorDefinitions:(r=e.colorConfig,r.map(e=>({color:e.model,label:e.label,options:{hasBorder:e.hasBorder}}))),columns:e.columns,defaultColorValue:e.defaultColorValue});var r;return i.set({id:o,ariaDescribedById:n}),i.bind("isReadOnly").to(t,"isEnabled",e=>!e),i.bind("hasError").to(t,"errorText",e=>!!e),i.on("input",()=>{t.errorText=null}),t.bind("isEmpty","isFocused").to(i),i}}function it(e){const t=parseFloat(e);return!Number.isNaN(t)&&e===String(t)}o(21);class rt extends xe.View{constructor(e,t={}){super(e);const o=this.bindTemplate;this.set("class",t.class||null),this.children=this.createCollection(),t.children&&t.children.forEach(e=>this.children.add(e)),this.set("_role",null),this.set("_ariaLabelledBy",null),t.labelView&&this.set({_role:"group",_ariaLabelledBy:t.labelView.id}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__row",o.to("class")],role:o.to("_role"),"aria-labelledby":o.to("_ariaLabelledBy")},children:this.children})}}o(8),o(9),o(25);const lt={left:n.icons.alignLeft,center:n.icons.alignCenter,right:n.icons.alignRight,justify:n.icons.alignJustify,top:n.icons.alignTop,middle:n.icons.alignMiddle,bottom:n.icons.alignBottom};class st extends xe.View{constructor(e,t){super(e),this.set({borderStyle:"",borderWidth:"",borderColor:"",padding:"",backgroundColor:"",width:"",height:"",horizontalAlignment:"",verticalAlignment:""}),this.options=t;const{borderStyleDropdown:o,borderWidthInput:n,borderColorInput:i,borderRowLabel:r}=this._createBorderFields(),{backgroundRowLabel:l,backgroundInput:s}=this._createBackgroundFields(),{widthInput:c,operatorLabel:d,heightInput:u,dimensionsLabel:h}=this._createDimensionFields(),{horizontalAlignmentToolbar:b,verticalAlignmentToolbar:m,alignmentLabel:g}=this._createAlignmentFields();this.focusTracker=new a.FocusTracker,this.keystrokes=new a.KeystrokeHandler,this.children=this.createCollection(),this.borderStyleDropdown=o,this.borderWidthInput=n,this.borderColorInput=i,this.backgroundInput=s,this.paddingInput=this._createPaddingField(),this.widthInput=c,this.heightInput=u,this.horizontalAlignmentToolbar=b,this.verticalAlignmentToolbar=m;const{saveButtonView:p,cancelButtonView:f}=this._createActionButtons();this.saveButtonView=p,this.cancelButtonView=f,this._focusables=new xe.ViewCollection,this._focusCycler=new xe.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.children.add(new xe.FormHeaderView(e,{label:this.t("Cell properties")})),this.children.add(new rt(e,{labelView:r,children:[r,o,i,n],class:"ck-table-form__border-row"})),this.children.add(new rt(e,{labelView:l,children:[l,s],class:"ck-table-form__background-row"})),this.children.add(new rt(e,{children:[new rt(e,{labelView:h,children:[h,c,d,u],class:"ck-table-form__dimensions-row"}),new rt(e,{children:[this.paddingInput],class:"ck-table-cell-properties-form__padding-row"})]})),this.children.add(new rt(e,{labelView:g,children:[g,b,m],class:"ck-table-cell-properties-form__alignment-row"})),this.children.add(new rt(e,{children:[this.saveButtonView,this.cancelButtonView],class:"ck-table-form__action-row"})),this.setTemplate({tag:"form",attributes:{class:["ck","ck-form","ck-table-form","ck-table-cell-properties-form"],tabindex:"-1"},children:this.children})}render(){super.render(),Object(xe.submitHandler)({view:this}),[this.borderStyleDropdown,this.borderColorInput,this.borderWidthInput,this.backgroundInput,this.widthInput,this.heightInput,this.paddingInput,this.horizontalAlignmentToolbar,this.verticalAlignmentToolbar,this.saveButtonView,this.cancelButtonView].forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createBorderFields(){const e=this.options.defaultTableCellProperties,t={style:e.borderStyle,width:e.borderWidth,color:e.borderColor},o=nt({colorConfig:this.options.borderColors,columns:5,defaultColorValue:t.color}),n=this.locale,i=this.t,r=new xe.LabelView(n);r.text=i("Border");const l=Ge(i),s=new xe.LabeledFieldView(n,xe.createLabeledDropdown);s.set({label:i("Style"),class:"ck-table-form__border-style"}),s.fieldView.buttonView.set({isOn:!1,withText:!0,tooltip:i("Style")}),s.fieldView.buttonView.bind("label").to(this,"borderStyle",e=>l[e||"none"]),s.fieldView.on("execute",e=>{this.borderStyle=e.source._borderStyleValue}),s.bind("isEmpty").to(this,"borderStyle",e=>!e),Object(xe.addListToDropdown)(s.fieldView,et(this,t.style));const a=new xe.LabeledFieldView(n,xe.createLabeledInputText);a.set({label:i("Width"),class:"ck-table-form__border-width"}),a.fieldView.bind("value").to(this,"borderWidth"),a.bind("isEnabled").to(this,"borderStyle",at),a.fieldView.on("input",()=>{this.borderWidth=a.fieldView.element.value});const c=new xe.LabeledFieldView(n,o);return c.set({label:i("Color"),class:"ck-table-form__border-color"}),c.fieldView.bind("value").to(this,"borderColor"),c.bind("isEnabled").to(this,"borderStyle",at),c.fieldView.on("input",()=>{this.borderColor=c.fieldView.value}),this.on("change:borderStyle",(e,o,n,i)=>{at(n)||(this.borderColor="",this.borderWidth=""),at(i)||(this.borderColor=t.color,this.borderWidth=t.width)}),{borderRowLabel:r,borderStyleDropdown:s,borderColorInput:c,borderWidthInput:a}}_createBackgroundFields(){const e=this.locale,t=this.t,o=new xe.LabelView(e);o.text=t("Background");const n=nt({colorConfig:this.options.backgroundColors,columns:5,defaultColorValue:this.options.defaultTableCellProperties.backgroundColor}),i=new xe.LabeledFieldView(e,n);return i.set({label:t("Color"),class:"ck-table-cell-properties-form__background"}),i.fieldView.bind("value").to(this,"backgroundColor"),i.fieldView.on("input",()=>{this.backgroundColor=i.fieldView.value}),{backgroundRowLabel:o,backgroundInput:i}}_createDimensionFields(){const e=this.locale,t=this.t,o=new xe.LabelView(e);o.text=t("Dimensions");const n=new xe.LabeledFieldView(e,xe.createLabeledInputText);n.set({label:t("Width"),class:"ck-table-form__dimensions-row__width"}),n.fieldView.bind("value").to(this,"width"),n.fieldView.on("input",()=>{this.width=n.fieldView.element.value});const i=new xe.View(e);i.setTemplate({tag:"span",attributes:{class:["ck-table-form__dimension-operator"]},children:[{text:"×"}]});const r=new xe.LabeledFieldView(e,xe.createLabeledInputText);return r.set({label:t("Height"),class:"ck-table-form__dimensions-row__height"}),r.fieldView.bind("value").to(this,"height"),r.fieldView.on("input",()=>{this.height=r.fieldView.element.value}),{dimensionsLabel:o,widthInput:n,operatorLabel:i,heightInput:r}}_createPaddingField(){const e=this.locale,t=this.t,o=new xe.LabeledFieldView(e,xe.createLabeledInputText);return o.set({label:t("Padding"),class:"ck-table-cell-properties-form__padding"}),o.fieldView.bind("value").to(this,"padding"),o.fieldView.on("input",()=>{this.padding=o.fieldView.element.value}),o}_createAlignmentFields(){const e=this.locale,t=this.t,o=new xe.LabelView(e);o.text=t("Table cell text alignment");const n=new xe.ToolbarView(e),i="rtl"===this.locale.contentLanguageDirection;n.set({isCompact:!0,ariaLabel:t("Horizontal text alignment toolbar")}),tt({view:this,icons:lt,toolbar:n,labels:this._horizontalAlignmentLabels,propertyName:"horizontalAlignment",nameToValue:e=>{if(i){if("left"===e)return"right";if("right"===e)return"left"}return e},defaultValue:this.options.defaultTableCellProperties.horizontalAlignment});const r=new xe.ToolbarView(e);return r.set({isCompact:!0,ariaLabel:t("Vertical text alignment toolbar")}),tt({view:this,icons:lt,toolbar:r,labels:this._verticalAlignmentLabels,propertyName:"verticalAlignment",defaultValue:this.options.defaultTableCellProperties.verticalAlignment}),{horizontalAlignmentToolbar:n,verticalAlignmentToolbar:r,alignmentLabel:o}}_createActionButtons(){const e=this.locale,t=this.t,o=new xe.ButtonView(e),i=new xe.ButtonView(e),r=[this.borderWidthInput,this.borderColorInput,this.backgroundInput,this.paddingInput];return o.set({label:t("Save"),icon:n.icons.check,class:"ck-button-save",type:"submit",withText:!0}),o.bind("isEnabled").toMany(r,"errorText",(...e)=>e.every(e=>!e)),i.set({label:t("Cancel"),icon:n.icons.cancel,class:"ck-button-cancel",withText:!0}),i.delegate("execute").to(this,"cancel"),{saveButtonView:o,cancelButtonView:i}}get _horizontalAlignmentLabels(){const e=this.locale,t=this.t,o=t("Align cell text to the left"),n=t("Align cell text to the center"),i=t("Align cell text to the right"),r=t("Justify cell text");return"rtl"===e.uiLanguageDirection?{right:i,center:n,left:o,justify:r}:{left:o,center:n,right:i,justify:r}}get _verticalAlignmentLabels(){const e=this.t;return{top:e("Align cell text to the top"),middle:e("Align cell text to the middle"),bottom:e("Align cell text to the bottom")}}}function at(e){return"none"!==e}var ct=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)},dt=o(10),ut="object"==typeof self&&self&&self.Object===Object&&self,ht=dt.a||ut||Function("return this")(),bt=function(){return ht.Date.now()},mt=/\s/;var gt=function(e){for(var t=e.length;t--&&mt.test(e.charAt(t)););return t},pt=/^\s+/;var ft=function(e){return e?e.slice(0,gt(e)+1).replace(pt,""):e},wt=ht.Symbol,_t=Object.prototype,kt=_t.hasOwnProperty,vt=_t.toString,Ct=wt?wt.toStringTag:void 0;var yt=function(e){var t=kt.call(e,Ct),o=e[Ct];try{e[Ct]=void 0;var n=!0}catch(e){}var i=vt.call(e);return n&&(t?e[Ct]=o:delete e[Ct]),i},Tt=Object.prototype.toString;var xt=function(e){return Tt.call(e)},At=wt?wt.toStringTag:void 0;var Vt=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":At&&At in Object(e)?yt(e):xt(e)};var St=function(e){return null!=e&&"object"==typeof e};var Rt=function(e){return"symbol"==typeof e||St(e)&&"[object Symbol]"==Vt(e)},It=/^[-+]0x[0-9a-f]+$/i,Pt=/^0b[01]+$/i,Et=/^0o[0-7]+$/i,Bt=parseInt;var Ot=function(e){if("number"==typeof e)return e;if(Rt(e))return NaN;if(ct(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=ct(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=ft(e);var o=Pt.test(e);return o||Et.test(e)?Bt(e.slice(2),o?2:8):It.test(e)?NaN:+e},Lt=Math.max,Nt=Math.min;var zt=function(e,t,o){var n,i,r,l,s,a,c=0,d=!1,u=!1,h=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function b(t){var o=n,r=i;return n=i=void 0,c=t,l=e.apply(r,o)}function m(e){return c=e,s=setTimeout(p,t),d?b(e):l}function g(e){var o=e-a;return void 0===a||o>=t||o<0||u&&e-c>=r}function p(){var e=bt();if(g(e))return f(e);s=setTimeout(p,function(e){var o=t-(e-a);return u?Nt(o,r-(e-c)):o}(e))}function f(e){return s=void 0,h&&n?b(e):(n=i=void 0,l)}function w(){var e=bt(),o=g(e);if(n=arguments,i=this,a=e,o){if(void 0===s)return m(a);if(u)return clearTimeout(s),s=setTimeout(p,t),b(a)}return void 0===s&&(s=setTimeout(p,t)),l}return t=Ot(t)||0,ct(o)&&(d=!!o.leading,r=(u="maxWait"in o)?Lt(Ot(o.maxWait)||0,t):r,h="trailing"in o?!!o.trailing:h),w.cancel=function(){void 0!==s&&clearTimeout(s),c=0,n=a=i=s=void 0},w.flush=function(){return void 0===s?l:f(bt())},w};const Mt=xe.BalloonPanelView.defaultPositions,Ft=[Mt.northArrowSouth,Mt.northArrowSouthWest,Mt.northArrowSouthEast,Mt.southArrowNorth,Mt.southArrowNorthWest,Mt.southArrowNorthEast,Mt.viewportStickyNorth];function Ht(e,t){const o=e.plugins.get("ContextualBalloon");if(We(e.editing.view.document.selection)){let n;n="cell"===t?Wt(e):Dt(e),o.updatePosition(n)}}function Dt(e){const t=e.model.document.selection.getFirstPosition().findAncestor("table"),o=e.editing.mapper.toViewElement(t);return{target:e.editing.view.domConverter.viewToDom(o),positions:Ft}}function Wt(e){const t=e.editing.mapper,o=e.editing.view.domConverter,n=e.model.document.selection;if(n.rangeCount>1)return{target:()=>function(e,t){const o=t.editing.mapper,n=t.editing.view.domConverter,i=Array.from(e).map(e=>{const t=jt(e.start),i=o.toViewElement(t);return new a.Rect(n.viewToDom(i))});return a.Rect.getBoundingRect(i)}(n.getRanges(),e),positions:Ft};const i=jt(n.getFirstPosition()),r=t.toViewElement(i);return{target:o.viewToDom(r),positions:Ft}}function jt(e){return e.nodeAfter&&e.nodeAfter.is("element","tableCell")?e.nodeAfter:e.findAncestor("tableCell")}function Ut(e){if(!e||!ct(e))return e;const{top:t,right:o,bottom:n,left:i}=e;return t==o&&o==n&&n==i?t:void 0}function Kt(e,t){const o=parseFloat(e);return Number.isNaN(o)||String(o)!==String(e)?e:`${o}${t}`}function $t(e,t={}){const o=Object.assign({borderStyle:"none",borderWidth:"",borderColor:"",backgroundColor:"",width:"",height:""},e);return t.includeAlignmentProperty&&!o.alignment&&(o.alignment="center"),t.includePaddingProperty&&!o.padding&&(o.padding=""),t.includeVerticalAlignmentProperty&&!o.verticalAlignment&&(o.verticalAlignment="middle"),t.includeHorizontalAlignmentProperty&&!o.horizontalAlignment&&(o.horizontalAlignment=t.isRightToLeftContent?"right":"left"),o}const qt={borderStyle:"tableCellBorderStyle",borderColor:"tableCellBorderColor",borderWidth:"tableCellBorderWidth",width:"tableCellWidth",height:"tableCellHeight",padding:"tableCellPadding",backgroundColor:"tableCellBackgroundColor",horizontalAlignment:"tableCellHorizontalAlignment",verticalAlignment:"tableCellVerticalAlignment"};class Gt extends n.Plugin{static get requires(){return[xe.ContextualBalloon]}static get pluginName(){return"TableCellPropertiesUI"}constructor(e){super(e),e.config.define("table.tableCellProperties",{borderColors:ot,backgroundColors:ot})}init(){const e=this.editor,t=e.t;this._defaultTableCellProperties=$t(e.config.get("table.tableCellProperties.defaultProperties"),{includeVerticalAlignmentProperty:!0,includeHorizontalAlignmentProperty:!0,includePaddingProperty:!0,isRightToLeftContent:"rtl"===e.locale.contentLanguageDirection}),this._balloon=e.plugins.get(xe.ContextualBalloon),this.view=this._createPropertiesView(),this._undoStepBatch=null,e.ui.componentFactory.add("tableCellProperties",o=>{const n=new xe.ButtonView(o);n.set({label:t("Cell properties"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.105 18-.17 1H2.5A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1h15A1.5 1.5 0 0 1 19 2.5v9.975l-.85-.124-.15-.302V8h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5h3.105zM2 12h5V8H2v4zm10-4H8v4h4V8zM2 2v5h5V2H2zm0 16h5v-5H2v5zM13 7h5V2h-5v5zM8 2v5h4V2H8z" opacity=".6"/><path d="m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43L15.5 11.5zM13 6a1 1 0 0 1 1 1v3.172a2.047 2.047 0 0 0-.293.443l-.858 1.736-1.916.28-.151.027A1.976 1.976 0 0 0 9.315 14H7a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h6zm-1 2H8v4h4V8z"/></svg>',tooltip:!0}),this.listenTo(n,"execute",()=>this._showView());const i=Object.values(qt).map(t=>e.commands.get(t));return n.bind("isEnabled").toMany(i,"isEnabled",(...e)=>e.some(e=>e)),n})}destroy(){super.destroy(),this.view.destroy()}_createPropertiesView(){const e=this.editor,t=e.editing.view.document,o=e.config.get("table.tableCellProperties"),n=Object(xe.normalizeColorOptions)(o.borderColors),i=Object(xe.getLocalizedColorOptions)(e.locale,n),r=Object(xe.normalizeColorOptions)(o.backgroundColors),l=Object(xe.getLocalizedColorOptions)(e.locale,r),s=new st(e.locale,{borderColors:i,backgroundColors:l,defaultTableCellProperties:this._defaultTableCellProperties}),a=e.t;s.render(),this.listenTo(s,"submit",()=>{this._hideView()}),this.listenTo(s,"cancel",()=>{this._undoStepBatch.operations.length&&e.execute("undo",this._undoStepBatch),this._hideView()}),s.keystrokes.set("Esc",(e,t)=>{this._hideView(),t()}),this.listenTo(e.ui,"update",()=>{We(t.selection)?this._isViewVisible&&Ht(e,"cell"):this._hideView()}),Object(xe.clickOutsideHandler)({emitter:s,activator:()=>this._isViewInBalloon,contextElements:[this._balloon.view.element],callback:()=>this._hideView()});const c=Je(a),d=Xe(a);return s.on("change:borderStyle",this._getPropertyChangeCallback("tableCellBorderStyle",this._defaultTableCellProperties.borderStyle)),s.on("change:borderColor",this._getValidatedPropertyChangeCallback({viewField:s.borderColorInput,commandName:"tableCellBorderColor",errorText:c,validator:Ye,defaultValue:this._defaultTableCellProperties.borderColor})),s.on("change:borderWidth",this._getValidatedPropertyChangeCallback({viewField:s.borderWidthInput,commandName:"tableCellBorderWidth",errorText:d,validator:Ze,defaultValue:this._defaultTableCellProperties.borderWidth})),s.on("change:padding",this._getValidatedPropertyChangeCallback({viewField:s.paddingInput,commandName:"tableCellPadding",errorText:d,validator:Qe,defaultValue:this._defaultTableCellProperties.padding})),s.on("change:width",this._getValidatedPropertyChangeCallback({viewField:s.widthInput,commandName:"tableCellWidth",errorText:d,validator:Qe,defaultValue:this._defaultTableCellProperties.width})),s.on("change:height",this._getValidatedPropertyChangeCallback({viewField:s.heightInput,commandName:"tableCellHeight",errorText:d,validator:Qe,defaultValue:this._defaultTableCellProperties.height})),s.on("change:backgroundColor",this._getValidatedPropertyChangeCallback({viewField:s.backgroundInput,commandName:"tableCellBackgroundColor",errorText:c,validator:Ye,defaultValue:this._defaultTableCellProperties.backgroundColor})),s.on("change:horizontalAlignment",this._getPropertyChangeCallback("tableCellHorizontalAlignment",this._defaultTableCellProperties.horizontalAlignment)),s.on("change:verticalAlignment",this._getPropertyChangeCallback("tableCellVerticalAlignment",this._defaultTableCellProperties.verticalAlignment)),s}_fillViewFormFromCommandValues(){const e=this.editor.commands,t=e.get("tableCellBorderStyle");Object.entries(qt).map(([t,o])=>{const n=this._defaultTableCellProperties[t]||"";return[t,e.get(o).value||n]}).forEach(([e,o])=>{("borderColor"!==e&&"borderWidth"!==e||"none"!==t.value)&&this.view.set(e,o)})}_showView(){const e=this.editor;this._fillViewFormFromCommandValues(),this._balloon.add({view:this.view,position:Wt(e)}),this._undoStepBatch=e.model.createBatch(),this.view.focus()}_hideView(){if(!this._isViewInBalloon)return;const e=this.editor;this.stopListening(e.ui,"update"),this.view.saveButtonView.focus(),this._balloon.remove(this.view),this.editor.editing.view.focus()}get _isViewVisible(){return this._balloon.visibleView===this.view}get _isViewInBalloon(){return this._balloon.hasView(this.view)}_getPropertyChangeCallback(e,t){return(o,n,i,r)=>{(r||t!==i)&&this.editor.execute(e,{value:i,batch:this._undoStepBatch})}}_getValidatedPropertyChangeCallback(e){const{commandName:t,viewField:o,validator:n,errorText:i,defaultValue:r}=e,l=zt(()=>{o.errorText=i},500);return(e,i,s,a)=>{l.cancel(),(a||r!==s)&&(n(s)?(this.editor.execute(t,{value:s,batch:this._undoStepBatch}),o.errorText=null):l())}}}function Jt(e,t){const{viewElement:o,defaultValue:n,modelAttribute:i,styleName:r,reduceBoxSides:l=!1}=t;e.for("upcast").attributeToAttribute({view:{name:o,styles:{[r]:/[\s\S]+/}},model:{key:i,value:e=>{const t=e.getNormalizedStyle(r),o=l?Zt(t):t;if(n!==o)return o}}})}function Xt(e,t,o){e.for("upcast").add(e=>e.on("element:"+t,(e,t,n)=>{if(!t.modelRange)return;const i=["border-top-width","border-top-color","border-top-style","border-bottom-width","border-bottom-color","border-bottom-style","border-right-width","border-right-color","border-right-style","border-left-width","border-left-color","border-left-style"].filter(e=>t.viewItem.hasStyle(e));if(!i.length)return;const r={styles:i};if(!n.consumable.test(t.viewItem,r))return;const l=[...t.modelRange.getItems({shallow:!0})].pop();n.consumable.consume(t.viewItem,r);const s={style:t.viewItem.getNormalizedStyle("border-style"),color:t.viewItem.getNormalizedStyle("border-color"),width:t.viewItem.getNormalizedStyle("border-width")},a={style:Zt(s.style),color:Zt(s.color),width:Zt(s.width)};a.style!==o.style&&n.writer.setAttribute("borderStyle",a.style,l),a.color!==o.color&&n.writer.setAttribute("borderColor",a.color,l),a.width!==o.width&&n.writer.setAttribute("borderWidth",a.width,l)}))}function Yt(e,{modelElement:t,modelAttribute:o,styleName:n}){e.for("downcast").attributeToAttribute({model:{name:t,key:o},view:e=>({key:"style",value:{[n]:e}})})}function Qt(e,{modelAttribute:t,styleName:o}){e.for("downcast").add(e=>e.on(`attribute:${t}:table`,(e,t,n)=>{const{item:i,attributeNewValue:r}=t,{mapper:l,writer:s}=n;if(!n.consumable.consume(t.item,e.name))return;const a=[...l.toViewElement(i).getChildren()].find(e=>e.is("element","table"));r?s.setStyle(o,r,a):s.removeStyle(o,a)}))}function Zt(e){if(!e)return;return["top","right","bottom","left"].map(t=>e[t]).reduce((e,t)=>e==t?e:null)||e}class eo extends n.Command{constructor(e,t,o){super(e),this.attributeName=t,this._defaultValue=o}refresh(){const e=V(this.editor.model.document.selection);this.isEnabled=!!e.length,this.value=this._getSingleValue(e)}execute(e={}){const{value:t,batch:o}=e,n=this.editor.model,i=V(n.document.selection),r=this._getValueToSet(t);n.enqueueChange(o||"default",e=>{r?i.forEach(t=>e.setAttribute(this.attributeName,r,t)):i.forEach(t=>e.removeAttribute(this.attributeName,t))})}_getAttribute(e){if(!e)return;const t=e.getAttribute(this.attributeName);return t!==this._defaultValue?t:void 0}_getValueToSet(e){if(e!==this._defaultValue)return e}_getSingleValue(e){const t=this._getAttribute(e[0]);return e.every(e=>this._getAttribute(e)===t)?t:void 0}}class to extends eo{constructor(e,t){super(e,"padding",t)}_getAttribute(e){if(!e)return;const t=Ut(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}_getValueToSet(e){if((e=Kt(e,"px"))!==this._defaultValue)return e}}class oo extends eo{constructor(e,t){super(e,"width",t)}_getValueToSet(e){if((e=Kt(e,"px"))!==this._defaultValue)return e}}class no extends eo{constructor(e,t){super(e,"height",t)}_getValueToSet(e){return(e=Kt(e,"px"))===this._defaultValue?null:e}}class io extends eo{constructor(e,t){super(e,"backgroundColor",t)}}class ro extends eo{constructor(e,t){super(e,"verticalAlignment",t)}}class lo extends eo{constructor(e,t){super(e,"horizontalAlignment",t)}}class so extends eo{constructor(e,t){super(e,"borderStyle",t)}_getAttribute(e){if(!e)return;const t=Ut(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}}class ao extends eo{constructor(e,t){super(e,"borderColor",t)}_getAttribute(e){if(!e)return;const t=Ut(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}}class co extends eo{constructor(e,t){super(e,"borderWidth",t)}_getAttribute(e){if(!e)return;const t=Ut(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}_getValueToSet(e){if((e=Kt(e,"px"))!==this._defaultValue)return e}}const uo=/^(top|middle|bottom)$/,ho=/^(left|center|right|justify)$/;class bo extends n.Plugin{static get pluginName(){return"TableCellPropertiesEditing"}static get requires(){return[ye]}init(){const e=this.editor,t=e.model.schema,o=e.conversion;e.config.define("table.tableCellProperties.defaultProperties",{});const n=$t(e.config.get("table.tableCellProperties.defaultProperties"),{includeVerticalAlignmentProperty:!0,includeHorizontalAlignmentProperty:!0,includePaddingProperty:!0,isRightToLeftContent:"rtl"===e.locale.contentLanguageDirection});e.data.addStyleProcessorRules(Ne.addBorderRules),function(e,t,o){e.extend("tableCell",{allowAttributes:["borderWidth","borderColor","borderStyle"]}),Xt(t,"td",o),Xt(t,"th",o),Yt(t,{modelElement:"tableCell",modelAttribute:"borderStyle",styleName:"border-style"}),Yt(t,{modelElement:"tableCell",modelAttribute:"borderColor",styleName:"border-color"}),Yt(t,{modelElement:"tableCell",modelAttribute:"borderWidth",styleName:"border-width"})}(t,o,{color:n.borderColor,style:n.borderStyle,width:n.borderWidth}),e.commands.add("tableCellBorderStyle",new so(e,n.borderStyle)),e.commands.add("tableCellBorderColor",new ao(e,n.borderColor)),e.commands.add("tableCellBorderWidth",new co(e,n.borderWidth)),function(e,t,o){e.extend("tableCell",{allowAttributes:["horizontalAlignment"]}),t.for("downcast").attributeToAttribute({model:{name:"tableCell",key:"horizontalAlignment"},view:e=>({key:"style",value:{"text-align":e}})}),t.for("upcast").attributeToAttribute({view:{name:/^(td|th)$/,styles:{"text-align":ho}},model:{key:"horizontalAlignment",value:e=>{const t=e.getStyle("text-align");return t===o?null:t}}}).attributeToAttribute({view:{name:/^(td|th)$/,attributes:{align:ho}},model:{key:"horizontalAlignment",value:e=>{const t=e.getAttribute("align");return t===o?null:t}}})}(t,o,n.horizontalAlignment),e.commands.add("tableCellHorizontalAlignment",new lo(e,n.horizontalAlignment)),mo(t,o,{modelAttribute:"width",styleName:"width",defaultValue:n.width}),e.commands.add("tableCellWidth",new oo(e,n.width)),mo(t,o,{modelAttribute:"height",styleName:"height",defaultValue:n.height}),e.commands.add("tableCellHeight",new no(e,n.height)),e.data.addStyleProcessorRules(Ne.addPaddingRules),mo(t,o,{modelAttribute:"padding",styleName:"padding",reduceBoxSides:!0,defaultValue:n.padding}),e.commands.add("tableCellPadding",new to(e,n.padding)),e.data.addStyleProcessorRules(Ne.addBackgroundRules),mo(t,o,{modelAttribute:"backgroundColor",styleName:"background-color",defaultValue:n.backgroundColor}),e.commands.add("tableCellBackgroundColor",new io(e,n.backgroundColor)),function(e,t,o){e.extend("tableCell",{allowAttributes:["verticalAlignment"]}),t.for("downcast").attributeToAttribute({model:{name:"tableCell",key:"verticalAlignment"},view:e=>({key:"style",value:{"vertical-align":e}})}),t.for("upcast").attributeToAttribute({view:{name:/^(td|th)$/,styles:{"vertical-align":uo}},model:{key:"verticalAlignment",value:e=>{const t=e.getStyle("vertical-align");return t===o?null:t}}}).attributeToAttribute({view:{name:/^(td|th)$/,attributes:{valign:uo}},model:{key:"verticalAlignment",value:e=>{const t=e.getAttribute("valign");return t===o?null:t}}})}(t,o,n.verticalAlignment),e.commands.add("tableCellVerticalAlignment",new ro(e,n.verticalAlignment))}}function mo(e,t,o){const{modelAttribute:n}=o;e.extend("tableCell",{allowAttributes:[n]}),Jt(t,{viewElement:/^(td|th)$/,...o}),Yt(t,{modelElement:"tableCell",...o})}class go extends n.Plugin{static get pluginName(){return"TableCellProperties"}static get requires(){return[bo,Gt]}}class po extends n.Command{constructor(e,t,o){super(e),this.attributeName=t,this._defaultValue=o}refresh(){const e=this.editor.model.document.selection.getFirstPosition().findAncestor("table");this.isEnabled=!!e,this.value=this._getValue(e)}execute(e={}){const t=this.editor.model,o=t.document.selection,{value:n,batch:i}=e,r=o.getFirstPosition().findAncestor("table"),l=this._getValueToSet(n);t.enqueueChange(i||"default",e=>{l?e.setAttribute(this.attributeName,l,r):e.removeAttribute(this.attributeName,r)})}_getValue(e){if(!e)return;const t=e.getAttribute(this.attributeName);return t!==this._defaultValue?t:void 0}_getValueToSet(e){if(e!==this._defaultValue)return e}}class fo extends po{constructor(e,t){super(e,"backgroundColor",t)}}class wo extends po{constructor(e,t){super(e,"borderColor",t)}_getValue(e){if(!e)return;const t=Ut(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}}class _o extends po{constructor(e,t){super(e,"borderStyle",t)}_getValue(e){if(!e)return;const t=Ut(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}}class ko extends po{constructor(e,t){super(e,"borderWidth",t)}_getValue(e){if(!e)return;const t=Ut(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}_getValueToSet(e){if((e=Kt(e,"px"))!==this._defaultValue)return e}}class vo extends po{constructor(e,t){super(e,"width",t)}_getValueToSet(e){if((e=Kt(e,"px"))!==this._defaultValue)return e}}class Co extends po{constructor(e,t){super(e,"height",t)}_getValueToSet(e){return(e=Kt(e,"px"))===this._defaultValue?null:e}}class yo extends po{constructor(e,t){super(e,"alignment",t)}}const To=/^(left|center|right)$/,xo=/^(left|none|right)$/;class Ao extends n.Plugin{static get pluginName(){return"TablePropertiesEditing"}static get requires(){return[ye]}init(){const e=this.editor,t=e.model.schema,o=e.conversion;e.config.define("table.tableProperties.defaultProperties",{});const n=$t(e.config.get("table.tableProperties.defaultProperties"),{includeAlignmentProperty:!0});e.data.addStyleProcessorRules(Ne.addBorderRules),function(e,t,o){e.extend("table",{allowAttributes:["borderWidth","borderColor","borderStyle"]}),Xt(t,"table",o),Qt(t,{modelAttribute:"borderColor",styleName:"border-color"}),Qt(t,{modelAttribute:"borderStyle",styleName:"border-style"}),Qt(t,{modelAttribute:"borderWidth",styleName:"border-width"})}(t,o,{color:n.borderColor,style:n.borderStyle,width:n.borderWidth}),e.commands.add("tableBorderColor",new wo(e,n.borderColor)),e.commands.add("tableBorderStyle",new _o(e,n.borderStyle)),e.commands.add("tableBorderWidth",new ko(e,n.borderWidth)),function(e,t,o){e.extend("table",{allowAttributes:["alignment"]}),t.for("downcast").attributeToAttribute({model:{name:"table",key:"alignment"},view:e=>({key:"style",value:{float:"center"===e?"none":e}}),converterPriority:"high"}),t.for("upcast").attributeToAttribute({view:{name:/^(table|figure)$/,styles:{float:xo}},model:{key:"alignment",value:e=>{let t=e.getStyle("float");return"none"===t&&(t="center"),t===o?null:t}}}).attributeToAttribute({view:{attributes:{align:To}},model:{name:"table",key:"alignment",value:e=>{const t=e.getAttribute("align");return t===o?null:t}}})}(t,o,n.alignment),e.commands.add("tableAlignment",new yo(e,n.alignment)),Vo(t,o,{modelAttribute:"width",styleName:"width",defaultValue:n.width}),e.commands.add("tableWidth",new vo(e,n.width)),Vo(t,o,{modelAttribute:"height",styleName:"height",defaultValue:n.height}),e.commands.add("tableHeight",new Co(e,n.height)),e.data.addStyleProcessorRules(Ne.addBackgroundRules),function(e,t,o){const{modelAttribute:n}=o;e.extend("table",{allowAttributes:[n]}),Jt(t,{viewElement:"table",...o}),Qt(t,o)}(t,o,{modelAttribute:"backgroundColor",styleName:"background-color",defaultValue:n.backgroundColor}),e.commands.add("tableBackgroundColor",new fo(e,n.backgroundColor))}}function Vo(e,t,o){const{modelAttribute:n}=o;e.extend("table",{allowAttributes:[n]}),Jt(t,{viewElement:/^(table|figure)$/,...o}),Yt(t,{modelElement:"table",...o})}o(28);const So={left:n.icons.objectLeft,center:n.icons.objectCenter,right:n.icons.objectRight};class Ro extends xe.View{constructor(e,t){super(e),this.set({borderStyle:"",borderWidth:"",borderColor:"",backgroundColor:"",width:"",height:"",alignment:""}),this.options=t;const{borderStyleDropdown:o,borderWidthInput:n,borderColorInput:i,borderRowLabel:r}=this._createBorderFields(),{backgroundRowLabel:l,backgroundInput:s}=this._createBackgroundFields(),{widthInput:c,operatorLabel:d,heightInput:u,dimensionsLabel:h}=this._createDimensionFields(),{alignmentToolbar:b,alignmentLabel:m}=this._createAlignmentFields();this.focusTracker=new a.FocusTracker,this.keystrokes=new a.KeystrokeHandler,this.children=this.createCollection(),this.borderStyleDropdown=o,this.borderWidthInput=n,this.borderColorInput=i,this.backgroundInput=s,this.widthInput=c,this.heightInput=u,this.alignmentToolbar=b;const{saveButtonView:g,cancelButtonView:p}=this._createActionButtons();this.saveButtonView=g,this.cancelButtonView=p,this._focusables=new xe.ViewCollection,this._focusCycler=new xe.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.children.add(new xe.FormHeaderView(e,{label:this.t("Table properties")})),this.children.add(new rt(e,{labelView:r,children:[r,o,i,n],class:"ck-table-form__border-row"})),this.children.add(new rt(e,{labelView:l,children:[l,s],class:"ck-table-form__background-row"})),this.children.add(new rt(e,{children:[new rt(e,{labelView:h,children:[h,c,d,u],class:"ck-table-form__dimensions-row"}),new rt(e,{labelView:m,children:[m,b],class:"ck-table-properties-form__alignment-row"})]})),this.children.add(new rt(e,{children:[this.saveButtonView,this.cancelButtonView],class:"ck-table-form__action-row"})),this.setTemplate({tag:"form",attributes:{class:["ck","ck-form","ck-table-form","ck-table-properties-form"],tabindex:"-1"},children:this.children})}render(){super.render(),Object(xe.submitHandler)({view:this}),[this.borderStyleDropdown,this.borderColorInput,this.borderWidthInput,this.backgroundInput,this.widthInput,this.heightInput,this.alignmentToolbar,this.saveButtonView,this.cancelButtonView].forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createBorderFields(){const e=this.options.defaultTableProperties,t={style:e.borderStyle,width:e.borderWidth,color:e.borderColor},o=nt({colorConfig:this.options.borderColors,columns:5,defaultColorValue:t.color}),n=this.locale,i=this.t,r=new xe.LabelView(n);r.text=i("Border");const l=Ge(this.t),s=new xe.LabeledFieldView(n,xe.createLabeledDropdown);s.set({label:i("Style"),class:"ck-table-form__border-style"}),s.fieldView.buttonView.set({isOn:!1,withText:!0,tooltip:i("Style")}),s.fieldView.buttonView.bind("label").to(this,"borderStyle",e=>l[e||"none"]),s.fieldView.on("execute",e=>{this.borderStyle=e.source._borderStyleValue}),s.bind("isEmpty").to(this,"borderStyle",e=>!e),Object(xe.addListToDropdown)(s.fieldView,et(this,t.style));const a=new xe.LabeledFieldView(n,xe.createLabeledInputText);a.set({label:i("Width"),class:"ck-table-form__border-width"}),a.fieldView.bind("value").to(this,"borderWidth"),a.bind("isEnabled").to(this,"borderStyle",Io),a.fieldView.on("input",()=>{this.borderWidth=a.fieldView.element.value});const c=new xe.LabeledFieldView(n,o);return c.set({label:i("Color"),class:"ck-table-form__border-color"}),c.fieldView.bind("value").to(this,"borderColor"),c.bind("isEnabled").to(this,"borderStyle",Io),c.fieldView.on("input",()=>{this.borderColor=c.fieldView.value}),this.on("change:borderStyle",(e,o,n,i)=>{Io(n)||(this.borderColor="",this.borderWidth=""),Io(i)||(this.borderColor=t.color,this.borderWidth=t.width)}),{borderRowLabel:r,borderStyleDropdown:s,borderColorInput:c,borderWidthInput:a}}_createBackgroundFields(){const e=this.locale,t=this.t,o=new xe.LabelView(e);o.text=t("Background");const n=nt({colorConfig:this.options.backgroundColors,columns:5,defaultColorValue:this.options.defaultTableProperties.backgroundColor}),i=new xe.LabeledFieldView(e,n);return i.set({label:t("Color"),class:"ck-table-properties-form__background"}),i.fieldView.bind("value").to(this,"backgroundColor"),i.fieldView.on("input",()=>{this.backgroundColor=i.fieldView.value}),{backgroundRowLabel:o,backgroundInput:i}}_createDimensionFields(){const e=this.locale,t=this.t,o=new xe.LabelView(e);o.text=t("Dimensions");const n=new xe.LabeledFieldView(e,xe.createLabeledInputText);n.set({label:t("Width"),class:"ck-table-form__dimensions-row__width"}),n.fieldView.bind("value").to(this,"width"),n.fieldView.on("input",()=>{this.width=n.fieldView.element.value});const i=new xe.View(e);i.setTemplate({tag:"span",attributes:{class:["ck-table-form__dimension-operator"]},children:[{text:"×"}]});const r=new xe.LabeledFieldView(e,xe.createLabeledInputText);return r.set({label:t("Height"),class:"ck-table-form__dimensions-row__height"}),r.fieldView.bind("value").to(this,"height"),r.fieldView.on("input",()=>{this.height=r.fieldView.element.value}),{dimensionsLabel:o,widthInput:n,operatorLabel:i,heightInput:r}}_createAlignmentFields(){const e=this.locale,t=this.t,o=new xe.LabelView(e);o.text=t("Alignment");const n=new xe.ToolbarView(e);return n.set({isCompact:!0,ariaLabel:t("Table alignment toolbar")}),tt({view:this,icons:So,toolbar:n,labels:this._alignmentLabels,propertyName:"alignment",defaultValue:this.options.defaultTableProperties.alignment}),{alignmentLabel:o,alignmentToolbar:n}}_createActionButtons(){const e=this.locale,t=this.t,o=new xe.ButtonView(e),i=new xe.ButtonView(e),r=[this.borderWidthInput,this.borderColorInput,this.backgroundInput,this.widthInput,this.heightInput];return o.set({label:t("Save"),icon:n.icons.check,class:"ck-button-save",type:"submit",withText:!0}),o.bind("isEnabled").toMany(r,"errorText",(...e)=>e.every(e=>!e)),i.set({label:t("Cancel"),icon:n.icons.cancel,class:"ck-button-cancel",withText:!0}),i.delegate("execute").to(this,"cancel"),{saveButtonView:o,cancelButtonView:i}}get _alignmentLabels(){const e=this.locale,t=this.t,o=t("Align table to the left"),n=t("Center table"),i=t("Align table to the right");return"rtl"===e.uiLanguageDirection?{right:i,center:n,left:o}:{left:o,center:n,right:i}}}function Io(e){return"none"!==e}const Po={borderStyle:"tableBorderStyle",borderColor:"tableBorderColor",borderWidth:"tableBorderWidth",backgroundColor:"tableBackgroundColor",width:"tableWidth",height:"tableHeight",alignment:"tableAlignment"};class Eo extends n.Plugin{static get requires(){return[xe.ContextualBalloon]}static get pluginName(){return"TablePropertiesUI"}constructor(e){super(e),e.config.define("table.tableProperties",{borderColors:ot,backgroundColors:ot})}init(){const e=this.editor,t=e.t;this._defaultTableProperties=$t(e.config.get("table.tableProperties.defaultProperties"),{includeAlignmentProperty:!0}),this._balloon=e.plugins.get(xe.ContextualBalloon),this.view=this._createPropertiesView(),this._undoStepBatch=null,e.ui.componentFactory.add("tableProperties",o=>{const n=new xe.ButtonView(o);n.set({label:t("Table properties"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8 2v5h4V2h1v5h5v1h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5H7v-5H2v-1h5V8H2V7h5V2h1zm4 6H8v4h4V8z" opacity=".6"/><path d="m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43L15.5 11.5zM17 1a2 2 0 0 1 2 2v9.475l-.85-.124-.857-1.736a2.048 2.048 0 0 0-.292-.44L17 3H3v14h7.808l.402.392L10.935 19H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h14z"/></svg>',tooltip:!0}),this.listenTo(n,"execute",()=>this._showView());const i=Object.values(Po).map(t=>e.commands.get(t));return n.bind("isEnabled").toMany(i,"isEnabled",(...e)=>e.some(e=>e)),n})}destroy(){super.destroy(),this.view.destroy()}_createPropertiesView(){const e=this.editor,t=e.config.get("table.tableProperties"),o=Object(xe.normalizeColorOptions)(t.borderColors),n=Object(xe.getLocalizedColorOptions)(e.locale,o),i=Object(xe.normalizeColorOptions)(t.backgroundColors),r=Object(xe.getLocalizedColorOptions)(e.locale,i),l=new Ro(e.locale,{borderColors:n,backgroundColors:r,defaultTableProperties:this._defaultTableProperties}),s=e.t;l.render(),this.listenTo(l,"submit",()=>{this._hideView()}),this.listenTo(l,"cancel",()=>{this._undoStepBatch.operations.length&&e.execute("undo",this._undoStepBatch),this._hideView()}),l.keystrokes.set("Esc",(e,t)=>{this._hideView(),t()}),Object(xe.clickOutsideHandler)({emitter:l,activator:()=>this._isViewInBalloon,contextElements:[this._balloon.view.element],callback:()=>this._hideView()});const a=Je(s),c=Xe(s);return l.on("change:borderStyle",this._getPropertyChangeCallback("tableBorderStyle",this._defaultTableProperties.borderStyle)),l.on("change:borderColor",this._getValidatedPropertyChangeCallback({viewField:l.borderColorInput,commandName:"tableBorderColor",errorText:a,validator:Ye,defaultValue:this._defaultTableProperties.borderColor})),l.on("change:borderWidth",this._getValidatedPropertyChangeCallback({viewField:l.borderWidthInput,commandName:"tableBorderWidth",errorText:c,validator:Ze,defaultValue:this._defaultTableProperties.borderWidth})),l.on("change:backgroundColor",this._getValidatedPropertyChangeCallback({viewField:l.backgroundInput,commandName:"tableBackgroundColor",errorText:a,validator:Ye,defaultValue:this._defaultTableProperties.backgroundColor})),l.on("change:width",this._getValidatedPropertyChangeCallback({viewField:l.widthInput,commandName:"tableWidth",errorText:c,validator:Qe,defaultValue:this._defaultTableProperties.width})),l.on("change:height",this._getValidatedPropertyChangeCallback({viewField:l.heightInput,commandName:"tableHeight",errorText:c,validator:Qe,defaultValue:this._defaultTableProperties.height})),l.on("change:alignment",this._getPropertyChangeCallback("tableAlignment",this._defaultTableProperties.alignment)),l}_fillViewFormFromCommandValues(){const e=this.editor.commands,t=e.get("tableBorderStyle");Object.entries(Po).map(([t,o])=>{const n=this._defaultTableProperties[t]||"";return[t,e.get(o).value||n]}).forEach(([e,o])=>{("borderColor"!==e&&"borderWidth"!==e||"none"!==t.value)&&this.view.set(e,o)})}_showView(){const e=this.editor;this.listenTo(e.ui,"update",()=>{this._updateView()}),this._fillViewFormFromCommandValues(),this._balloon.add({view:this.view,position:Dt(e)}),this._undoStepBatch=e.model.createBatch(),this.view.focus()}_hideView(){const e=this.editor;this.stopListening(e.ui,"update"),this.view.saveButtonView.focus(),this._balloon.remove(this.view),this.editor.editing.view.focus()}_updateView(){const e=this.editor;We(e.editing.view.document.selection)?this._isViewVisible&&Ht(e,"table"):this._hideView()}get _isViewVisible(){return this._balloon.visibleView===this.view}get _isViewInBalloon(){return this._balloon.hasView(this.view)}_getPropertyChangeCallback(e,t){return(o,n,i,r)=>{(r||t!==i)&&this.editor.execute(e,{value:i,batch:this._undoStepBatch})}}_getValidatedPropertyChangeCallback(e){const{commandName:t,viewField:o,validator:n,errorText:i,defaultValue:r}=e,l=zt(()=>{o.errorText=i},500);return(e,i,s,a)=>{l.cancel(),(a||r!==s)&&(n(s)?(this.editor.execute(t,{value:s,batch:this._undoStepBatch}),o.errorText=null):l())}}}class Bo extends n.Plugin{static get pluginName(){return"TableProperties"}static get requires(){return[Ao,Eo]}}function Oo(e){e.document.registerPostFixer(t=>function(e,t){const o=t.document.differ.getChanges();let n=!1;for(const t of o){if("insert"!=t.type)continue;if(t.position.parent.is("element","table")||"table"==t.name){const o="table"==t.name?t.position.nodeAfter:t.position.parent,i=Array.from(o.getChildren()).filter(e=>e.is("element","caption")),r=i.shift();if(!r)continue;for(const t of i)e.move(e.createRangeIn(t),r,"end"),e.remove(t);r.nextSibling&&(e.move(e.createRangeOn(r),o,"end"),n=!0),n=!!i.length||n}}return n}(t,e))}function Lo(e){return!!e&&e.is("element","table")}function No(e){for(const t of e.getChildren())if(t.is("element","caption"))return t;return null}function zo(e){const t=e.parent;return"figcaption"==e.name&&t&&"figure"==t.name&&t.hasClass("table")||"caption"==e.name&&t&&"table"==t.name?{name:!0}:null}function Mo(e){const t=e.getSelectedElement();return t&&t.is("element","table")?t:e.getFirstPosition().findAncestor("table")}class Fo extends n.Command{refresh(){const e=Mo(this.editor.model.document.selection);this.isEnabled=!!e,this.isEnabled?this.value=!!No(e):this.value=!1}execute(e={}){const{focusCaptionOnShow:t}=e;this.editor.model.change(e=>{this.value?this._hideTableCaption(e):this._showTableCaption(e,t)})}_showTableCaption(e,t){const o=Mo(this.editor.model.document.selection),n=this.editor.plugins.get("TableCaptionEditing")._getSavedCaption(o)||e.createElement("caption");e.append(n,o),t&&e.setSelection(n,"in")}_hideTableCaption(e){const t=Mo(this.editor.model.document.selection),o=this.editor.plugins.get("TableCaptionEditing"),n=No(t);o._saveCaption(t,n),e.setSelection(e.createRangeIn(t.getChild(0).getChild(0))),e.remove(n)}}class Ho extends n.Plugin{static get pluginName(){return"TableCaptionEditing"}constructor(e){super(e),this._savedCaptionsMap=new WeakMap}init(){const e=this.editor,t=e.model.schema,o=e.editing.view,n=e.t;t.isRegistered("caption")?t.extend("caption",{allowIn:"table"}):t.register("caption",{allowIn:"table",allowContentOf:"$block",isLimit:!0}),e.commands.add("toggleTableCaption",new Fo(this.editor)),e.conversion.for("upcast").elementToElement({view:zo,model:"caption"}),e.conversion.for("dataDowncast").elementToElement({model:"caption",view:(e,{writer:t})=>Lo(e.parent)?t.createContainerElement("figcaption"):null}),e.conversion.for("editingDowncast").elementToElement({model:"caption",view:(e,{writer:t})=>{if(!Lo(e.parent))return null;const r=t.createEditableElement("figcaption");return t.setCustomProperty("tableCaption",!0,r),Object(Ne.enablePlaceholder)({view:o,element:r,text:n("Enter table caption"),keepOnFocus:!0}),Object(i.toWidgetEditable)(r,t)}}),Oo(e.model)}_getSavedCaption(e){const t=this._savedCaptionsMap.get(e);return t?Ne.Element.fromJSON(t):null}_saveCaption(e,t){this._savedCaptionsMap.set(e,t.toJSON())}}class Do extends n.Plugin{static get pluginName(){return"TableCaptionUI"}init(){const e=this.editor,t=e.editing.view,o=e.t;e.ui.componentFactory.add("toggleTableCaption",i=>{const r=e.commands.get("toggleTableCaption"),l=new xe.ButtonView(i);return l.set({icon:n.icons.caption,tooltip:!0,isToggleable:!0}),l.bind("isOn","isEnabled").to(r,"value","isEnabled"),l.bind("label").to(r,"value",e=>o(e?"Toggle caption off":"Toggle caption on")),this.listenTo(l,"execute",()=>{if(e.execute("toggleTableCaption",{focusCaptionOnShow:!0}),r.value){const o=function(e){const t=Mo(e);return t?No(t):null}(e.model.document.selection),n=e.editing.mapper.toViewElement(o);if(!n)return;t.scrollToTheSelection(),t.change(e=>{e.addClass("table__caption_highlighted",n)})}}),l})}}o(30);class Wo extends n.Plugin{static get pluginName(){return"TableCaption"}static get requires(){return[Ho,Do]}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/af.js b/core/assets/vendor/ckeditor5/translations/af.js
new file mode 100644
index 0000000000000000000000000000000000000000..a47679be3616b2178bf5d092a329519af3edea0a
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/af.js
@@ -0,0 +1 @@
+!function(n){const i=n.af=n.af||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Belyn in die middel","Align left":"Belyn links","Align right":"Belyn regs",Justify:"Belyn beide kante","Text alignment":"Teksbelyning","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.af=e.af||{};r.dictionary=Object.assign(r.dictionary||{},{Bold:"Vetgedruk",Code:"Kode",Italic:"Skuinsgedruk",Strikethrough:"Deurgetrek",Subscript:"Onderskrif",Superscript:"Boskrif",Underline:"Onderstreep"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.af=n.af||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blok-aanhaling"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.af=i.af||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"Verwyder formatering"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.af=e.af||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Cancel:"Kanselleer","Remove color":"","Restore default":"",Save:"Berg","Show more items":""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/ar.js b/core/assets/vendor/ckeditor5/translations/ar.js
new file mode 100644
index 0000000000000000000000000000000000000000..300806d6a9e6f22dca38ad4ae3b67b751b36499a
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/ar.js
@@ -0,0 +1 @@
+!function(n){const i=n.ar=n.ar||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"محاذاة في المنتصف","Align left":"محاذاة لليسار","Align right":"محاذاة لليمين",Justify:"ضبط","Text alignment":"محاذاة النص","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ar=i.ar||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"عريض",Code:"شفرة برمجية",Italic:"مائل",Strikethrough:"يتوسطه خط",Subscript:"",Superscript:"",Underline:"تحته خط"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ar=i.ar||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"اقتباس"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.ar=n.ar||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"اختر عنوان",Heading:"عنوان","Heading 1":"عنوان 1","Heading 2":"عنوان 2","Heading 3":"عنوان 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"فقرة","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ar=e.ar||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"صورة بالوسط","Change image text alternative":"غير النص البديل للصورة","Enter image caption":"ادخل عنوان الصورة","Full size image":"صورة بحجم كامل","Image resize list":"","Image toolbar":"","image widget":"عنصر الصورة","In line":"",Insert:"","Insert image":"ادراج صورة","Insert image via URL":"","Left aligned image":"صورة بمحاذاة لليسار",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"صورة بمحاذاة لليمين","Side image":"صورة جانبية","Text alternative":"النص البديل",Update:"","Update image URL":"","Upload failed":"فشل الرفع","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ar=n.ar||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"تحرير الرابط",Link:"رابط","Link image":"","Link URL":"رابط عنوان","Open in a new tab":"","Open link in new tab":"فتح الرابط في تبويب جديد","This link has no URL":"لا يحتوي هذا الرابط على عنوان",Unlink:"إلغاء الرابط"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ar=e.ar||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"قائمة نقطية","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"قائمة رقمية","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ar=e.ar||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"قم بمحاذاة نص الخلية للاسفل","Align cell text to the center":"قم بمحاذاة نص الخلية إلى المركز","Align cell text to the left":"قم بمحاذاة نص الخلية إلى اليسار","Align cell text to the middle":"قم بمحاذاة نص الخلية إلى المنتصف","Align cell text to the right":"قم بمحاذاة نص الخلية إلى اليمين","Align cell text to the top":"قم بمحاذاة نص الخلية إلى الأعلى","Align table to the left":"قم بمحاذاة الجدول إلى اليسار","Align table to the right":"قم بمحاذاة الجدول إلى اليمين",Alignment:"المحاذاة",Background:"الخلفية",Border:"الحدود","Cell properties":"خصائص الخلية","Center table":"قم بمحاذاة الجدول إلى المنتصف",Color:"اللون","Color picker":"",Column:"عمود",Dashed:"متقطع","Delete column":"حذف العمود","Delete row":"حذف الصف",Dimensions:"الابعاد",Dotted:"منقط",Double:"","Enter table caption":"",Groove:"","Header column":"عمود عنوان","Header row":"صف عنوان",Height:"الارتفاع","Horizontal text alignment toolbar":"شريط أدوات محاذاة النص الأفقي","Insert column left":"أدخل العمود إلى اليسار","Insert column right":"أدخل العمود إلى اليمين","Insert row above":"ادراج صف قبل","Insert row below":"ادراج صف بعد","Insert table":"إدراج جدول",Inset:"","Justify cell text":"ضبط نص الخلية","Merge cell down":"دمج الخلايا للأسفل","Merge cell left":"دمج الخلايا لليسار","Merge cell right":"دمج الخلايا لليمين","Merge cell up":"دمج الخلايا للأعلى","Merge cells":"دمج الخلايا",None:"لا شيء",Outset:"",Padding:"الحاشية",Ridge:"",Row:"صف","Select column":"حدد العمود","Select row":"حدد صفًا",Solid:"صلب","Split cell horizontally":"فصل الخلايا بشكل افقي","Split cell vertically":"فصل الخلايا بشكل عمودي",Style:"أسلوب","Table alignment toolbar":"شريط أدوات محاذاة الجدول","Table cell text alignment":"محاذاة نص خلية الجدول","Table properties":"خصائص الجدول","Table toolbar":"شريط أدوات الجدول",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"شريط أدوات محاذاة النص العمودي",Width:"العرض"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.ar=e.ar||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"إلغاء","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"إعادة","Remove color":"","Restore default":"","Rich Text Editor":"معالج نصوص","Rich Text Editor, %0":"معالج نصوص، 0%",Save:"حفظ","Show more items":"",Turquoise:"",Undo:"تراجع","Upload in progress":"جاري الرفع",White:"",Yellow:""}),o.getPluralForm=function(e){return 0==e?0:1==e?1:2==e?2:e%100>=3&&e%100<=10?3:e%100>=11&&e%100<=99?4:5}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/ast.js b/core/assets/vendor/ckeditor5/translations/ast.js
new file mode 100644
index 0000000000000000000000000000000000000000..0fb11d5d74e801299fca4feeed72db51c54159a7
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/ast.js
@@ -0,0 +1 @@
+!function(i){const t=i.ast=i.ast||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Negrina",Code:"",Italic:"Cursiva",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.ast=e.ast||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"","Enter image caption":"","Full size image":"Imaxen a tamañu completu","Image resize list":"","Image toolbar":"","image widget":"complementu d'imaxen","In line":"",Insert:"","Insert image":"","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"Imaxen llateral","Text alternative":"",Update:"","Update image URL":"","Upload failed":"","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ast=n.ast||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"",Link:"Enllazar","Link image":"","Link URL":"URL del enllaz","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"Desenllazar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ast=e.ast||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Llista con viñetes","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Llista numberada","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.ast=e.ast||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Encaboxar","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Refacer","Remove color":"","Restore default":"","Rich Text Editor":"Editor de testu arriquecíu","Rich Text Editor, %0":"Editor de testu arriquecíu, %0",Save:"Guardar","Show more items":"",Turquoise:"",Undo:"Desfacer",White:"",Yellow:""}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/az.js b/core/assets/vendor/ckeditor5/translations/az.js
new file mode 100644
index 0000000000000000000000000000000000000000..ce43bd147f9c57fd0d3c38ba02a69c1917195eaa
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/az.js
@@ -0,0 +1 @@
+!function(n){const i=n.az=n.az||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Mərkəzə düzləndir","Align left":"Soldan düzləndir","Align right":"Sağdan düzləndir",Justify:"Eninə görə","Text alignment":"Mətn düzləndirməsi","Text alignment toolbar":"Mətnin düzləndirmə paneli"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const i=a.az=a.az||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Yarıqalın",Code:"Kod",Italic:"Maili",Strikethrough:"Qaralanmış",Subscript:"Alt yazı",Superscript:"Üst yazı",Underline:"Altdan xətt"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.az=i.az||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Sitat bloku"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const n=a.az=a.az||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Başlıqı seç",Heading:"Başlıq","Heading 1":"Başlıq 1","Heading 2":"Başlıq 2","Heading 3":"Başlıq 3","Heading 4":"Başlıq 4","Heading 5":"Başlıq 5","Heading 6":"Başlıq 6",Paragraph:"Abzas","Type or paste your content here.":"","Type your title":"Başlığınızı yazın"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.az=i.az||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Üfüqi xətt"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.az=e.az||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Mərkəzə düzləndir","Change image text alternative":"Alternativ mətni redaktə et","Enter image caption":"Şəkil başlığı daxil edin","Full size image":"Tam ölçülü şəkili","Image resize list":"","Image toolbar":"Şəkil paneli","image widget":"Şəkil vidgetı","In line":"",Insert:"","Insert image":"Şəkili əlavə et","Insert image via URL":"","Left aligned image":"Soldan düzləndir",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Sağdan düzləndir","Side image":"Yan şəkil","Text alternative":"Alternativ mətn",Update:"","Update image URL":"","Upload failed":"Şəkili serverə yüklə","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.az=i.az||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Boş yeri kiçilt","Increase indent":"Boş yeri böyüt"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.az=n.az||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Yüklənə bilər","Edit link":"Linki redaktə et",Link:"Əlaqələndir","Link image":"","Link URL":"Linkin URL","Open in a new tab":"Yeni pəncərədə aç","Open link in new tab":"Linki yeni pəncərədə aç","This link has no URL":"Bu linkdə URL yoxdur",Unlink:"Linki sil"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.az=e.az||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Markerlənmiş siyahı","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Nömrələnmiş siyahı","Numbered list styles toolbar":"",Square:"","To-do List":"To-do siyahı","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.az=o.az||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"Formatı Ləğv Et"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(l){const e=l.az=l.az||{};e.dictionary=Object.assign(e.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"Fon",Border:"Sərhəd","Cell properties":"","Center table":"",Color:"Rəng","Color picker":"",Column:"Sütun",Dashed:"","Delete column":"Sütunları sil","Delete row":"Sətirləri sil",Dimensions:"Ölçülər",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Başlıqlı sütun","Header row":"Başlıqlı sətir",Height:"Hündürlük","Horizontal text alignment toolbar":"","Insert column left":"Sola sütun əlavə et","Insert column right":"Sağa sütun əlavə et","Insert row above":"Aşağıya sətir əlavə et","Insert row below":"Yuxarıya sətir əlavə et","Insert table":"Cədvəli əlavə et",Inset:"","Justify cell text":"","Merge cell down":"Xanaları aşağı birləşdir","Merge cell left":"Xanaları sola birləşdir","Merge cell right":"Xanaları sağa birləşdir","Merge cell up":"Xanaları yuxarı birləşdir","Merge cells":"Xanaları birləşdir",None:"",Outset:"",Padding:"",Ridge:"",Row:"Sətir","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Xanaları üfüqi böl","Split cell vertically":"Xanaları şaquli böl",Style:"","Table alignment toolbar":"","Table cell text alignment":"Cədvəl hüceyrəsi mətninin uyğunlaşdırılması","Table properties":"Cədvəl xüsusiyyətləri","Table toolbar":"Cədvəl paneli",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:"Eni"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.az=e.az||{};a.dictionary=Object.assign(a.dictionary||{},{"%0 of %1":"%1-dən %0",Aquamarine:"Akvamarin",Black:"Qara",Blue:"Mavi",Cancel:"İmtina et","Dim grey":"Tünd boz","Dropdown toolbar":"Açılan paneli","Edit block":"Redaktə etmək bloku","Editor toolbar":"Redaktorun paneli",Green:"Yaşıl",Grey:"Boz","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Açıq mavi","Light green":"Açıq yaşıl","Light grey":"Açıq boz",Next:"Növbəti",Orange:"Narıncı",Previous:"Əvvəlki",Purple:"Bənövşəyi",Red:"Qırmızı",Redo:"Təkrar et","Remove color":"Rəngi ləğv et","Restore default":"","Rich Text Editor":"Rich Text Redaktoru","Rich Text Editor, %0":"Rich Text Redaktoru, %0",Save:"Yadda saxla","Show more items":"Daha çox əşyanı göstərin",Turquoise:"Firuzəyi",Undo:"İmtina et","Upload in progress":"Yüklənir",White:"Ağ","Widget toolbar":"Vidgetin paneli",Yellow:"Sarı"}),a.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/bg.js b/core/assets/vendor/ckeditor5/translations/bg.js
new file mode 100644
index 0000000000000000000000000000000000000000..097c0f4f9771f7a8dc520687f74f725c8d4a54b5
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/bg.js
@@ -0,0 +1 @@
+!function(i){const n=i.bg=i.bg||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Удебелен",Code:"",Italic:"Курсив",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.bg=i.bg||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитат"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.bg=n.bg||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Избери заглавие",Heading:"Заглавие","Heading 1":"Заглавие 1","Heading 2":"Заглавие 2","Heading 3":"Заглавие 3","Heading 4":"Заглавие 4","Heading 5":"Заглавие 5","Heading 6":"Заглавие 6",Paragraph:"Параграф","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.bg=e.bg||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"","Enter image caption":"","Full size image":"","Image resize list":"","Image toolbar":"","image widget":"Компонент за изображение","In line":"",Insert:"","Insert image":"Вмъкни изображение","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"","Text alternative":"",Update:"","Update image URL":"","Upload failed":"","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.bg=n.bg||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Намали отстъпа","Increase indent":"Увеличи отстъпа"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.bg=n.bg||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Изтегляне","Edit link":"Редакция на линк",Link:"Линк","Link image":"","Link URL":"Уеб адрес на линка","Open in a new tab":"Отваряне в нов раздел","Open link in new tab":"Отваряне на линк в нов раздел","This link has no URL":"Този линк няма уеб адрес",Unlink:"Премахване на линка"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.bg=e.bg||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Водещи символи","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Номериране","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.bg=e.bg||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Колона",Dashed:"","Delete column":"Изтриване на колона","Delete row":"Изтриване на ред",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Заглавна колона","Header row":"Заглавен ред",Height:"","Horizontal text alignment toolbar":"","Insert column left":"Вмъкни колона отляво","Insert column right":"Вмъкни колона отдясно","Insert row above":"Вмъкни ред отгоре","Insert row below":"Вмъкни ред отдолу","Insert table":"Вмъкни таблица",Inset:"","Justify cell text":"","Merge cell down":"Обединяване на клетка надолу","Merge cell left":"Обединяване на клетка отляво","Merge cell right":"Обединяване на клетка отдясно","Merge cell up":"Обединяване на клетка отгоре","Merge cells":"Обединяване на клетки",None:"",Outset:"",Padding:"",Ridge:"",Row:"Ред","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Разделяне на клетки хоризонтално","Split cell vertically":"Разделяне на клетки вертикално",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const e=o.bg=o.bg||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"",Cancel:"Отказ",Redo:"Повтори","Remove color":"","Restore default":"",Save:"Запазване","Show more items":"",Undo:"Отмени","Upload in progress":"Качването е в процес"}),e.getPluralForm=function(o){return 1!=o}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/ca.js b/core/assets/vendor/ckeditor5/translations/ca.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f89e8f5476ba97631a3b56b9996e1c109da75b5
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/ca.js
@@ -0,0 +1 @@
+!function(i){const n=i.ca=i.ca||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Alineació centre","Align left":"Alineació esquerra","Align right":"Alineació dreta",Justify:"Justificar","Text alignment":"Alineació text","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.ca=i.ca||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Negreta",Code:"Codi",Italic:"Cursiva",Strikethrough:"Marcat",Subscript:"",Superscript:"",Underline:"Subrallat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(c){const i=c.ca=c.ca||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Cita de bloc"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.ca=a.ca||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Escull capçalera",Heading:"Capçalera","Heading 1":"Capçalera 1","Heading 2":"Capçalera 2","Heading 3":"Capçalera 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Pàrraf","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const e=o.ca=o.ca||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"",Cancel:"Cancel·lar","Remove color":"","Restore default":"",Save:"Desar","Show more items":""}),e.getPluralForm=function(o){return 1!=o}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/cs.js b/core/assets/vendor/ckeditor5/translations/cs.js
new file mode 100644
index 0000000000000000000000000000000000000000..68194e32c060722e6391e4224ba24d68e7a57a6d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/cs.js
@@ -0,0 +1 @@
+!function(n){const t=n.cs=n.cs||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Zarovnat na střed","Align left":"Zarovnat vlevo","Align right":"Zarovnat vpravo",Justify:"Zarovnat do bloku","Text alignment":"Zarovnání textu","Text alignment toolbar":"Panel nástrojů zarovnání textu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.cs=n.cs||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Tučné",Code:"Kódový blok",Italic:"Kurzíva",Strikethrough:"Přeškrtnuté",Subscript:"Dolní index",Superscript:"Horní index",Underline:"Podtržené"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(c){const i=c.cs=c.cs||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Citace"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.cs=e.cs||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"Zvolte nadpis",Heading:"Nadpis","Heading 1":"Nadpis 1","Heading 2":"Nadpis 2","Heading 3":"Nadpis 3","Heading 4":"Nadpis 4","Heading 5":"Nadpis 5","Heading 6":"Nadpis 6",Paragraph:"Odstavec","Type or paste your content here.":"Zde zadejte nebo vložte obsah.","Type your title":"Sem zadejte název"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.cs=n.cs||{};o.dictionary=Object.assign(o.dictionary||{},{"Horizontal line":"Vodorovná čára"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.cs=e.cs||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Obrázek zarovnaný na střed","Change image text alternative":"Změnit alternativní text obrázku","Enter image caption":"Zadejte popis obrázku","Full size image":"Obrázek v plné velikosti","Image resize list":"Seznam možností změny velikosti","Image toolbar":"Panel nástrojů obrázku","image widget":"ovládací prvek obrázku","In line":"",Insert:"Vložit","Insert image":"Vložit obrázek","Insert image via URL":"Vložit obrázek pomocí URL","Left aligned image":"Obrázek zarovnaný vlevo",Original:"Originální","Resize image":"Změnit velikost","Resize image to %0":"Změnit velikost na %0","Resize image to the original size":"Změnit velikost na původní velikost","Right aligned image":"Obrázek zarovnaný vpravo","Side image":"Postranní obrázek","Text alternative":"Alternativní text",Update:"Aktualizovat","Update image URL":"Aktualizovat URL obrázku","Upload failed":"Nahrání selhalo","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.cs=n.cs||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Zmenšit odsazení","Increase indent":"Zvětšit odsazení"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const n=a.cs=a.cs||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Vybrat jazyk",Language:"Jazyk","Remove language":"Odstranit jazyk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.cs=n.cs||{};a.dictionary=Object.assign(a.dictionary||{},{Downloadable:"Ke stažení","Edit link":"Upravit odkaz",Link:"Odkaz","Link image":"Adresa obrázku","Link URL":"URL odkazu","Open in a new tab":"Otevřít v nové kartě","Open link in new tab":"Otevřít odkaz v nové kartě","This link has no URL":"Tento odkaz nemá žádnou URL",Unlink:"Odstranit odkaz"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.cs=e.cs||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Odrážky","Bulleted list styles toolbar":"Panel seznamu s odrážkami",Circle:"Kruh",Decimal:"Čísla","Decimal with leading zero":"Čísla s nulou na začátku",Disc:"Plný kruh","Lower-latin":"Malá písmena","Lower–roman":"Malé římské čísla","Numbered List":"Číslování","Numbered list styles toolbar":"Panel se styly číslovaného seznamu",Square:"Čtverec","To-do List":"Seznam úkolů","Toggle the circle list style":"Přepnout na seznam s kruhovým označením","Toggle the decimal list style":"Přepnout na číselný seznam","Toggle the decimal with leading zero list style":"Přepnout na číselný seznam s nulou na začátku","Toggle the disc list style":"Přepnout na seznam s označením plného kruhu","Toggle the lower–latin list style":"Přepnout na seznam s malými písmeny","Toggle the lower–roman list style":"Přepnout na seznam s malými římskými čísly","Toggle the square list style":"Přepnout na seznam se čtvercovým označením","Toggle the upper–latin list style":"Přepnout na seznam s velkými písmeny","Toggle the upper–roman list style":"Přepnout na seznam s velkými římskými čísly","Upper-latin":"Velká písmena","Upper-roman":"Velké římské čísla"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.cs=n.cs||{};o.dictionary=Object.assign(o.dictionary||{},{"Remove Format":"Odstranit formátování"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const e=t.cs=t.cs||{};e.dictionary=Object.assign(e.dictionary||{},{"Align cell text to the bottom":"Zarovnat text buňky dolů","Align cell text to the center":"Zarovnat text buňky na střed","Align cell text to the left":"Zarovnat text buňky doleva","Align cell text to the middle":"Zarovnat text buňky na střed","Align cell text to the right":"Zarovnat text buňky doprava","Align cell text to the top":"Zarovnat text buňky nahoru","Align table to the left":"Zarovnat tabulku doleva","Align table to the right":"Zarovnat tabulku doprava",Alignment:"Zarovnání",Background:"Pozadí",Border:"Okraj","Cell properties":"Vlastnosti buňky","Center table":"Centrovat tabulku",Color:"Barva","Color picker":"Vybrat barvu",Column:"Sloupec",Dashed:"Čárkovaná","Delete column":"Smazat sloupec","Delete row":"Smazat řádek",Dimensions:"Rozměry",Dotted:"Tečkovaná",Double:"Dvojitá","Enter table caption":"",Groove:"Drážkovaná","Header column":"Sloupec záhlaví","Header row":"Řádek záhlaví",Height:"Výška","Horizontal text alignment toolbar":"Horizontální zarovnání textu v panelu","Insert column left":"Vložit sloupec vlevo","Insert column right":"Vložit sloupec vpravo","Insert row above":"Vložit řádek před","Insert row below":"Vložit řádek pod","Insert table":"Vložit tabulku",Inset:"Vložená zevnitř","Justify cell text":"Zarovnat text buňky z obou stran","Merge cell down":"Sloučit s buňkou pod","Merge cell left":"Sloučit s buňkou vlevo","Merge cell right":"Sloučit s buňkou vpravo","Merge cell up":"Sloučit s buňkou nad","Merge cells":"Sloučit buňky",None:"Žádná",Outset:"Vložená zvenku",Padding:"Vnitřní okraj",Ridge:"Rámovaná",Row:"Řádek","Select column":"Vybrat sloupec","Select row":"Vybrat řádek",Solid:"Plná","Split cell horizontally":"Rozdělit buňky horizontálně","Split cell vertically":"Rozdělit buňky vertikálně",Style:"Styl","Table alignment toolbar":"Panel zarovnání tabulky","Table cell text alignment":"Zarovnání textu buňky tabulky","Table properties":"Vlastnosti tabulky","Table toolbar":"Panel nástrojů tabulky",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Barva má nesprávný formát. Zkuste "#FF0000", "rgb(255,0,0)" nebo "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Hodnota je nesprávná. Zkuste "10px", "2em" nebo jednoduše "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Vertikální zarovnání textu v panelu",Width:"Šířka"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const t=a.cs=a.cs||{};t.dictionary=Object.assign(t.dictionary||{},{"Almost equal to":"Částečně rovný",Angle:"Úhel","Approximately equal to":"Aproximace","Asterisk operator":"Hvězdička / násobení","Austral sign":"Znak Austral","back with leftwards arrow above":"šipka zpět","Bitcoin sign":"Měna Bitcoin","Cedi sign":"Znak Cedi","Cent sign":"Znak cent","Character categories":"Kategorie znaků","Colon sign":"dvojtečka","Contains as member":"Obsahuje prvek","Copyright sign":"Copyright","Cruzeiro sign":"Měna Cruzeiro","Currency sign":"Znak měny","Degree sign":"Znak stupeň","Division sign":"Dělení","Dollar sign":"Znak Dolar","Dong sign":"Znak Dong","Double dagger":"Dvojkříž","Double exclamation mark":"Dvojitý vykřičník","Double low-9 quotation mark":"Dvojitá spodní uvozovka","Double question mark":"Dvojitý otazník","downwards arrow to bar":"šipka dolů do svislé čáry","downwards dashed arrow":"přerušovaná šipka dolů","downwards double arrow":"dvojitá šipka dolů","Drachma sign":"Znak Drachma","Element of":"Patří / Je součástí","Em dash":"Dlouhá pomlčka","Empty set":"Prázdná množina","En dash":"Pomlčka","end with leftwards arrow above":"šipka konec","Euro sign":"Znak Euro","Euro-currency sign":"Mena Euro","Exclamation question mark":"Vykřičník a otazník","For all":"Pro všechny prvky v množině","Fraction slash":"Lomítko / Dělení","French franc sign":"Měna Francouzský Frank","German penny sign":"Německá penny","Greater-than or equal to":"Větší nebo roven","Greater-than sign":"Větší než","Guarani sign":"Znak Guarani","Horizontal ellipsis":"Tečky","Hryvnia sign":"Znak Hryvnia","Identical to":"Identický k","Indian rupee sign":"Znak Indická rupia",Infinity:"Nekonečno",Integral:"Integrál",Intersection:"Průsečík / Průnik","Inverted exclamation mark":"Obrácený vykřičník","Inverted question mark":"Obrácený otazník","Kip sign":"Znak Kip","Latin capital letter a with breve":"Latinské velké písmeno a s háčkem","Latin capital letter a with macron":"Latinské velké písmeno a s čárou","Latin capital letter a with ogonek":"Latinské velké písmeno a s háčkem","Latin capital letter c with acute":"Latinské velké písmeno c s čárkou","Latin capital letter c with caron":"Latinské veľké písmeno c s mäkčeňom","Latin capital letter c with circumflex":"Latinské velké písmeno c s obráceným háčkem","Latin capital letter c with dot above":"Latinské velké písmeno c s tečkou nad znakem","Latin capital letter d with caron":"Latinské velké písmeno d s háčkem","Latin capital letter d with stroke":"Latinské velké písmeno d s přeškrtnutím","Latin capital letter e with breve":"Latinské velké písmeno e s háčkem","Latin capital letter e with caron":"Latinské velké písmeno e s háčkem","Latin capital letter e with dot above":"Latinské velké písmeno e s tečkou nad znakem","Latin capital letter e with macron":"Latinské velké písmeno e s čárou","Latin capital letter e with ogonek":"Latinské velké písmeno e s háčkem","Latin capital letter eng":"Latinské velké písmeno Eng","Latin capital letter g with breve":"Latinské velké písmeno g s háčkem","Latin capital letter g with cedilla":"Latinské velké písmeno g s háčkem","Latin capital letter g with circumflex":"Latinské velké písmeno g s obráceným háčkem","Latin capital letter g with dot above":"Latinské velké písmeno g s tečkou nad znakem","Latin capital letter h with circumflex":"Latinské velké písmeno h s obráceným háčkem","Latin capital letter h with stroke":"Latinské velké písmeno h s přeškrtnutím","Latin capital letter i with breve":"Latinské velké písmeno i s háčkem","Latin capital letter i with dot above":"Latinské velké písmeno i s tečkou nad znakem","Latin capital letter i with macron":"Latinské velké písmeno i s čárou","Latin capital letter i with ogonek":"Latinské velké písmeno i s háčkem","Latin capital letter i with tilde":"Latinské velké písmeno i s vlnovkou","Latin capital letter j with circumflex":"Latinské velké písmeno j s obráceným háčkem","Latin capital letter k with cedilla":"Latinské velké písmeno k s háčkem","Latin capital letter l with acute":"Latinské velké písmeno l s čárkou","Latin capital letter l with caron":"Latinské velké písmeno l s háčkem","Latin capital letter l with cedilla":"Latinské velké písmeno l s háčkem","Latin capital letter l with middle dot":"Latinské velké písmeno l s tečkou uprostřed","Latin capital letter l with stroke":"Latinské velké písmeno l s přeškrtnutím","Latin capital letter n with acute":"Latinské velké písmeno n s čárkou","Latin capital letter n with caron":"Latinské velké písmeno n s háčkem","Latin capital letter n with cedilla":"Latinské velké písmeno n s háčkem","Latin capital letter o with breve":"Latinské velké písmeno o s háčkem","Latin capital letter o with double acute":"Latinské velké písmeno o s čárkou","Latin capital letter o with macron":"Latinské velké písmeno o s čárou","Latin capital letter r with acute":"Latinské velké písmeno r s čárkou","Latin capital letter r with caron":"Latinské velké písmeno r s háčkem","Latin capital letter r with cedilla":"Latinské velké písmeno r s háčkem","Latin capital letter s with acute":"Latinské velké písmeno s s čárkou","Latin capital letter s with caron":"Latinské velké písmeno s s háčkem","Latin capital letter s with cedilla":"Latinské velké písmeno s s háčkem","Latin capital letter s with circumflex":"Latinské velké písmeno s s obráceným háčkem","Latin capital letter t with caron":"Latinské velké písmeno t s háčkem","Latin capital letter t with cedilla":"Latinské velké písmeno t s háčkem","Latin capital letter t with stroke":"Latinské velké písmeno t s přeškrtnutím","Latin capital letter u with breve":"Latinské velké písmeno u s háčkem","Latin capital letter u with double acute":"Latinské velké písmeno u s dvojitým akcentu","Latin capital letter u with macron":"Latinské velké písmeno u s čárou","Latin capital letter u with ogonek":"Latinské velké písmeno u s háčkem","Latin capital letter u with ring above":"Latinské velké písmeno u s kroužkem nad znakem","Latin capital letter u with tilde":"Latinské velké písmeno u s vlnovkou","Latin capital letter w with circumflex":"Latinské velké písmeno w s obráceným háčkem","Latin capital letter y with circumflex":"Latinské velké písmeno y s obráceným háčkem","Latin capital letter y with diaeresis":"Latinské velké písmeno y s dvojtečkou nad znakem","Latin capital letter z with acute":"Latinské velké písmeno z s čárkou","Latin capital letter z with caron":"Latinské velké písmeno z s háčkem","Latin capital letter z with dot above":"Latinské velké písmeno z s tečkou nad znakem","Latin capital ligature ij":"Latinský velký znak ligatury ij","Latin capital ligature oe":"Latinský velký znak ligatury oe","Latin small letter a with breve":"Latinské malé písmeno a s háčkem","Latin small letter a with macron":"Latinské malé písmeno a s čárou","Latin small letter a with ogonek":"Latinské malé písmeno a s háčkem","Latin small letter c with acute":"Latinské malé písmeno c s čárkou","Latin small letter c with caron":"Latinské malé písmeno c s háčkem","Latin small letter c with circumflex":"Latinské malé písmeno c s obráceným háčkem","Latin small letter c with dot above":"Latinské malé písmeno c s tečkou nad znakem","Latin small letter d with caron":"Latinské malé písmeno d s háčkem","Latin small letter d with stroke":"Latinské malé písmeno d s přeškrtnutím","Latin small letter dotless i":"Latinské malé písmeno i bez tečky","Latin small letter e with breve":"Latinské malé písmeno e s háčkem","Latin small letter e with caron":"Latinské malé písmeno e s háčkem","Latin small letter e with dot above":"Latinské malé písmeno e s tečkou nad znakem","Latin small letter e with macron":"Latinské malé písmeno e s čárou","Latin small letter e with ogonek":"Latinské malé písmeno e s háčkem","Latin small letter eng":"Latinské malé písmeno Eng","Latin small letter f with hook":"Funkce","Latin small letter g with breve":"Latinské malé písmeno g s háčkem","Latin small letter g with cedilla":"Latinské malé písmeno g s háčkem","Latin small letter g with circumflex":"Latinské malé písmeno g s obráceným háčkem","Latin small letter g with dot above":"Latinské malé písmeno g s tečkou nad znakem","Latin small letter h with circumflex":"Latinské malé písmeno h s obráceným háčkem","Latin small letter h with stroke":"Latinské malé písmeno h s přeškrtnutím","Latin small letter i with breve":"Latinské malé písmeno i s háčkem","Latin small letter i with macron":"Latinské malé písmeno i s čárou","Latin small letter i with ogonek":"Latinské malé písmeno i s háčkem","Latin small letter i with tilde":"Latinské malé písmeno i s vlnovkou","Latin small letter j with circumflex":"Latinské malé písmeno j s obráceným háčkem","Latin small letter k with cedilla":"Latinské malé písmeno k s háčkem","Latin small letter kra":"Latinský malý znak Kra","Latin small letter l with acute":"Latinské malé písmeno l s čárkou","Latin small letter l with caron":"Latinské malé písmeno l s háčkem","Latin small letter l with cedilla":"Latinské malé písmeno l s háčkem","Latin small letter l with middle dot":"Latinské malé písmeno l s tečkou uprostřed","Latin small letter l with stroke":"Latinské malé písmeno l s přeškrtnutím","Latin small letter long s":"Malé dlouhé písmeno s","Latin small letter n preceded by apostrophe":"Latinské malé písmeno n s apostrofem","Latin small letter n with acute":"Latinské malé písmeno n s čárkou","Latin small letter n with caron":"Latinské malé písmeno n s háčkem","Latin small letter n with cedilla":"Latinské malé písmeno n s háčkem","Latin small letter o with breve":"Latinské malé písmeno o s háčkem","Latin small letter o with double acute":"Latinské malé písmeno o s čárkou","Latin small letter o with macron":"Latinské malé písmeno o s čárou","Latin small letter r with acute":"Latinské malé písmeno r s čárkou","Latin small letter r with caron":"Latinské malé písmeno r s háčkem","Latin small letter r with cedilla":"Latinské malé písmeno r s háčkem","Latin small letter s with acute":"Latinské malé písmeno s s čárkou","Latin small letter s with caron":"Latinské malé písmeno s s háčkem","Latin small letter s with cedilla":"Latinské malé písmeno s s háčkem","Latin small letter s with circumflex":"Latinské malé písmeno s s obráceným háčkem","Latin small letter t with caron":"Latinské malé písmeno t s háčkem","Latin small letter t with cedilla":"Latinské malé písmeno t s háčkem","Latin small letter t with stroke":"Latinské malé písmeno t s přeškrtnutím","Latin small letter u with breve":"Latinské malé písmeno u s háčkem","Latin small letter u with double acute":"Latinské malé písmeno u s dvojitým akcentu","Latin small letter u with macron":"Latinské malé písmeno o s čárou","Latin small letter u with ogonek":"Latinské malé písmeno u s háčkem","Latin small letter u with ring above":"Latinské malé písmeno u s kroužkem nad znakem","Latin small letter u with tilde":"Latinské malé písmeno u s vlnovkou","Latin small letter w with circumflex":"Latinské malé písmeno w s obráceným háčkem","Latin small letter y with circumflex":"Latinské malé písmeno y s obráteným mäkčeňom","Latin small letter z with acute":"Latinské malé písmeno z s čárkou","Latin small letter z with caron":"Malé písmeno s z háčkem","Latin small letter z with dot above":"Latinské malé písmeno z s tečkou nad znakem","Latin small ligature ij":"Latinský malý znak ligatury ij","Latin small ligature oe":"Latinský malý znak ligatury oe","Left double quotation mark":"Levá dvojitá uvozovka","Left single quotation mark":"Levá uvozovka","Left-pointing double angle quotation mark":"Dvojitá šipka ukazující do leva","leftwards arrow to bar":"šipka doleva do svislé čáry","leftwards dashed arrow":"přerušovaná šipka doleva","leftwards double arrow":"dvojitá šipka doleva","Less-than or equal to":"Menší nebo roven","Less-than sign":"Menší než","Lira sign":"Měna Lira","Livre tournois sign":"Znak Livre tournois","Logical and":"Logický AND","Logical or":"Logický OR",Macron:"Horní čára","Manat sign":"Znak Manat","Mill sign":"Znak Mill","Minus sign":"Znak mínus","Multiplication sign":"Násobení","N-ary product":"Znak cyklického násobení","N-ary summation":"Znak cyklického sčítání",Nabla:"Nabla","Naira sign":"Znak Naira","New sheqel sign":"Nový znak šekel","Nordic mark sign":"Znak Nórska marka","Not an element of":"Nepatří / Není součástí","Not equal to":"Nerovná se","Not sign":"Není rovný","on with exclamation mark with left right arrow above":"ON s vykřičníkem se šipkou doleva doprava nahoru",Overline:"Přeškrtnutí","Paragraph sign":"Odstavec","Partial differential":"Parciální diference","Per mille sign":"Promile","Per ten thousand sign":"Na deset tisíc","Peseta sign":"Znak Peseta","Peso sign":"Znak Peso","Plus-minus sign":"Znak plus-minus","Pound sign":"Znak Libra","Proportional to":"Úměrný k","Question exclamation mark":"Otazník a vykřičník","Registered sign":"Registrovaný","Reversed paragraph sign":"Obrácený znak odstavce","Right double quotation mark":"Pravá dvojitá uvozovka","Right single quotation mark":"Pravá uvozovka","Right-pointing double angle quotation mark":"Dvojitá šipka ukazující do prava","rightwards arrow to bar":"šipka doprava do svislé čáry","rightwards dashed arrow":"čárkovaná šipka doprava","rightwards double arrow":"dvojitá šipka doprava","Ruble sign":"Znak Ruble","Rupee sign":"Znak Rupee","Section sign":"Sekce","Single left-pointing angle quotation mark":"Šipka ukazující do leva","Single low-9 quotation mark":"Spodní uvozovka","Single right-pointing angle quotation mark":"Šipka ukazující do prava","soon with rightwards arrow above":"brzy se šipkou doprava nahoru","Special characters":"Speciální znaky","Spesmilo sign":"Znak Spesmilo","Square root":"Odmocnina","Tenge sign":"Znak Tenge","There exists":"Existuje v množině","Tilde operator":"Vlnovka","top with upwards arrow above":"TOP se šipkou nahoru","Trade mark sign":"Ochranná známka","Tugrik sign":"Znak Tugrik","Turkish lira sign":"Znak Turecká líra","Two dot leader":"Horizontální dvojtečka",Union:"Sjednocení","up down arrow with base":"Šipka nahoru-dolů od základny","upwards arrow to bar":"šipka nahoru do svislé čáry","upwards dashed arrow":"čárkovaná šipka nahoru","upwards double arrow":"dvojitá šipka nahoru","Vulgar fraction one half":"Polovina","Vulgar fraction one quarter":"Jedna čtvrtina","Vulgar fraction three quarters":"Tři čtvrtiny","Won sign":"Znak Won","Yen sign":"Znak Jen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.cs=e.cs||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 z %1",Aquamarine:"Akvamarínová",Black:"Černá",Blue:"Modrá",Cancel:"Zrušit","Dim grey":"Tmavě šedá","Dropdown toolbar":"Rozbalovací panel nástrojů","Edit block":"Upravit blok","Editor toolbar":"Panel nástrojů editoru",Green:"Zelená",Grey:"Šedá","Insert paragraph after block":"Vložte odstavec za blok","Insert paragraph before block":"Vložte odstavec před blok","Light blue":"Světle modrá","Light green":"Světle zelená","Light grey":"Světle šedá",Next:"Další",Orange:"Oranžová",Previous:"Předchozí",Purple:"Fialová",Red:"Červená",Redo:"Znovu","Remove color":"Odstranit barvu","Restore default":"","Rich Text Editor":"Textový editor","Rich Text Editor, %0":"Textový editor, %0",Save:"Uložit","Select all":"Vybrat vše","Show more items":"Zobrazit další položky",Turquoise:"Tyrkysová",Undo:"Zpět","Upload in progress":"Probíhá nahrávání",White:"Bílá","Widget toolbar":"Panel nástrojů ovládacího prvku",Yellow:"Žlutá"}),o.getPluralForm=function(e){return 1==e&&e%1==0?0:e>=2&&e<=4&&e%1==0?1:e%1!=0?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/da.js b/core/assets/vendor/ckeditor5/translations/da.js
new file mode 100644
index 0000000000000000000000000000000000000000..80ca5205ea112fa446e57a88e0acc625d84a6246
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/da.js
@@ -0,0 +1 @@
+!function(t){const n=t.da=t.da||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Justér center","Align left":"Justér venstre","Align right":"Justér højre",Justify:"Justér","Text alignment":"Tekstjustering","Text alignment toolbar":"Tekstjustering værktøjslinje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const e=t.da=t.da||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Fed",Code:"Kode",Italic:"Kursiv",Strikethrough:"Gennemstreg",Subscript:"Sænket skrift",Superscript:"Hævet skrift",Underline:"Understreget"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.da=i.da||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blot citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i.da=i.da||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Vælg overskrift",Heading:"Overskrift","Heading 1":"Overskrift 1","Heading 2":"Overskrift 2","Heading 3":"Overskrift 3","Heading 4":"Overskrift 4","Heading 5":"Overskrift 5","Heading 6":"Overskrift 6",Paragraph:"Afsnit","Type or paste your content here.":"Skriv eller indsæt dit indhold her.","Type your title":"Skriv din titel"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.da=i.da||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Horisontal linje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.da=e.da||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Centreret billede","Change image text alternative":"Skift alternativ billedtekst","Enter image caption":"Indtast billedoverskrift","Full size image":"Fuld billedstørrelse","Image resize list":"","Image toolbar":"Billedværktøjslinje","image widget":"billed widget","In line":"",Insert:"","Insert image":"Indsæt billede","Insert image via URL":"","Left aligned image":"Venstrestillet billede",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Højrestillet billede","Side image":"Sidebillede","Text alternative":"Alternativ tekst",Update:"","Update image URL":"","Upload failed":"Upload fejlede","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.da=n.da||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Formindsk indrykning","Increase indent":"Forøg indrykning"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.da=n.da||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Kan downloades","Edit link":"Redigér link",Link:"Link","Link image":"","Link URL":"Link URL","Open in a new tab":"Åben i ny fane","Open link in new tab":"Åben link i ny fane","This link has no URL":"Dette link har ingen URL",Unlink:"Fjern link"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.da=e.da||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Punktopstilling","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Opstilling med tal","Numbered list styles toolbar":"",Square:"","To-do List":"To-do liste","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.da=n.da||{};o.dictionary=Object.assign(o.dictionary||{},{"Remove Format":"Fjern format"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.da=e.da||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Justér tekstcelle til bunden","Align cell text to the center":"Justér tekstcelle centreret","Align cell text to the left":"Justér tekstcelle til venstre","Align cell text to the middle":"Justér tekstcelle til midten","Align cell text to the right":"Justér tekstcelle til højre","Align cell text to the top":"Justér tekstcelle til top","Align table to the left":"Justér tabel til venstre","Align table to the right":"Justér tabel til højre",Alignment:"Justering",Background:"Baggrund",Border:"Ramme","Cell properties":"Celleegenskaber","Center table":"Centrér tabel",Color:"Farve","Color picker":"",Column:"Kolonne",Dashed:"Stiplet (streg)","Delete column":"Slet kolonne","Delete row":"Slet række",Dimensions:"Dimensioner",Dotted:"Stiplet (prik)",Double:"Dobbel","Enter table caption":"",Groove:"Not","Header column":"Headerkolonne","Header row":"Headerrække",Height:"Højde","Horizontal text alignment toolbar":"Horisontal tekstjustering værktøjslinje","Insert column left":"Indsæt kolonne venstre","Insert column right":"Indsæt kolonne højre","Insert row above":"Indsæt header over","Insert row below":"Indsæt header under","Insert table":"Indsæt tabel",Inset:"Forsænket","Justify cell text":"Justér tekstcelle","Merge cell down":"Flet celler ned","Merge cell left":"Flet celler venstre","Merge cell right":"Flet celler højre","Merge cell up":"Flet celler op","Merge cells":"Flet celler",None:"Ingen",Outset:"Fra starten",Padding:"Fyld",Ridge:"Kam",Row:"Række","Select column":"","Select row":"",Solid:"Massiv","Split cell horizontally":"Del celle horisontalt","Split cell vertically":"Del celle vertikalt",Style:"Stil","Table alignment toolbar":"Tabeljustering værktøjslinje","Table cell text alignment":"Tabelcelle tekstjustering","Table properties":"Tabelegenskaber","Table toolbar":"Tabel værktøjslinje",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Farven er ugyldig. Prøv "#FF0000" eller "rgb(255,0,0)" eller "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Værdien er ugyldig. Prøv "10px" eller "2em" eller ganske enkelt "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Vertikal tekstjustering værktøjslinje",Width:"Bredde"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(r){const e=r.da=r.da||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 af %1",Aquamarine:"Marineblå",Black:"Sort",Blue:"Blå",Cancel:"Annullér","Dim grey":"Dunkel grå","Dropdown toolbar":"Dropdown værktøjslinje","Edit block":"Redigér blok","Editor toolbar":"Editor værktøjslinje",Green:"Grøn",Grey:"Grå","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Lys blå","Light green":"Lys grøn","Light grey":"Lys grå",Next:"Næste",Orange:"Orange",Previous:"Forrige",Purple:"Lilla",Red:"Rød",Redo:"Gentag","Remove color":"Fjern farve","Restore default":"","Rich Text Editor":"Wysiwyg editor","Rich Text Editor, %0":"Wysiwyg editor, %0",Save:"Gem","Show more items":"Vis flere emner",Turquoise:"Turkis",Undo:"Fortryd","Upload in progress":"Upload i gang",White:"Hvid","Widget toolbar":"Widget værktøjslinje",Yellow:"Gyl"}),e.getPluralForm=function(r){return 1!=r}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/de-ch.js b/core/assets/vendor/ckeditor5/translations/de-ch.js
new file mode 100644
index 0000000000000000000000000000000000000000..ed1c2600d3966ae6d1d348d525a7165beeb44a04
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/de-ch.js
@@ -0,0 +1 @@
+!function(t){const i=t["de-ch"]=t["de-ch"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig",Justify:"Blocksatz","Text alignment":"Textausrichtung","Text alignment toolbar":"Textausrichtung Werkzeugleiste"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e["de-ch"]=e["de-ch"]||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Fett",Code:"Code",Italic:"Kursiv",Strikethrough:"Durchgestrichen",Subscript:"Tiefgestellt",Superscript:"Hochgestellt",Underline:"Unterstrichen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(c){const i=c["de-ch"]=c["de-ch"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blockzitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e["de-ch"]=e["de-ch"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Überschrift auswählen",Heading:"Überschrift","Heading 1":"Überschrift 1","Heading 2":"Überschrift 2","Heading 3":"Überschrift 3","Heading 4":"Überschrift 4","Heading 5":"Überschrift 5","Heading 6":"Überschrift 6",Paragraph:"Absatz","Type or paste your content here.":"Hier Inhalt einfügen.","Type your title":"Titel eingeben"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i["de-ch"]=i["de-ch"]||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Horizontale Linie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e["de-ch"]=e["de-ch"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"zentriertes Bild","Change image text alternative":"Alternativtext ändern","Enter image caption":"Bildunterschrift eingeben","Full size image":"Bild in voller Grösse","Image resize list":"Bildgrössen-Liste","Image toolbar":"Bild Werkzeugleiste","image widget":"Bild-Steuerelement","In line":"",Insert:"Einfügen","Insert image":"Bild einfügen","Insert image via URL":"Bild von URL einfügen","Left aligned image":"linksbündiges Bild",Original:"Original","Resize image":"Bildgrösse ändern","Resize image to %0":"Bildgrösse ändern in %0","Resize image to the original size":"Originalgrösse wiederherstellen","Right aligned image":"rechtsbündiges Bild","Side image":"Ausgerichtetes Bild","Text alternative":"Alternativtext",Update:"Aktualisieren","Update image URL":"Bild-URL aktualisieren","Upload failed":"Hochladen fehlgeschlagen","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["de-ch"]=n["de-ch"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Einzug verkleinern","Increase indent":"Einzug vergrössern"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e["de-ch"]=e["de-ch"]||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Sprache auswählen",Language:"Sprache","Remove language":"Sprache entfernen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["de-ch"]=n["de-ch"]||{};e.dictionary=Object.assign(e.dictionary||{},{Downloadable:"Herunterladbar","Edit link":"Link bearbeiten",Link:"Link","Link image":"Bild verlinken","Link URL":"Link Adresse","Open in a new tab":"In neuem Tab öffnen","Open link in new tab":"Link in neuem Tab öffnen","This link has no URL":"Dieser Link hat keine Adresse",Unlink:"Link entfernen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e["de-ch"]=e["de-ch"]||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Aufzählungsliste","Bulleted list styles toolbar":"Darstellung der ungeordneten Liste",Circle:"Leerer Kreis",Decimal:"Dezimalzahlen","Decimal with leading zero":"Dezimalzahlen mit vorangestellten Nullen",Disc:"Gefüllter Kreis","Lower-latin":"Kleingeschriebene lateinische Buchstaben","Lower–roman":"Kleingeschriebene römische Zahlen","Numbered List":"Nummerierte Liste","Numbered list styles toolbar":"Darstellung der nummerierten Liste",Square:"Quadrat","To-do List":"Aufgabenliste","Toggle the circle list style":"Leeren Kreis einstellen","Toggle the decimal list style":"Dezimalzahlen einstellen","Toggle the decimal with leading zero list style":"Dezimalzahlen mit vorangestellten Nullen einstellen","Toggle the disc list style":"Gefüllten Kreis einstellen","Toggle the lower–latin list style":"Kleingeschriebene lateinische Buchstaben einstellen","Toggle the lower–roman list style":"Kleingeschriebene römische Zahlen einstellen","Toggle the square list style":"Quadrat einstellen","Toggle the upper–latin list style":"Grossgeschriebene lateinische Buchstaben einstellen","Toggle the upper–roman list style":"Grossgeschriebene römische Zahlen einstellen","Upper-latin":"Grossgeschriebene lateinische Buchstaben","Upper-roman":"Grossgeschriebene römische Zahlen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["de-ch"]=n["de-ch"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Remove Format":"Formatierung entfernen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e["de-ch"]=e["de-ch"]||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Spalte",Dashed:"","Delete column":"Spalte löschen","Delete row":"Zeile löschen",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Kopfspalte","Header row":"Kopfspalte",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"Zeile oben einfügen","Insert row below":"Zeile unten einfügen","Insert table":"Tabelle einfügen",Inset:"","Justify cell text":"","Merge cell down":"Zelle unten verbinden","Merge cell left":"Zelle links verbinden","Merge cell right":"Zele rechts verbinden","Merge cell up":"Zelle oben verbinden","Merge cells":"Zellen verbinden",None:"",Outset:"",Padding:"",Ridge:"",Row:"Zeile","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Zelle horizontal teilen","Split cell vertically":"Zelle vertikal teilen",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e["de-ch"]=e["de-ch"]||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Abbrechen","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Insert paragraph after block":"Absatz nach Block einfügen","Insert paragraph before block":"Absatz vor Block einfügen","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Wiederherstellen","Remove color":"Farbe entfernen","Restore default":"","Rich Text Editor":"Rich-Text-Edito","Rich Text Editor, %0":"Rich-Text-Editor, %0",Save:"Speichern","Select all":"Alles auswählen","Show more items":"",Turquoise:"",Undo:"Rückgängig","Upload in progress":"Upload läuft",White:"","Widget toolbar":"Widget Werkzeugleiste",Yellow:""}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/de.js b/core/assets/vendor/ckeditor5/translations/de.js
new file mode 100644
index 0000000000000000000000000000000000000000..f25a85c6634dea34e19fb092866facdbe299a388
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/de.js
@@ -0,0 +1 @@
+!function(n){const t=n.de=n.de||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig",Justify:"Blocksatz","Text alignment":"Textausrichtung","Text alignment toolbar":"Text-Ausrichtung Toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.de=e.de||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Fett",Code:"Code",Italic:"Kursiv",Strikethrough:"Durchgestrichen",Subscript:"Tiefgestellt",Superscript:"Hochgestellt",Underline:"Unterstrichen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.de=i.de||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blockzitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.de=e.de||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Überschrift auswählen",Heading:"Überschrift","Heading 1":"Überschrift 1","Heading 2":"Überschrift 2","Heading 3":"Überschrift 3","Heading 4":"Überschrift 4","Heading 5":"Überschrift 5","Heading 6":"Überschrift 6",Paragraph:"Absatz","Type or paste your content here.":"Hier Inhalt einfügen.","Type your title":"Titel eingeben"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.de=i.de||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Horizontale Linie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.de=e.de||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"Bild teilt Text","Centered image":"Zentriertes Bild","Change image text alternative":"Alternativtext ändern","Enter image caption":"Bildunterschrift eingeben","Full size image":"Bild in voller Größe","Image resize list":"Bildgrößen-Liste","Image toolbar":"Bild Werkzeugleiste","image widget":"Bild-Steuerelement","In line":"Text in Zeile",Insert:"Einfügen","Insert image":"Bild einfügen","Insert image via URL":"Bild von URL einfügen","Left aligned image":"Linksbündiges Bild",Original:"Original","Resize image":"Bildgröße ändern","Resize image to %0":"Bildgröße ändern in %0","Resize image to the original size":"Bild in Originalgröße ändern","Right aligned image":"Rechtsbündiges Bild","Side image":"Seitenbild","Text alternative":"Alternativtext",Update:"Aktualisieren","Update image URL":"Bild-URL aktualisieren","Upload failed":"Hochladen fehlgeschlagen","Wrap text":"Text umfließt Bild"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.de=n.de||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Einzug verkleinern","Increase indent":"Einzug vergrößern"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e.de=e.de||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Sprache auswählen",Language:"Sprache","Remove language":"Sprache entfernen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.de=n.de||{};e.dictionary=Object.assign(e.dictionary||{},{Downloadable:"Herunterladbar","Edit link":"Link bearbeiten",Link:"Link","Link image":"Bild verlinken","Link URL":"Link Adresse","Open in a new tab":"In neuem Tab öffnen","Open link in new tab":"Link im neuen Tab öffnen","This link has no URL":"Dieser Link hat keine Adresse",Unlink:"Link entfernen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.de=e.de||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Aufzählungsliste","Bulleted list styles toolbar":"Darstellung der ungeordneten Liste",Circle:"Leerer Kreis",Decimal:"Dezimalzahlen","Decimal with leading zero":"Dezimalzahlen mit vorangestellten Nullen",Disc:"Gefüllter Kreis","Lower-latin":"Kleingeschriebene lateinische Buchstaben","Lower–roman":"Kleingeschriebene römische Zahlen","Numbered List":"Nummerierte Liste","Numbered list styles toolbar":"Darstellung der geordneten Liste",Square:"Quadrat","To-do List":"Aufgabenliste","Toggle the circle list style":"Leeren Kreis einstellen","Toggle the decimal list style":"Dezimalzahlen einstellen","Toggle the decimal with leading zero list style":"Dezimalzahlen mit vorangestellten Nullen einstellen","Toggle the disc list style":"Gefüllten Kreis einstellen","Toggle the lower–latin list style":"Kleingeschriebene lateinische Buchstaben einstellen","Toggle the lower–roman list style":"Kleingeschriebene römische Zahlen einstellen","Toggle the square list style":"Quadrat einstellen","Toggle the upper–latin list style":"Großgeschriebene lateinische Buchstaben einstellen","Toggle the upper–roman list style":"Großgeschriebene römische Zahlen einstellen","Upper-latin":"Großgeschriebene lateinische Buchstaben","Upper-roman":"Großgeschriebene römische Zahlen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.de=n.de||{};e.dictionary=Object.assign(e.dictionary||{},{"Remove Format":"Formatierung entfernen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.de=i.de||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"Quellcode"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.de=e.de||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Zellentext unten ausrichten","Align cell text to the center":"Zellentext zentriert ausrichten","Align cell text to the left":"Zellentext linksbündig ausrichten","Align cell text to the middle":"Zellentext mittig ausrichten","Align cell text to the right":"Zellentext rechtsbündig ausrichten","Align cell text to the top":"Zellentext oben ausrichten","Align table to the left":"Tabelle links ausrichten","Align table to the right":"Tabelle rechts ausrichten",Alignment:"Ausrichtung",Background:"Hintergrund",Border:"Rahmen","Cell properties":"Zelleneigenschaften","Center table":"Tabelle zentrieren",Color:"Farbe","Color picker":"Farbwähler",Column:"Spalte",Dashed:"Gestrichelt","Delete column":"Spalte löschen","Delete row":"Zeile löschen",Dimensions:"Größe",Dotted:"Gepunktet",Double:"Doppelt","Enter table caption":"Tabellenüberschrift eingeben",Groove:"Eingeritzt","Header column":"Kopfspalte","Header row":"Kopfzeile",Height:"Höhe","Horizontal text alignment toolbar":"Werkzeugleiste für die horizontale Zellentext-Ausrichtung","Insert column left":"Spalte links einfügen","Insert column right":"Spalte rechts einfügen","Insert row above":"Zeile oben einfügen","Insert row below":"Zeile unten einfügen","Insert table":"Tabelle einfügen",Inset:"Eingelassen","Justify cell text":"Zellentext als Blocksatz ausrichten","Merge cell down":"Zelle unten verbinden","Merge cell left":"Zelle links verbinden","Merge cell right":"Zelle rechts verbinden","Merge cell up":"Zelle verbinden","Merge cells":"Zellen verbinden",None:"Kein Rahmen",Outset:"Geprägt",Padding:"Innenabstand",Ridge:"Hervorgehoben",Row:"Zeile","Select column":"Spalte auswählen","Select row":"Zeile auswählen",Solid:"Durchgezogen","Split cell horizontally":"Zelle horizontal teilen","Split cell vertically":"Zelle vertikal teilen",Style:"Rahmenart","Table alignment toolbar":"Werkzeugleiste für die Tabellen-Ausrichtung","Table cell text alignment":"Ausrichtung des Zellentextes","Table properties":"Tabelleneigenschaften","Table toolbar":"Tabelle Werkzeugleiste",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"Die Farbe ist ungültig. Probieren Sie „#FF0000“ oder „rgb(255,0,0)“ oder „red“.",'The value is invalid. Try "10px" or "2em" or simply "2".':"Der Wert ist ungültig. Probieren Sie „10px“ oder „2em“ oder „2“.","Toggle caption off":"Tabellenüberschrift deaktivieren","Toggle caption on":"Tabellenüberschrift aktivieren","Vertical text alignment toolbar":"Werkzeugleiste für die vertikale Zellentext-Ausrichtung",Width:"Breite"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.de=i.de||{};n.dictionary=Object.assign(n.dictionary||{},{"HTML object":"HTML-Objekt"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.de=e.de||{};t.dictionary=Object.assign(t.dictionary||{},{"Almost equal to":"Gerundet",Angle:"Winkel-Zeichen","Approximately equal to":"Ungefähr gleich","Asterisk operator":"Hodge-Stern-Operator","Austral sign":"Austral-Zeichen","back with leftwards arrow above":"„Back“ darüber Pfeil nach links","Bitcoin sign":"Bitcoin-Zeichen","Cedi sign":"Cedi-Zeichen","Cent sign":"Cent-Zeichen","Character categories":"Zeichenkategorien","Colon sign":"Colón-Zeichen","Contains as member":"Enthält als Element","Copyright sign":"Copyright-Zeichen","Cruzeiro sign":"Cruzeiro-Zeichen","Currency sign":"Währungssymbol","Degree sign":"Grad-Zeichen","Division sign":"Geteilt-Zeichen","Dollar sign":"Dollar-Zeichen","Dong sign":"Đồng-Zeichen","Double dagger":"Zweibalkenkreuz","Double exclamation mark":"Doppeltes Ausrufezeichen","Double low-9 quotation mark":"Doppelte Anführungszeichen links unten","Double question mark":"Doppeltes Fragezeichen","downwards arrow to bar":"Pfeil nach unten zum Querstrich","downwards dashed arrow":"Gestrichelter Pfeil nach unten","downwards double arrow":"Doppelpfeil nach unten","Drachma sign":"Drachme-Zeichen","Element of":"Element von","Em dash":"Geviertstrich","Empty set":"Leere Menge","En dash":"Halbgeviertstrich","end with leftwards arrow above":"„End“ darüber Pfeil nach links","Euro sign":"Euro-Zeichen","Euro-currency sign":"Euro-Währungszeichen","Exclamation question mark":"Ruf-Frage-Zeichen","For all":"Allquantor","Fraction slash":"Schrägstrich","French franc sign":"Französischer Franc-Zeichen","German penny sign":"Pfennig-Zeichen","Greater-than or equal to":"Größer als oder gleich","Greater-than sign":"Größer-als-Zeichen","Guarani sign":"Guaraní-Zeichen","Horizontal ellipsis":"Auslassungspunkte","Hryvnia sign":"Hrywnja-Zeichen","Identical to":"Identisch mit","Indian rupee sign":"Indische Rupie-Zeichen",Infinity:"Unendlich-Zeichen",Integral:"Integral-Zeichen",Intersection:"Schnitt","Inverted exclamation mark":"Umgekehrtes Ausrufezeichen","Inverted question mark":"Umgekehrtes Fragezeichen","Kip sign":"Kip-Zeichen","Latin capital letter a with breve":"Lateinischer Großbuchstabe a mit Breve","Latin capital letter a with macron":"Lateinischer Großbuchstabe a mit Makron","Latin capital letter a with ogonek":"Lateinischer Großbuchstabe a mit Ogonek","Latin capital letter c with acute":"Lateinischer Großbuchstabe c mit Akut","Latin capital letter c with caron":"Lateinischer Großbuchstabe c mit Hatschek","Latin capital letter c with circumflex":"Lateinischer Großbuchstabe c mit Zirkumflex","Latin capital letter c with dot above":"Lateinischer Großbuchstabe c mit Punkt darüber","Latin capital letter d with caron":"Lateinischer Großbuchstabe d mit Hatschek","Latin capital letter d with stroke":"Lateinischer Großbuchstabe d mit Querstrich","Latin capital letter e with breve":"Lateinischer Großbuchstabe e mit Breve","Latin capital letter e with caron":"Lateinischer Großbuchstabe e mit Hatschek","Latin capital letter e with dot above":"Lateinischer Großbuchstabe e mit Punkt darüber","Latin capital letter e with macron":"Lateinischer Großbuchstabe e mit Makron","Latin capital letter e with ogonek":"Lateinischer Großbuchstabe e mit Ogonek","Latin capital letter eng":"Lateinischer Großbuchstabe Eng","Latin capital letter g with breve":"Lateinischer Großbuchstabe g mit Breve","Latin capital letter g with cedilla":"Lateinischer Großbuchstabe g mit Cedille","Latin capital letter g with circumflex":"Lateinischer Großbuchstabe g mit Zirkumflex","Latin capital letter g with dot above":"Lateinischer Großbuchstabe g mit Punkt darüber","Latin capital letter h with circumflex":"Lateinischer Großbuchstabe h mit Zirkumflex","Latin capital letter h with stroke":"Lateinischer Großbuchstabe h mit Querstrich","Latin capital letter i with breve":"Lateinischer Großbuchstabe i mit Breve","Latin capital letter i with dot above":"Lateinischer Großbuchstabe i mit Punkt darüber","Latin capital letter i with macron":"Lateinischer Großbuchstabe i mit Makron","Latin capital letter i with ogonek":"Lateinischer Großbuchstabe i mit Ogonek","Latin capital letter i with tilde":"Lateinischer Großbuchstabe i mit Tilde","Latin capital letter j with circumflex":"Lateinischer Großbuchstabe j mit Zirkumflex","Latin capital letter k with cedilla":"Lateinischer Großbuchstabe k mit Cedille","Latin capital letter l with acute":"Lateinischer Großbuchstabe l mit Akut","Latin capital letter l with caron":"Lateinischer Großbuchstabe l mit Hatschek","Latin capital letter l with cedilla":"Lateinischer Großbuchstabe l mit Cedille","Latin capital letter l with middle dot":"Lateinischer Großbuchstabe l mit Mittelpunkt","Latin capital letter l with stroke":"Lateinischer Großbuchstabe l mit Querstrich","Latin capital letter n with acute":"Lateinischer Großbuchstabe n mit Akut","Latin capital letter n with caron":"Lateinischer Großbuchstabe n mit Hatschek","Latin capital letter n with cedilla":"Lateinischer Großbuchstabe n mit Cedille","Latin capital letter o with breve":"Lateinischer Großbuchstabe o mit Breve","Latin capital letter o with double acute":"Lateinischer Großbuchstabe o mit doppeltem Akut","Latin capital letter o with macron":"Lateinischer Großbuchstabe o mit Makron","Latin capital letter r with acute":"Lateinischer Großbuchstabe r mit Akut","Latin capital letter r with caron":"Lateinischer Großbuchstabe r mit Hatschek","Latin capital letter r with cedilla":"Lateinischer Großbuchstabe r mit Cedille","Latin capital letter s with acute":"Lateinischer Großbuchstabe s mit Akut","Latin capital letter s with caron":"Lateinischer Großbuchstabe s mit Hatschek","Latin capital letter s with cedilla":"Lateinischer Großbuchstabe s mit Cedille","Latin capital letter s with circumflex":"Lateinischer Großbuchstabe s mit Zirkumflex","Latin capital letter t with caron":"Lateinischer Großbuchstabe t mit Hatschek","Latin capital letter t with cedilla":"Lateinischer Großbuchstabe t mit Cedille","Latin capital letter t with stroke":"Lateinischer Großbuchstabe t mit Querstrich","Latin capital letter u with breve":"Lateinischer Großbuchstabe u mit Breve","Latin capital letter u with double acute":"Lateinischer Großbuchstabe u mit doppeltem Akut","Latin capital letter u with macron":"Lateinischer Großbuchstabe u mit Makron","Latin capital letter u with ogonek":"Lateinischer Großbuchstabe u mit Ogonek","Latin capital letter u with ring above":"Lateinischer Großbuchstabe u mit Kroužek darüber","Latin capital letter u with tilde":"Lateinischer Großbuchstabe u mit Tilde","Latin capital letter w with circumflex":"Lateinischer Großbuchstabe w mit Zirkumflex","Latin capital letter y with circumflex":"Lateinischer Großbuchstabe y mit Zirkumflex","Latin capital letter y with diaeresis":"Lateinischer Großbuchstabe y mit Trema","Latin capital letter z with acute":"Lateinischer Großbuchstabe z mit Akut","Latin capital letter z with caron":"Lateinischer Großbuchstabe z mit Hatschek","Latin capital letter z with dot above":"Lateinischer Großbuchstabe z mit Punkt darüber","Latin capital ligature ij":"Große lateinische Ligatur ij","Latin capital ligature oe":"Große lateinische Ligatur oe","Latin small letter a with breve":"Lateinischer Kleinbuchstabe a mit Breve","Latin small letter a with macron":"Lateinischer Kleinbuchstabe a mit Makron","Latin small letter a with ogonek":"Lateinischer Kleinbuchstabe a mit Ogonek","Latin small letter c with acute":"Lateinischer Kleinbuchstabe c mit Akut","Latin small letter c with caron":"Lateinischer Kleinbuchstabe c mit Hatschek","Latin small letter c with circumflex":"Lateinischer Kleinbuchstabe c mit Zirkumflex","Latin small letter c with dot above":"Lateinischer Kleinbuchstabe c mit Punkt darüber","Latin small letter d with caron":"Lateinischer Kleinbuchstabe d mit Hatschek","Latin small letter d with stroke":"Lateinischer Kleinbuchstabe d mit Querstrich","Latin small letter dotless i":"Lateinischer Kleinbuchstabe i ohne Punkt","Latin small letter e with breve":"Lateinischer Kleinbuchstabe e mit Breve","Latin small letter e with caron":"Lateinischer Kleinbuchstabe e mit Hatschek","Latin small letter e with dot above":"Lateinischer Kleinbuchstabe e mit Punkt darüber","Latin small letter e with macron":"Lateinischer Kleinbuchstabe e mit Makron","Latin small letter e with ogonek":"Lateinischer Kleinbuchstabe e mit Ogonek","Latin small letter eng":"Lateinischer Kleinbuchstabe Eng","Latin small letter f with hook":"Lateinischer Kleinbuchstabe f mit Haken","Latin small letter g with breve":"Lateinischer Kleinbuchstabe g mit Breve","Latin small letter g with cedilla":"Lateinischer Kleinbuchstabe g mit Cedille","Latin small letter g with circumflex":"Lateinischer Kleinbuchstabe g mit Zirkumflex","Latin small letter g with dot above":"Lateinischer Kleinbuchstabe g mit Punkt darüber","Latin small letter h with circumflex":"Lateinischer Kleinbuchstabe h mit Zirkumflex","Latin small letter h with stroke":"Lateinischer Kleinbuchstabe h mit Querstrich","Latin small letter i with breve":"Lateinischer Kleinbuchstabe i mit Breve","Latin small letter i with macron":"Lateinischer Kleinbuchstabe i mit Makron","Latin small letter i with ogonek":"Lateinischer Kleinbuchstabe i mit Ogonek","Latin small letter i with tilde":"Lateinischer Kleinbuchstabe i mit Tilde","Latin small letter j with circumflex":"Lateinischer Kleinbuchstabe j mit Zirkumflex","Latin small letter k with cedilla":"Lateinischer Kleinbuchstabe k mit Cedille","Latin small letter kra":"Lateinischer Kleinbuchstabe Kra","Latin small letter l with acute":"Lateinischer Kleinbuchstabe l mit Akut","Latin small letter l with caron":"Lateinischer Kleinbuchstabe l mit Hatschek","Latin small letter l with cedilla":"Lateinischer Kleinbuchstabe l mit Cedille","Latin small letter l with middle dot":"Lateinischer Kleinbuchstabe l mit Mittelpunkt","Latin small letter l with stroke":"Lateinischer Kleinbuchstabe l mit Querstrich","Latin small letter long s":"Lateinischer Kleinbuchstabe langes s","Latin small letter n preceded by apostrophe":"Lateinischer Kleinbuchstabe n mit vorangestelltem Apostroph","Latin small letter n with acute":"Lateinischer Kleinbuchstabe n mit Akut","Latin small letter n with caron":"Lateinischer Kleinbuchstabe n mit Hatschek","Latin small letter n with cedilla":"Lateinischer Kleinbuchstabe n mit Cedille","Latin small letter o with breve":"Lateinischer Kleinbuchstabe o mit Breve","Latin small letter o with double acute":"Lateinischer Kleinbuchstabe o mit doppeltem Akut","Latin small letter o with macron":"Lateinischer Kleinbuchstabe o mit Makron","Latin small letter r with acute":"Lateinischer Kleinbuchstabe r mit Akut","Latin small letter r with caron":"Lateinischer Kleinbuchstabe r mit Hatschek","Latin small letter r with cedilla":"Lateinischer Kleinbuchstabe r mit Cedille","Latin small letter s with acute":"Lateinischer Kleinbuchstabe s mit Akut","Latin small letter s with caron":"Lateinischer Kleinbuchstabe s mit Hatschek","Latin small letter s with cedilla":"Lateinischer Kleinbuchstabe s mit Cedille","Latin small letter s with circumflex":"Lateinischer Kleinbuchstabe s mit Zirkumflex","Latin small letter t with caron":"Lateinischer Kleinbuchstabe t mit Hatschek","Latin small letter t with cedilla":"Lateinischer Kleinbuchstabe t mit Cedille","Latin small letter t with stroke":"Lateinischer Kleinbuchstabe t mit Querstrich","Latin small letter u with breve":"Lateinischer Kleinbuchstabe u mit Breve","Latin small letter u with double acute":"Lateinischer Kleinbuchstabe u mit doppeltem Akut","Latin small letter u with macron":"Lateinischer Kleinbuchstabe u mit Makron","Latin small letter u with ogonek":"Lateinischer Kleinbuchstabe u mit Ogonek","Latin small letter u with ring above":"Lateinischer Kleinbuchstabe u mit Kroužek darüber","Latin small letter u with tilde":"Lateinischer Kleinbuchstabe u mit Tilde","Latin small letter w with circumflex":"Lateinischer Kleinbuchstabe w mit Zirkumflex","Latin small letter y with circumflex":"Lateinischer Kleinbuchstabe y mit Zirkumflex","Latin small letter z with acute":"Lateinischer Kleinbuchstabe z mit Akut","Latin small letter z with caron":"Lateinischer Kleinbuchstabe z mit Hatschek","Latin small letter z with dot above":"Lateinischer Kleinbuchstabe z mit Punkt darüber","Latin small ligature ij":"Kleine lateinische Ligatur ij","Latin small ligature oe":"Kleine lateinische Ligatur oe","Left double quotation mark":"Doppelte Anführungszeichen links","Left single quotation mark":"Einfache Anführungszeichen links","Left-pointing double angle quotation mark":"Doppelte Guillemets nach links","leftwards arrow to bar":"Pfeil nach links zum Querstrich","leftwards dashed arrow":"Gestrichelter Pfeil nach links","leftwards double arrow":"Doppelpfeil nach links","Less-than or equal to":"Kleiner als oder gleich","Less-than sign":"Kleiner-als-Zeichen","Lira sign":"Lira-Zeichen","Livre tournois sign":"Livre tournois-Zeichen","Logical and":"Logisches und","Logical or":"Logisches oder",Macron:"Makron","Manat sign":"Manat-Zeichen","Mill sign":"Mill-Zeichen","Minus sign":"Minus-Zeichen","Multiplication sign":"Mal-Zeichen","N-ary product":"Produkt-Zeichen","N-ary summation":"Summen-Zeichen",Nabla:"Nabla","Naira sign":"Naira-Zeichen","New sheqel sign":"Schekel-Zeichen","Nordic mark sign":"Nordische Mark-Zeichen","Not an element of":"Kein Element von","Not equal to":"Ungleich","Not sign":"Negations-Zeichen","on with exclamation mark with left right arrow above":"„On“ mit Ausrufezeichen darüber Pfeil nach links und rechts",Overline:"Überstrich","Paragraph sign":"Absatz-Zeichen","Partial differential":"Partielle Ableitung","Per mille sign":"Promille-Zeichen","Per ten thousand sign":"Pro-Zehntausend-Zeichen","Peseta sign":"Peseta-Zeichen","Peso sign":"Philippinischer Peso-Zeichen","Plus-minus sign":"Plus-Minus-Zeichen","Pound sign":"Pfund-Zeichen","Proportional to":"Proportional zu","Question exclamation mark":"Frage-Ruf-Zeichen","Registered sign":"Registered-Trade-Mark-Zeichen","Reversed paragraph sign":"Umgedrehtes Absatz-Zeichen","Right double quotation mark":"Doppelte Anführungszeichen rechts","Right single quotation mark":"Einfache Anführungszeichen rechts","Right-pointing double angle quotation mark":"Doppelte Guillemets nach rechts","rightwards arrow to bar":"Pfeil nach rechts zum Querstrich","rightwards dashed arrow":"Gestrichelter Pfeil nach rechts","rightwards double arrow":"Doppelpfeil nach rechts","Ruble sign":"Rubel-Zeichen","Rupee sign":"Rupie-Zeichen","Section sign":"Paragraphen-Zeichen","Single left-pointing angle quotation mark":"Einfache Guillemets nach links","Single low-9 quotation mark":"Einfache Anführungszeichen links unten","Single right-pointing angle quotation mark":"Einfache Guillemets nach rechts","soon with rightwards arrow above":"„Soon“ darüber Pfeil nach rechts","Special characters":"Sonderzeichen","Spesmilo sign":"Spesmilo-Zeichen","Square root":"Wurzel-Zeichen","Tenge sign":"Tenge-Zeichen","There exists":"Existenzquantor","Tilde operator":"Tilde-Operator","top with upwards arrow above":"„Top“ darüber Pfeil nach oben","Trade mark sign":"Unregistered-Trade-Mark-Zeichen","Tugrik sign":"Tugrik-Zeichen","Turkish lira sign":"Türkische Lira-Zeichen","Two dot leader":"Doppel-Punktlinie",Union:"Vereinigung","up down arrow with base":"Unterstrichener Pfeil nach oben und unten","upwards arrow to bar":"Pfeil nach oben zum Querstrich","upwards dashed arrow":"Gestrichelter Pfeil nach oben","upwards double arrow":"Doppelpfeil nach oben","Vulgar fraction one half":"Gemeiner Bruch ein Halb","Vulgar fraction one quarter":"Gemeiner Bruch ein Viertel","Vulgar fraction three quarters":"Gemeiner Bruch drei Viertel","Won sign":"Won-Zeichen","Yen sign":"Yen-Zeichen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.de=e.de||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 von %1",Aquamarine:"Aquamarinblau",Black:"Schwarz",Blue:"Blau",Cancel:"Abbrechen","Dim grey":"Dunkelgrau","Dropdown toolbar":"Dropdown-Liste Werkzeugleiste","Edit block":"Absatz bearbeiten","Editor toolbar":"Editor Werkzeugleiste",Green:"Grün",Grey:"Grau","Insert paragraph after block":"Absatz nach Block einfügen","Insert paragraph before block":"Absatz vor Block einfügen","Light blue":"Hellblau","Light green":"Hellgrün","Light grey":"Hellgrau",Next:"Nächste",Orange:"Orange",Previous:"vorherige",Purple:"Violett",Red:"Rot",Redo:"Wiederherstellen","Remove color":"Farbe entfernen","Restore default":"Standard wiederherstellen","Rich Text Editor":"Rich Text Editor","Rich Text Editor, %0":"Rich-Text-Editor, %0",Save:"Speichern","Select all":"Alles auswählen","Show more items":"Mehr anzeigen",Turquoise:"Türkis",Undo:"Rückgängig","Upload in progress":"Upload läuft",White:"Weiß","Widget toolbar":"Widget Werkzeugleiste",Yellow:"Gelb"}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/el.js b/core/assets/vendor/ckeditor5/translations/el.js
new file mode 100644
index 0000000000000000000000000000000000000000..29897c0706eabb3e407a9e65dd4045ce376ab13d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/el.js
@@ -0,0 +1 @@
+!function(i){const n=i.el=i.el||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Έντονη",Code:"",Italic:"Πλάγια",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.el=i.el||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Περιοχή παράθεσης"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e.el=e.el||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Επιλέξτε κεφαλίδα",Heading:"Κεφαλίδα","Heading 1":"Κεφαλίδα 1","Heading 2":"Κεφαλίδα 2","Heading 3":"Κεφαλίδα 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Παράγραφος","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.el=e.el||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"Αλλαγή εναλλακτικού κείμενου","Enter image caption":"Λεζάντα","Full size image":"Εικόνα πλήρης μεγέθους","Image resize list":"","Image toolbar":"","image widget":"","In line":"",Insert:"","Insert image":"Εισαγωγή εικόνας","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"","Text alternative":"Εναλλακτικό κείμενο",Update:"","Update image URL":"","Upload failed":"","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.el=n.el||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"",Link:"Σύνδεσμος","Link image":"","Link URL":"Διεύθυνση συνδέσμου","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"Αφαίρεση συνδέσμου"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.el=e.el||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Λίστα κουκκίδων","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Αριθμημένη λίστα","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.el=e.el||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Ακύρωση","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Επανάληψη","Remove color":"","Restore default":"","Rich Text Editor":"Επεξεργαστής Πλούσιου Κειμένου","Rich Text Editor, %0":"Επεξεργαστής Πλούσιου Κειμένου, 0%",Save:"Αποθήκευση","Show more items":"",Turquoise:"",Undo:"Αναίρεση",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/en-au.js b/core/assets/vendor/ckeditor5/translations/en-au.js
new file mode 100644
index 0000000000000000000000000000000000000000..1db580393037afb4d684d6ad27acbdd70255d88d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/en-au.js
@@ -0,0 +1 @@
+!function(n){const t=n["en-au"]=n["en-au"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Align centre","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":"Text alignment toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i["en-au"]=i["en-au"]||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Bold",Code:"Code",Italic:"Italic",Strikethrough:"Strikethrough",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n["en-au"]=n["en-au"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e["en-au"]=e["en-au"]||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Choose heading",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Paragraph:"Paragraph","Type or paste your content here.":"Type or paste your content here.","Type your title":"Type your title"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["en-au"]=n["en-au"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Horizontal line"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e["en-au"]=e["en-au"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Centred image","Change image text alternative":"Change image text alternative","Enter image caption":"Enter image caption","Full size image":"Full size image","Image resize list":"Image resize list","Image toolbar":"Image toolbar","image widget":"image widget","In line":"",Insert:"Insert","Insert image":"Insert image","Insert image via URL":"Insert image via URL","Left aligned image":"Left aligned image",Original:"Original","Resize image":"Resize image","Resize image to %0":"Resize image to %0","Resize image to the original size":"Resize image to the original size","Right aligned image":"Right aligned image","Side image":"Side image","Text alternative":"Text alternative",Update:"Update","Update image URL":"Update image URL","Upload failed":"Upload failed","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["en-au"]=n["en-au"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Decrease indent","Increase indent":"Increase indent"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["en-au"]=n["en-au"]||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Downloadable","Edit link":"Edit link",Link:"Link","Link image":"Link image","Link URL":"Link URL","Open in a new tab":"Open in a new tab","Open link in new tab":"Open link in new tab","This link has no URL":"This link has no URL",Unlink:"Unlink"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e["en-au"]=e["en-au"]||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Circle:"Circle",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero",Disc:"Disc","Lower-latin":"Lower-latin","Lower–roman":"Lower–roman","Numbered List":"Numbered List","Numbered list styles toolbar":"Numbered list styles toolbar",Square:"Square","To-do List":"To-do List","Toggle the circle list style":"Toggle the circle list style","Toggle the decimal list style":"Toggle the decimal list style","Toggle the decimal with leading zero list style":"Toggle the decimal with leading zero list style","Toggle the disc list style":"Toggle the disc list style","Toggle the lower–latin list style":"Toggle the lower–latin list style","Toggle the lower–roman list style":"Toggle the lower–roman list style","Toggle the square list style":"Toggle the square list style","Toggle the upper–latin list style":"Toggle the upper–latin list style","Toggle the upper–roman list style":"Toggle the upper–roman list style","Upper-latin":"Upper-latin","Upper-roman":"Upper-roman"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n["en-au"]=n["en-au"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Remove Format":"Remove Format"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e["en-au"]=e["en-au"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",Background:"Background",Border:"Border","Cell properties":"Cell properties","Center table":"Centre table",Color:"Colour","Color picker":"Colour picker",Column:"Column",Dashed:"Dashed","Delete column":"Delete column","Delete row":"Delete row",Dimensions:"Dimensions",Dotted:"Dotted",Double:"Double","Enter table caption":"",Groove:"Groove","Header column":"Header column","Header row":"Header row",Height:"Height","Horizontal text alignment toolbar":"Horizontal text alignment toolbar","Insert column left":"Insert column left","Insert column right":"Insert column right","Insert row above":"Insert row above","Insert row below":"Insert row below","Insert table":"Insert table",Inset:"Inset","Justify cell text":"Justify cell text","Merge cell down":"Merge cell down","Merge cell left":"Merge cell left","Merge cell right":"Merge cell right","Merge cell up":"Merge cell up","Merge cells":"Merge cells",None:"None",Outset:"Outset",Padding:"Padding",Ridge:"Ridge",Row:"Row","Select column":"Select column","Select row":"Select row",Solid:"Solid","Split cell horizontally":"Split cell horizontally","Split cell vertically":"Split cell vertically",Style:"Style","Table alignment toolbar":"Table alignment toolbar","Table cell text alignment":"Table cell text alignment","Table properties":"Table properties","Table toolbar":"Table toolbar",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'The colour is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'The value is invalid. Try "10px" or "2em" or simply "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Vertical text alignment toolbar",Width:"Width"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t["en-au"]=t["en-au"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above","Bitcoin sign":"Bitcoin sign","Cedi sign":"Cedi sign","Cent sign":"Cent sign","Character categories":"Character categories","Colon sign":"Colon sign","Contains as member":"Contains as member","Copyright sign":"Copyright sign","Cruzeiro sign":"Cruzeiro sign","Currency sign":"Currency sign","Degree sign":"Degree sign","Division sign":"Division sign","Dollar sign":"Dollar sign","Dong sign":"Dong sign","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","Drachma sign":"Drachma sign","Element of":"Element of","Em dash":"Em dash","Empty set":"Empty set","En dash":"En dash","end with leftwards arrow above":"end with leftwards arrow above","Euro sign":"Euro sign","Euro-currency sign":"Euro-currency sign","Exclamation question mark":"Exclamation question mark","For all":"For all","Fraction slash":"Fraction slash","French franc sign":"French franc sign","German penny sign":"German penny sign","Greater-than or equal to":"Greater-than or equal to","Greater-than sign":"Greater-than sign","Guarani sign":"Guarani sign","Horizontal ellipsis":"Horizontal ellipsis","Hryvnia sign":"Hryvnia sign","Identical to":"Identical to","Indian rupee sign":"Indian rupee sign",Infinity:"Infinity",Integral:"Integral",Intersection:"Intersection","Inverted exclamation mark":"Inverted exclamation mark","Inverted question mark":"Inverted question mark","Kip sign":"Kip sign","Latin capital letter a with breve":"Latin capital letter a with breve","Latin capital letter a with macron":"Latin capital letter a with macron","Latin capital letter a with ogonek":"Latin capital letter a with ogonek","Latin capital letter c with acute":"Latin capital letter c with acute","Latin capital letter c with caron":"Latin capital letter c with caron","Latin capital letter c with circumflex":"Latin capital letter c with circumflex","Latin capital letter c with dot above":"Latin capital letter c with dot above","Latin capital letter d with caron":"Latin capital letter d with caron","Latin capital letter d with stroke":"Latin capital letter d with stroke","Latin capital letter e with breve":"Latin capital letter e with breve","Latin capital letter e with caron":"Latin capital letter e with caron","Latin capital letter e with dot above":"Latin capital letter e with dot above","Latin capital letter e with macron":"Latin capital letter e with macron","Latin capital letter e with ogonek":"Latin capital letter e with ogonek","Latin capital letter eng":"Latin capital letter eng","Latin capital letter g with breve":"Latin capital letter g with breve","Latin capital letter g with cedilla":"Latin capital letter g with cedilla","Latin capital letter g with circumflex":"Latin capital letter g with circumflex","Latin capital letter g with dot above":"Latin capital letter g with dot above","Latin capital letter h with circumflex":"Latin capital letter h with circumflex","Latin capital letter h with stroke":"Latin capital letter h with stroke","Latin capital letter i with breve":"Latin capital letter i with breve","Latin capital letter i with dot above":"Latin capital letter i with dot above","Latin capital letter i with macron":"Latin capital letter i with macron","Latin capital letter i with ogonek":"Latin capital letter i with ogonek","Latin capital letter i with tilde":"Latin capital letter i with tilde","Latin capital letter j with circumflex":"Latin capital letter j with circumflex","Latin capital letter k with cedilla":"Latin capital letter k with cedilla","Latin capital letter l with acute":"Latin capital letter l with acute","Latin capital letter l with caron":"Latin capital letter l with caron","Latin capital letter l with cedilla":"Latin capital letter l with cedilla","Latin capital letter l with middle dot":"Latin capital letter l with middle dot","Latin capital letter l with stroke":"Latin capital letter l with stroke","Latin capital letter n with acute":"Latin capital letter n with acute","Latin capital letter n with caron":"Latin capital letter n with caron","Latin capital letter n with cedilla":"Latin capital letter n with cedilla","Latin capital letter o with breve":"Latin capital letter o with breve","Latin capital letter o with double acute":"Latin capital letter o with double acute","Latin capital letter o with macron":"Latin capital letter o with macron","Latin capital letter r with acute":"Latin capital letter r with acute","Latin capital letter r with caron":"Latin capital letter r with caron","Latin capital letter r with cedilla":"Latin capital letter r with cedilla","Latin capital letter s with acute":"Latin capital letter s with acute","Latin capital letter s with caron":"Latin capital letter s with caron","Latin capital letter s with cedilla":"Latin capital letter s with cedilla","Latin capital letter s with circumflex":"Latin capital letter s with circumflex","Latin capital letter t with caron":"Latin capital letter t with caron","Latin capital letter t with cedilla":"Latin capital letter t with cedilla","Latin capital letter t with stroke":"Latin capital letter t with stroke","Latin capital letter u with breve":"Latin capital letter u with breve","Latin capital letter u with double acute":"Latin capital letter u with double acute","Latin capital letter u with macron":"Latin capital letter u with macron","Latin capital letter u with ogonek":"Latin capital letter u with ogonek","Latin capital letter u with ring above":"Latin capital letter u with ring above","Latin capital letter u with tilde":"Latin capital letter u with tilde","Latin capital letter w with circumflex":"Latin capital letter w with circumflex","Latin capital letter y with circumflex":"Latin capital letter y with circumflex","Latin capital letter y with diaeresis":"Latin capital letter y with diaeresis","Latin capital letter z with acute":"Latin capital letter z with acute","Latin capital letter z with caron":"Latin capital letter z with caron","Latin capital letter z with dot above":"Latin capital letter z with dot above","Latin capital ligature ij":"Latin capital ligature ij","Latin capital ligature oe":"Latin capital ligature oe","Latin small letter a with breve":"Latin small letter a with breve","Latin small letter a with macron":"Latin small letter a with macron","Latin small letter a with ogonek":"Latin small letter a with ogonek","Latin small letter c with acute":"Latin small letter c with acute","Latin small letter c with caron":"Latin small letter c with caron","Latin small letter c with circumflex":"Latin small letter c with circumflex","Latin small letter c with dot above":"Latin small letter c with dot above","Latin small letter d with caron":"Latin small letter d with caron","Latin small letter d with stroke":"Latin small letter d with stroke","Latin small letter dotless i":"Latin small letter dotless i","Latin small letter e with breve":"Latin small letter e with breve","Latin small letter e with caron":"Latin small letter e with caron","Latin small letter e with dot above":"Latin small letter e with dot above","Latin small letter e with macron":"Latin small letter e with macron","Latin small letter e with ogonek":"Latin small letter e with ogonek","Latin small letter eng":"Latin small letter eng","Latin small letter f with hook":"Latin small letter f with hook","Latin small letter g with breve":"Latin small letter g with breve","Latin small letter g with cedilla":"Latin small letter g with cedilla","Latin small letter g with circumflex":"Latin small letter g with circumflex","Latin small letter g with dot above":"Latin small letter g with dot above","Latin small letter h with circumflex":"Latin small letter h with circumflex","Latin small letter h with stroke":"Latin small letter h with stroke","Latin small letter i with breve":"Latin small letter i with breve","Latin small letter i with macron":"Latin small letter i with macron","Latin small letter i with ogonek":"Latin small letter i with ogonek","Latin small letter i with tilde":"Latin small letter i with tilde","Latin small letter j with circumflex":"Latin small letter j with circumflex","Latin small letter k with cedilla":"Latin small letter k with cedilla","Latin small letter kra":"Latin small letter kra","Latin small letter l with acute":"Latin small letter l with acute","Latin small letter l with caron":"Latin small letter l with caron","Latin small letter l with cedilla":"Latin small letter l with cedilla","Latin small letter l with middle dot":"Latin small letter l with middle dot","Latin small letter l with stroke":"Latin small letter l with stroke","Latin small letter long s":"Latin small letter long s","Latin small letter n preceded by apostrophe":"Latin small letter n preceded by apostrophe","Latin small letter n with acute":"Latin small letter n with acute","Latin small letter n with caron":"Latin small letter n with caron","Latin small letter n with cedilla":"Latin small letter n with cedilla","Latin small letter o with breve":"Latin small letter o with breve","Latin small letter o with double acute":"Latin small letter o with double acute","Latin small letter o with macron":"Latin small letter o with macron","Latin small letter r with acute":"Latin small letter r with acute","Latin small letter r with caron":"Latin small letter r with caron","Latin small letter r with cedilla":"Latin small letter r with cedilla","Latin small letter s with acute":"Latin small letter s with acute","Latin small letter s with caron":"Latin small letter s with caron","Latin small letter s with cedilla":"Latin small letter s with cedilla","Latin small letter s with circumflex":"Latin small letter s with circumflex","Latin small letter t with caron":"Latin small letter t with caron","Latin small letter t with cedilla":"Latin small letter t with cedilla","Latin small letter t with stroke":"Latin small letter t with stroke","Latin small letter u with breve":"Latin small letter u with breve","Latin small letter u with double acute":"Latin small letter u with double acute","Latin small letter u with macron":"Latin small letter u with macron","Latin small letter u with ogonek":"Latin small letter u with ogonek","Latin small letter u with ring above":"Latin small letter u with ring above","Latin small letter u with tilde":"Latin small letter u with tilde","Latin small letter w with circumflex":"Latin small letter w with circumflex","Latin small letter y with circumflex":"Latin small letter y with circumflex","Latin small letter z with acute":"Latin small letter z with acute","Latin small letter z with caron":"Latin small letter z with caron","Latin small letter z with dot above":"Latin small letter z with dot above","Latin small ligature ij":"Latin small ligature ij","Latin small ligature oe":"Latin small ligature oe","Left double quotation mark":"Left double quotation mark","Left single quotation mark":"Left single quotation mark","Left-pointing double angle quotation mark":"Left-pointing double angle quotation mark","leftwards arrow to bar":"leftwards arrow to bar","leftwards dashed arrow":"leftwards dashed arrow","leftwards double arrow":"leftwards double arrow","Less-than or equal to":"Less-than or equal to","Less-than sign":"Less-than sign","Lira sign":"Lira sign","Livre tournois sign":"Livre tournois sign","Logical and":"Logical and","Logical or":"Logical or",Macron:"Macron","Manat sign":"Manat sign","Mill sign":"Mill sign","Minus sign":"Minus sign","Multiplication sign":"Multiplication sign","N-ary product":"N-ary product","N-ary summation":"N-ary summation",Nabla:"Nabla","Naira sign":"Naira sign","New sheqel sign":"New sheqel sign","Nordic mark sign":"Nordic mark sign","Not an element of":"Not an element of","Not equal to":"Not equal to","Not sign":"Not sign","on with exclamation mark with left right arrow above":"on with exclamation mark with left right arrow above",Overline:"Overline","Paragraph sign":"Paragraph sign","Partial differential":"Partial differential","Per mille sign":"Per mille sign","Per ten thousand sign":"Per ten thousand sign","Peseta sign":"Peseta sign","Peso sign":"Peso sign","Plus-minus sign":"Plus-minus sign","Pound sign":"Pound sign","Proportional to":"Proportional to","Question exclamation mark":"Question exclamation mark","Registered sign":"Registered sign","Reversed paragraph sign":"Reversed paragraph sign","Right double quotation mark":"Right double quotation mark","Right single quotation mark":"Right single quotation mark","Right-pointing double angle quotation mark":"Right-pointing double angle quotation mark","rightwards arrow to bar":"rightwards arrow to bar","rightwards dashed arrow":"rightwards dashed arrow","rightwards double arrow":"rightwards double arrow","Ruble sign":"Ruble sign","Rupee sign":"Rupee sign","Section sign":"Section sign","Single left-pointing angle quotation mark":"Single left-pointing angle quotation mark","Single low-9 quotation mark":"Single low-9 quotation mark","Single right-pointing angle quotation mark":"Single right-pointing angle quotation mark","soon with rightwards arrow above":"soon with rightwards arrow above","Special characters":"Special characters","Spesmilo sign":"Spesmilo sign","Square root":"Square root","Tenge sign":"Tenge sign","There exists":"There exists","Tilde operator":"Tilde operator","top with upwards arrow above":"top with upwards arrow above","Trade mark sign":"Trade mark sign","Tugrik sign":"Tugrik sign","Turkish lira sign":"Turkish lira sign","Two dot leader":"Two dot leader",Union:"Union","up down arrow with base":"up down arrow with base","upwards arrow to bar":"upwards arrow to bar","upwards dashed arrow":"upwards dashed arrow","upwards double arrow":"upwards double arrow","Vulgar fraction one half":"Vulgar fraction one half","Vulgar fraction one quarter":"Vulgar fraction one quarter","Vulgar fraction three quarters":"Vulgar fraction three quarters","Won sign":"Won sign","Yen sign":"Yen sign"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e["en-au"]=e["en-au"]||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Aquamarine",Black:"Black",Blue:"Blue",Cancel:"Cancel","Dim grey":"Dim grey","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Editor toolbar":"Editor toolbar",Green:"Green",Grey:"Grey","Insert paragraph after block":"Insert paragraph after block","Insert paragraph before block":"Insert paragraph before block","Light blue":"Light blue","Light green":"Light green","Light grey":"Light grey",Next:"Next",Orange:"Orange",Previous:"Previous",Purple:"Purple",Red:"Red",Redo:"Redo","Remove color":"Remove colour","Restore default":"","Rich Text Editor":"Rich Text Editor","Rich Text Editor, %0":"Rich Text Editor, %0",Save:"Save","Select all":"Select all","Show more items":"Show more items",Turquoise:"Turquoise",Undo:"Undo","Upload in progress":"Upload in progress",White:"White","Widget toolbar":"Widget toolbar",Yellow:"Yellow"}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/en-gb.js b/core/assets/vendor/ckeditor5/translations/en-gb.js
new file mode 100644
index 0000000000000000000000000000000000000000..1fb52e2aa5380231b5fddae84e5bc56a98a58fe1
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/en-gb.js
@@ -0,0 +1 @@
+!function(n){const i=n["en-gb"]=n["en-gb"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Align center","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i["en-gb"]=i["en-gb"]||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Bold",Code:"Code",Italic:"Italic",Strikethrough:"Strikethrough",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n["en-gb"]=n["en-gb"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e["en-gb"]=e["en-gb"]||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Choose heading",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Paragraph:"Paragraph","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e["en-gb"]=e["en-gb"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Centred image","Change image text alternative":"Change image text alternative","Enter image caption":"Enter image caption","Full size image":"Full size image","Image resize list":"","Image toolbar":"","image widget":"Image widget","In line":"",Insert:"","Insert image":"Insert image","Insert image via URL":"","Left aligned image":"Left aligned image",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Right aligned image","Side image":"Side image","Text alternative":"Text alternative",Update:"","Update image URL":"","Upload failed":"Upload failed","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["en-gb"]=n["en-gb"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Decrease indent","Increase indent":"Increase indent"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["en-gb"]=n["en-gb"]||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Downloadable","Edit link":"Edit link",Link:"Link","Link image":"","Link URL":"Link URL","Open in a new tab":"Open in a new tab","Open link in new tab":"Open link in new tab","This link has no URL":"This link has no URL",Unlink:"Unlink"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e["en-gb"]=e["en-gb"]||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Bulleted List","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numbered List","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n["en-gb"]=n["en-gb"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Remove Format":"Remove Format"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e["en-gb"]=e["en-gb"]||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Column",Dashed:"","Delete column":"Delete column","Delete row":"Delete row",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Header column","Header row":"Header row",Height:"","Horizontal text alignment toolbar":"","Insert column left":"Insert column left","Insert column right":"Insert column right","Insert row above":"Insert row above","Insert row below":"Insert row below","Insert table":"Insert table",Inset:"","Justify cell text":"","Merge cell down":"Merge cell down","Merge cell left":"Merge cell left","Merge cell right":"Merge cell right","Merge cell up":"Merge cell up","Merge cells":"Merge cells",None:"",Outset:"",Padding:"",Ridge:"",Row:"Row","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Split cell horizontally","Split cell vertically":"Split cell vertically",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e["en-gb"]=e["en-gb"]||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Aquamarine",Black:"Black",Blue:"Blue",Cancel:"Cancel","Dim grey":"Dim grey","Dropdown toolbar":"","Edit block":"Edit block","Editor toolbar":"",Green:"Green",Grey:"Grey","Light blue":"Light blue","Light green":"Light green","Light grey":"Light grey",Next:"Next",Orange:"Orange",Previous:"Previous",Purple:"Purple",Red:"Red",Redo:"Redo","Remove color":"Remove colour","Restore default":"","Rich Text Editor":"Rich Text Editor","Rich Text Editor, %0":"Rich Text Editor, %0",Save:"Save","Show more items":"",Turquoise:"Turquoise",Undo:"Undo","Upload in progress":"Upload in progress",White:"White",Yellow:"Yellow"}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/eo.js b/core/assets/vendor/ckeditor5/translations/eo.js
new file mode 100644
index 0000000000000000000000000000000000000000..5270850a0a7e4419cd70f3a59d36b187b91dbc2d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/eo.js
@@ -0,0 +1 @@
+!function(i){const o=i.eo=i.eo||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"grasa",Code:"",Italic:"kursiva",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.eo=a.eo||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Elektu ĉapon",Heading:"Ĉapo","Heading 1":"Ĉapo 1","Heading 2":"Ĉapo 2","Heading 3":"Ĉapo 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Paragrafo","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.eo=e.eo||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"Ŝanĝu la alternativan tekston de la bildo","Enter image caption":"Skribu klarigon pri la bildo","Full size image":"Bildo kun reala dimensio","Image resize list":"","Image toolbar":"","image widget":"bilda fenestraĵo","In line":"",Insert:"","Insert image":"Enmetu bildon","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"Flanka biildo","Text alternative":"Alternativa teksto",Update:"","Update image URL":"","Upload failed":"","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.eo=i.eo||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"","Edit link":"",Link:"Ligilo","Link image":"","Link URL":"URL de la ligilo","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"Malligi"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.eo=e.eo||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Bula Listo","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numerita Listo","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.eo=e.eo||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Nuligi","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Refari","Remove color":"","Restore default":"","Rich Text Editor":"Redaktilo de Riĉa Teksto","Rich Text Editor, %0":"Redaktilo de Riĉa Teksto, %0",Save:"Konservi","Show more items":"",Turquoise:"",Undo:"Malfari",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/es.js b/core/assets/vendor/ckeditor5/translations/es.js
new file mode 100644
index 0000000000000000000000000000000000000000..018170a31e81fceaa90716c03746485fe26006cf
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/es.js
@@ -0,0 +1 @@
+!function(e){const i=e.es=e.es||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Centrar","Align left":"Alinear a la izquierda","Align right":"Alinear a la derecha",Justify:"Justificar","Text alignment":"Alineación del texto","Text alignment toolbar":"Barra de herramientas de alineación del texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const d=i.es=i.es||{};d.dictionary=Object.assign(d.dictionary||{},{Bold:"Negrita",Code:"Código",Italic:"Cursiva",Strikethrough:"Tachado",Subscript:"Subíndice",Superscript:"Superíndice",Underline:"Subrayado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.es=i.es||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Cita de bloque"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.es=a.es||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Elegir Encabezado",Heading:"Encabezado","Heading 1":"Encabezado 1","Heading 2":"Encabezado 2","Heading 3":"Encabezado 3","Heading 4":"Encabezado 4","Heading 5":"Encabezado 5","Heading 6":"Encabezado 6",Paragraph:"Párrafo","Type or paste your content here.":"Introduce o pega tu contenido aquí","Type your title":"Introduce tu título"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.es=n.es||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Línea horizontal"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.es=e.es||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Imagen centrada","Change image text alternative":"Cambiar el texto alternativo de la imagen","Enter image caption":"Introducir título de la imagen","Full size image":"Imagen a tamaño completo","Image resize list":"","Image toolbar":"Barra de herramientas de imagen","image widget":"Widget de imagen","In line":"",Insert:"","Insert image":"Insertar imagen","Insert image via URL":"","Left aligned image":"Imagen alineada a la izquierda",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Imagen alineada a la derecha","Side image":"Imagen lateral","Text alternative":"Texto alternativo",Update:"","Update image URL":"","Upload failed":"Fallo en la subida","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.es=n.es||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Disminuir sangría","Increase indent":"Aumentar sangría"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const a=i.es=i.es||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Elija el idioma",Language:"Idioma","Remove language":"Quitar idioma"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.es=n.es||{};e.dictionary=Object.assign(e.dictionary||{},{Downloadable:"Descargable","Edit link":"Editar enlace",Link:"Enlace","Link image":"","Link URL":"URL del enlace","Open in a new tab":"Abrir en una pestaña nueva ","Open link in new tab":"Abrir enlace en una pestaña nueva","This link has no URL":"Este enlace no tiene URL",Unlink:"Quitar enlace"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.es=e.es||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Lista de puntos","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Lista numerada","Numbered list styles toolbar":"",Square:"","To-do List":"Lista de tareas","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.es=o.es||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"Quitar Formato"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.es=e.es||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Columna",Dashed:"","Delete column":"Eliminar columna","Delete row":"Eliminar fila",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Columna de encabezado","Header row":"Fila de encabezado",Height:"","Horizontal text alignment toolbar":"","Insert column left":"Insertar columna izquierda","Insert column right":"Insertar columna derecha","Insert row above":"Insertar fila encima","Insert row below":"Insertar fila debajo","Insert table":"Insertar tabla",Inset:"","Justify cell text":"","Merge cell down":"Combinar celda inferior","Merge cell left":"Combinar celda izquierda","Merge cell right":"Combinar celda derecha","Merge cell up":"Combinar celda superior","Merge cells":"Combinar celdas",None:"",Outset:"",Padding:"",Ridge:"",Row:"Fila","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Dividir celdas horizontalmente","Split cell vertically":"Dividir celdas verticalmente",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"Barra de herramientas de tabla",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t.es=t.es||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"",Angle:"","Approximately equal to":"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"","Bitcoin sign":"Signo del bitcóin","Cedi sign":"","Cent sign":"Signo del centavo","Character categories":"","Colon sign":"Signo del colón","Contains as member":"","Copyright sign":"Signo de derechos de autor","Cruzeiro sign":"Signo del cruceiro","Currency sign":"Signo monetario","Degree sign":"Signo de grado","Division sign":"Signo de división","Dollar sign":"Signo del dólar","Dong sign":"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","Drachma sign":"","Element of":"","Em dash":"Raya","Empty set":"","En dash":"Semirraya","end with leftwards arrow above":"","Euro sign":"Signo del euro","Euro-currency sign":"Signo de la moneda euro","Exclamation question mark":"","For all":"","Fraction slash":"Barra fraccionaria","French franc sign":"Signo del franco francés","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"","Guarani sign":"Signo del guaraní","Horizontal ellipsis":"Puntos suspensivos horizontales","Hryvnia sign":"","Identical to":"","Indian rupee sign":"",Infinity:"",Integral:"",Intersection:"","Inverted exclamation mark":"Signo de exclamación de apertura","Inverted question mark":"Signo de interrogación de apertura","Kip sign":"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin capital letter c with caron":"","Latin capital letter c with circumflex":"","Latin capital letter c with dot above":"","Latin capital letter d with caron":"","Latin capital letter d with stroke":"","Latin capital letter e with breve":"","Latin capital letter e with caron":"","Latin capital letter e with dot above":"","Latin capital letter e with macron":"","Latin capital letter e with ogonek":"","Latin capital letter eng":"","Latin capital letter g with breve":"","Latin capital letter g with cedilla":"","Latin capital letter g with circumflex":"","Latin capital letter g with dot above":"","Latin capital letter h with circumflex":"","Latin capital letter h with stroke":"","Latin capital letter i with breve":"","Latin capital letter i with dot above":"","Latin capital letter i with macron":"","Latin capital letter i with ogonek":"","Latin capital letter i with tilde":"","Latin capital letter j with circumflex":"","Latin capital letter k with cedilla":"","Latin capital letter l with acute":"","Latin capital letter l with caron":"","Latin capital letter l with cedilla":"","Latin capital letter l with middle dot":"","Latin capital letter l with stroke":"","Latin capital letter n with acute":"","Latin capital letter n with caron":"","Latin capital letter n with cedilla":"","Latin capital letter o with breve":"","Latin capital letter o with double acute":"","Latin capital letter o with macron":"","Latin capital letter r with acute":"","Latin capital letter r with caron":"","Latin capital letter r with cedilla":"","Latin capital letter s with acute":"","Latin capital letter s with caron":"","Latin capital letter s with cedilla":"","Latin capital letter s with circumflex":"","Latin capital letter t with caron":"","Latin capital letter t with cedilla":"","Latin capital letter t with stroke":"","Latin capital letter u with breve":"","Latin capital letter u with double acute":"","Latin capital letter u with macron":"","Latin capital letter u with ogonek":"","Latin capital letter u with ring above":"","Latin capital letter u with tilde":"","Latin capital letter w with circumflex":"","Latin capital letter y with circumflex":"","Latin capital letter y with diaeresis":"","Latin capital letter z with acute":"","Latin capital letter z with caron":"","Latin capital letter z with dot above":"","Latin capital ligature ij":"","Latin capital ligature oe":"","Latin small letter a with breve":"","Latin small letter a with macron":"","Latin small letter a with ogonek":"","Latin small letter c with acute":"","Latin small letter c with caron":"","Latin small letter c with circumflex":"","Latin small letter c with dot above":"","Latin small letter d with caron":"","Latin small letter d with stroke":"","Latin small letter dotless i":"","Latin small letter e with breve":"","Latin small letter e with caron":"","Latin small letter e with dot above":"","Latin small letter e with macron":"","Latin small letter e with ogonek":"","Latin small letter eng":"","Latin small letter f with hook":"","Latin small letter g with breve":"","Latin small letter g with cedilla":"","Latin small letter g with circumflex":"","Latin small letter g with dot above":"","Latin small letter h with circumflex":"","Latin small letter h with stroke":"","Latin small letter i with breve":"","Latin small letter i with macron":"","Latin small letter i with ogonek":"","Latin small letter i with tilde":"","Latin small letter j with circumflex":"","Latin small letter k with cedilla":"","Latin small letter kra":"","Latin small letter l with acute":"","Latin small letter l with caron":"","Latin small letter l with cedilla":"","Latin small letter l with middle dot":"","Latin small letter l with stroke":"","Latin small letter long s":"","Latin small letter n preceded by apostrophe":"","Latin small letter n with acute":"","Latin small letter n with caron":"","Latin small letter n with cedilla":"","Latin small letter o with breve":"","Latin small letter o with double acute":"","Latin small letter o with macron":"","Latin small letter r with acute":"","Latin small letter r with caron":"","Latin small letter r with cedilla":"","Latin small letter s with acute":"","Latin small letter s with caron":"","Latin small letter s with cedilla":"","Latin small letter s with circumflex":"","Latin small letter t with caron":"","Latin small letter t with cedilla":"","Latin small letter t with stroke":"","Latin small letter u with breve":"","Latin small letter u with double acute":"","Latin small letter u with macron":"","Latin small letter u with ogonek":"","Latin small letter u with ring above":"","Latin small letter u with tilde":"","Latin small letter w with circumflex":"","Latin small letter y with circumflex":"","Latin small letter z with acute":"","Latin small letter z with caron":"","Latin small letter z with dot above":"","Latin small ligature ij":"","Latin small ligature oe":"","Left double quotation mark":"","Left single quotation mark":"","Left-pointing double angle quotation mark":"","leftwards arrow to bar":"","leftwards dashed arrow":"","leftwards double arrow":"","Less-than or equal to":"","Less-than sign":"","Lira sign":"Signo de la lira","Livre tournois sign":"","Logical and":"","Logical or":"",Macron:"","Manat sign":"","Mill sign":"","Minus sign":"Signo de resta","Multiplication sign":"Signo de multiplicación","N-ary product":"","N-ary summation":"",Nabla:"","Naira sign":"","New sheqel sign":"Signo del nuevo séquel","Nordic mark sign":"","Not an element of":"","Not equal to":"","Not sign":"","on with exclamation mark with left right arrow above":"",Overline:"","Paragraph sign":"Signo de párrafo","Partial differential":"","Per mille sign":"","Per ten thousand sign":"","Peseta sign":"Signo de la peseta","Peso sign":"Signo del peso","Plus-minus sign":"","Pound sign":"Signo de la libra","Proportional to":"","Question exclamation mark":"","Registered sign":"Signo de marca registrada","Reversed paragraph sign":"","Right double quotation mark":"","Right single quotation mark":"","Right-pointing double angle quotation mark":"","rightwards arrow to bar":"","rightwards dashed arrow":"","rightwards double arrow":"","Ruble sign":"Signo del rublo","Rupee sign":"Signo de la rupia","Section sign":"Signo de sección","Single left-pointing angle quotation mark":"","Single low-9 quotation mark":"","Single right-pointing angle quotation mark":"","soon with rightwards arrow above":"","Special characters":"Caracteres especiales","Spesmilo sign":"","Square root":"","Tenge sign":"","There exists":"","Tilde operator":"","top with upwards arrow above":"","Trade mark sign":"Signo de marca comercial","Tugrik sign":"","Turkish lira sign":"","Two dot leader":"",Union:"","up down arrow with base":"","upwards arrow to bar":"","upwards dashed arrow":"","upwards double arrow":"","Vulgar fraction one half":"","Vulgar fraction one quarter":"","Vulgar fraction three quarters":"","Won sign":"Signo del won","Yen sign":"Signo del yen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.es=e.es||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 de %1",Aquamarine:"Aguamarina",Black:"Negro",Blue:"Azul",Cancel:"Cancelar","Dim grey":"Gris Oscuro","Dropdown toolbar":"Barra de herramientas desplegable","Edit block":"Cuadro de edición","Editor toolbar":"Barra de herramientas de edición",Green:"Verde",Grey:"Gris","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Azul Claro","Light green":"Verde Claro","Light grey":"Gris Claro",Next:"Siguiente",Orange:"Anaranjado",Previous:"Anterior",Purple:"Morado",Red:"Rojo",Redo:"Rehacer","Remove color":"Quitar color","Restore default":"Restaurar valores predeterminados","Rich Text Editor":"Editor de Texto Enriquecido","Rich Text Editor, %0":"Editor de Texto Enriquecido, %0",Save:"Guardar","Select all":"Seleccionar todo","Show more items":"Mostrar más elementos",Turquoise:"Turquesa",Undo:"Deshacer","Upload in progress":"Subida en progreso",White:"Blanco","Widget toolbar":"Barra de herramientas del widget",Yellow:"Amarillo"}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/et.js b/core/assets/vendor/ckeditor5/translations/et.js
new file mode 100644
index 0000000000000000000000000000000000000000..c93f01ad1726ab8fb536cd8b2051738c6f5361c0
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/et.js
@@ -0,0 +1 @@
+!function(n){const i=n.et=n.et||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Keskjoondus","Align left":"Vasakjoondus","Align right":"Paremjoondus",Justify:"Rööpjoondus","Text alignment":"Teksti joondamine","Text alignment toolbar":"Teksti joonduse tööriistariba"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.et=i.et||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Rasvane",Code:"Kood",Italic:"Kaldkiri",Strikethrough:"Läbijoonitud",Subscript:"Alaindeks",Superscript:"Ülaindeks",Underline:"Allajoonitud"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const i=t.et=t.et||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Tsitaat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i.et=i.et||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Vali pealkiri",Heading:"Pealkiri","Heading 1":"Pealkiri 1","Heading 2":"Pealkiri 2","Heading 3":"Pealkiri 3","Heading 4":"Pealkiri 4","Heading 5":"Pealkiri 5","Heading 6":"Pealkiri 6",Paragraph:"Lõik","Type or paste your content here.":"Siia tipi või kopeeri tekst.","Type your title":"Sisesta pealkiri"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.et=n.et||{};o.dictionary=Object.assign(o.dictionary||{},{"Horizontal line":"Horisontaalne joon"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.et=e.et||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Keskele joondatud pilt","Change image text alternative":"Muuda pildi asenduskirjeldust","Enter image caption":"Sisesta pildi pealkiri","Full size image":"Täissuuruses pilt","Image resize list":"","Image toolbar":"Piltide tööriistariba","image widget":"pildi vidin","In line":"",Insert:"","Insert image":"Siseta pilt","Insert image via URL":"","Left aligned image":"Vasakule joondatud pilt",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Paremale joondatud pilt","Side image":"Pilt küljel","Text alternative":"Asenduskirjeldus",Update:"","Update image URL":"","Upload failed":"Üleslaadimine ebaõnnestus","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.et=n.et||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Vähenda taanet","Increase indent":"Suurenda taanet"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.et=i.et||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"Allalaaditav","Edit link":"Muuda linki",Link:"Link","Link image":"","Link URL":"Lingi URL","Open in a new tab":"Ava uuel kaardil","Open link in new tab":"Ava link uuel vahekaardil","This link has no URL":"Sellel lingil puudub URL",Unlink:"Eemalda link"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.et=e.et||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Punktidega loetelu","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Nummerdatud loetelu","Numbered list styles toolbar":"",Square:"","To-do List":"Tööde nimekiri","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.et=i.et||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"Eemalda vorming"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.et=e.et||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Lahtri tekst all","Align cell text to the center":"Lahtri tekst keskel","Align cell text to the left":"Lahtri tekst vasakul","Align cell text to the middle":"Lahtri tekst kõrguse järgi keskel","Align cell text to the right":"Lahtri tekst paremal","Align cell text to the top":"Lahtri tekst üleval","Align table to the left":"Tabel joondatud vasakule","Align table to the right":"Tabel joondatud paremale",Alignment:"Joondus",Background:"Taust",Border:"Ääris","Cell properties":"Lahtri omadused","Center table":"Tabel joondatud keskele",Color:"Värvus","Color picker":"Värvi valija",Column:"Veerg",Dashed:"Kriipsjoon","Delete column":"Kustuta veerg","Delete row":"Kustuta rida",Dimensions:"Mõõtmed",Dotted:"Punktiir",Double:"Topelt","Enter table caption":"",Groove:"Kraav","Header column":"Päise veerg","Header row":"Päise rida",Height:"Kõrgus","Horizontal text alignment toolbar":"Teksti rõhtpaigutuse tööriistariba","Insert column left":"Sisesta veerg vasakule","Insert column right":"Sisesta veerg paremale","Insert row above":"Sisesta rida ülespoole","Insert row below":"Sisesta rida allapoole","Insert table":"Sisesta tabel",Inset:"Süvik","Justify cell text":"Lahtri tekst rööpjoondatud","Merge cell down":"Liida alumise lahtriga","Merge cell left":"Liida vasakul oleva lahtriga","Merge cell right":"Liida paremal oleva lahtriga","Merge cell up":"Liida ülemise lahtriga","Merge cells":"Liida lahtrid",None:"Puudub",Outset:"Küngas",Padding:"Vahe sisuni",Ridge:"Vall",Row:"Rida","Select column":"Vali veerg","Select row":"Vali rida",Solid:"Pidev","Split cell horizontally":"Jaga lahter horisontaalselt","Split cell vertically":"Jaga lahter vertikaalselt",Style:"Stiil","Table alignment toolbar":"Tabeli paigutuse tööriistariba","Table cell text alignment":"Teksti paigutus lahtris","Table properties":"Tabeli omadused","Table toolbar":"Tabelite tööriistariba",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Värvus ei sobi. Proovi "#FF0000" või "rgb(255,0,0)" või "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Väärtus ei sobi. Proovi "10px", "2em" või lihtsalt "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Teksti püstpaigutuse tööriistariba",Width:"Laius"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t.et=t.et||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"",Angle:"","Approximately equal to":"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"","Bitcoin sign":"","Cedi sign":"","Cent sign":"Sendi märk","Character categories":"","Colon sign":"","Contains as member":"","Copyright sign":"","Cruzeiro sign":"","Currency sign":"","Degree sign":"","Division sign":"","Dollar sign":"","Dong sign":"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","Drachma sign":"","Element of":"","Em dash":"","Empty set":"","En dash":"","end with leftwards arrow above":"","Euro sign":"Euro märk","Euro-currency sign":"","Exclamation question mark":"","For all":"","Fraction slash":"","French franc sign":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"","Guarani sign":"","Horizontal ellipsis":"","Hryvnia sign":"","Identical to":"","Indian rupee sign":"",Infinity:"",Integral:"",Intersection:"","Inverted exclamation mark":"","Inverted question mark":"","Kip sign":"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin capital letter c with caron":"","Latin capital letter c with circumflex":"","Latin capital letter c with dot above":"","Latin capital letter d with caron":"","Latin capital letter d with stroke":"","Latin capital letter e with breve":"","Latin capital letter e with caron":"","Latin capital letter e with dot above":"","Latin capital letter e with macron":"","Latin capital letter e with ogonek":"","Latin capital letter eng":"","Latin capital letter g with breve":"","Latin capital letter g with cedilla":"","Latin capital letter g with circumflex":"","Latin capital letter g with dot above":"","Latin capital letter h with circumflex":"","Latin capital letter h with stroke":"","Latin capital letter i with breve":"","Latin capital letter i with dot above":"","Latin capital letter i with macron":"","Latin capital letter i with ogonek":"","Latin capital letter i with tilde":"","Latin capital letter j with circumflex":"","Latin capital letter k with cedilla":"","Latin capital letter l with acute":"","Latin capital letter l with caron":"","Latin capital letter l with cedilla":"","Latin capital letter l with middle dot":"","Latin capital letter l with stroke":"","Latin capital letter n with acute":"","Latin capital letter n with caron":"","Latin capital letter n with cedilla":"","Latin capital letter o with breve":"","Latin capital letter o with double acute":"","Latin capital letter o with macron":"","Latin capital letter r with acute":"","Latin capital letter r with caron":"","Latin capital letter r with cedilla":"","Latin capital letter s with acute":"","Latin capital letter s with caron":"","Latin capital letter s with cedilla":"","Latin capital letter s with circumflex":"","Latin capital letter t with caron":"","Latin capital letter t with cedilla":"","Latin capital letter t with stroke":"","Latin capital letter u with breve":"","Latin capital letter u with double acute":"","Latin capital letter u with macron":"","Latin capital letter u with ogonek":"","Latin capital letter u with ring above":"","Latin capital letter u with tilde":"","Latin capital letter w with circumflex":"","Latin capital letter y with circumflex":"","Latin capital letter y with diaeresis":"","Latin capital letter z with acute":"","Latin capital letter z with caron":"","Latin capital letter z with dot above":"","Latin capital ligature ij":"","Latin capital ligature oe":"","Latin small letter a with breve":"","Latin small letter a with macron":"","Latin small letter a with ogonek":"","Latin small letter c with acute":"","Latin small letter c with caron":"","Latin small letter c with circumflex":"","Latin small letter c with dot above":"","Latin small letter d with caron":"","Latin small letter d with stroke":"","Latin small letter dotless i":"","Latin small letter e with breve":"","Latin small letter e with caron":"","Latin small letter e with dot above":"","Latin small letter e with macron":"","Latin small letter e with ogonek":"","Latin small letter eng":"","Latin small letter f with hook":"","Latin small letter g with breve":"","Latin small letter g with cedilla":"","Latin small letter g with circumflex":"","Latin small letter g with dot above":"","Latin small letter h with circumflex":"","Latin small letter h with stroke":"","Latin small letter i with breve":"","Latin small letter i with macron":"","Latin small letter i with ogonek":"","Latin small letter i with tilde":"","Latin small letter j with circumflex":"","Latin small letter k with cedilla":"","Latin small letter kra":"","Latin small letter l with acute":"","Latin small letter l with caron":"","Latin small letter l with cedilla":"","Latin small letter l with middle dot":"","Latin small letter l with stroke":"","Latin small letter long s":"","Latin small letter n preceded by apostrophe":"","Latin small letter n with acute":"","Latin small letter n with caron":"","Latin small letter n with cedilla":"","Latin small letter o with breve":"","Latin small letter o with double acute":"","Latin small letter o with macron":"","Latin small letter r with acute":"","Latin small letter r with caron":"","Latin small letter r with cedilla":"","Latin small letter s with acute":"","Latin small letter s with caron":"","Latin small letter s with cedilla":"","Latin small letter s with circumflex":"","Latin small letter t with caron":"","Latin small letter t with cedilla":"","Latin small letter t with stroke":"","Latin small letter u with breve":"","Latin small letter u with double acute":"","Latin small letter u with macron":"","Latin small letter u with ogonek":"","Latin small letter u with ring above":"","Latin small letter u with tilde":"","Latin small letter w with circumflex":"","Latin small letter y with circumflex":"","Latin small letter z with acute":"","Latin small letter z with caron":"","Latin small letter z with dot above":"","Latin small ligature ij":"","Latin small ligature oe":"","Left double quotation mark":"","Left single quotation mark":"","Left-pointing double angle quotation mark":"","leftwards arrow to bar":"","leftwards dashed arrow":"","leftwards double arrow":"","Less-than or equal to":"","Less-than sign":"","Lira sign":"","Livre tournois sign":"","Logical and":"","Logical or":"",Macron:"","Manat sign":"","Mill sign":"","Minus sign":"Miinusmärk","Multiplication sign":"","N-ary product":"","N-ary summation":"",Nabla:"","Naira sign":"","New sheqel sign":"","Nordic mark sign":"","Not an element of":"","Not equal to":"","Not sign":"","on with exclamation mark with left right arrow above":"",Overline:"","Paragraph sign":"","Partial differential":"","Per mille sign":"","Per ten thousand sign":"","Peseta sign":"","Peso sign":"","Plus-minus sign":"","Pound sign":"Naela märk","Proportional to":"","Question exclamation mark":"","Registered sign":"","Reversed paragraph sign":"","Right double quotation mark":"","Right single quotation mark":"","Right-pointing double angle quotation mark":"","rightwards arrow to bar":"","rightwards dashed arrow":"","rightwards double arrow":"","Ruble sign":"","Rupee sign":"","Section sign":"","Single left-pointing angle quotation mark":"","Single low-9 quotation mark":"","Single right-pointing angle quotation mark":"","soon with rightwards arrow above":"","Special characters":"Erimärgid","Spesmilo sign":"","Square root":"","Tenge sign":"","There exists":"","Tilde operator":"","top with upwards arrow above":"","Trade mark sign":"","Tugrik sign":"","Turkish lira sign":"","Two dot leader":"",Union:"","up down arrow with base":"","upwards arrow to bar":"","upwards dashed arrow":"","upwards double arrow":"","Vulgar fraction one half":"","Vulgar fraction one quarter":"","Vulgar fraction three quarters":"","Won sign":"","Yen sign":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.et=e.et||{};i.dictionary=Object.assign(i.dictionary||{},{"%0 of %1":"%0 / %1",Aquamarine:"Akvamariin",Black:"Must",Blue:"Sinine",Cancel:"Loobu","Dim grey":"Tumehall","Dropdown toolbar":"Avatav tööriistariba","Edit block":"Muuda plokki","Editor toolbar":"Redaktori tööriistariba",Green:"Roheline",Grey:"Hall","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Helesinine","Light green":"Heleroheline","Light grey":"Helehall",Next:"Järgmine",Orange:"Oranž",Previous:"Eelmine",Purple:"Lilla",Red:"Punane",Redo:"Tee uuesti","Remove color":"Eemalda värv","Restore default":"","Rich Text Editor":"Tekstiredaktor","Rich Text Editor, %0":"Tekstiredaktor, %0",Save:"Salvesta","Select all":"Vali kõik","Show more items":"Näita veel",Turquoise:"Türkiis",Undo:"Võta tagasi","Upload in progress":"Üleslaadimine pooleli",White:"Valge","Widget toolbar":"Vidinate tööriistariba",Yellow:"Kollane"}),i.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/eu.js b/core/assets/vendor/ckeditor5/translations/eu.js
new file mode 100644
index 0000000000000000000000000000000000000000..f2e07d72f5fe40e5c3bd2c7054adf594f522dc6b
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/eu.js
@@ -0,0 +1 @@
+!function(i){const n=i.eu=i.eu||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Lodia",Code:"Kodea",Italic:"Etzana",Strikethrough:"",Subscript:"",Superscript:"",Underline:"Azpimarra"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.eu=i.eu||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Aipua"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.eu=a.eu||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Aukeratu izenburua",Heading:"Izenburua","Heading 1":"Izenburua 1","Heading 2":"Izenburua 2","Heading 3":"Izenburua 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Paragrafoa","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.eu=e.eu||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Zentratutako irudia","Change image text alternative":"Aldatu irudiaren ordezko testua","Enter image caption":"Sartu irudiaren epigrafea","Full size image":"Tamaina osoko irudia","Image resize list":"","Image toolbar":"","image widget":"irudi widgeta","In line":"",Insert:"","Insert image":"Txertatu irudia","Insert image via URL":"","Left aligned image":"Ezkerrean lerrokatutako irudia",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Eskuinean lerrokatutako irudia","Side image":"Alboko irudia","Text alternative":"Ordezko testua",Update:"","Update image URL":"","Upload failed":"Kargatzeak huts egin du","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.eu=n.eu||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"",Link:"Esteka","Link image":"","Link URL":"Estekaren URLa","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"Desestekatu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.eu=e.eu||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Buletdun zerrenda","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Zenbakidun zerrenda","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.eu=e.eu||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Utzi","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Berregin","Remove color":"","Restore default":"","Rich Text Editor":"Testu aberastuaren editorea","Rich Text Editor, %0":"Testu aberastuaren editorea, %0",Save:"Gorde","Show more items":"",Turquoise:"",Undo:"Desegin",White:"",Yellow:""}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/fa.js b/core/assets/vendor/ckeditor5/translations/fa.js
new file mode 100644
index 0000000000000000000000000000000000000000..85cbfe433467b403add70ec58917ce3d9f576ea8
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/fa.js
@@ -0,0 +1 @@
+!function(n){const i=n.fa=n.fa||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"تراز وسط","Align left":"تراز چپ","Align right":"تراز راست",Justify:"هم تراز کردن","Text alignment":"تراز متن","Text alignment toolbar":"نوار ابزار ترازبندی متن"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fa=i.fa||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"درشت",Code:"کد",Italic:"کج",Strikethrough:"خط خورده",Subscript:"پایین نویس",Superscript:"بالانویس",Underline:"خط زیر"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fa=i.fa||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":" بلوک نقل قول"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.fa=n.fa||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"انتخاب عنوان",Heading:"عنوان","Heading 1":"عنوان 1","Heading 2":"عنوان 2","Heading 3":"عنوان 3","Heading 4":"عنوان 4","Heading 5":"عنوان 5","Heading 6":"عنوان 6",Paragraph:"پاراگراف","Type or paste your content here.":"محتوای خود را در اینجا تایپ یا پیست کنید.","Type your title":"عنوان خود را تایپ کنید"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fa=i.fa||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"خط افقی"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.fa=e.fa||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"تصویر در وسط","Change image text alternative":"تغییر متن جایگزین تصویر","Enter image caption":"عنوان تصویر را وارد کنید","Full size image":"تصویر در اندازه کامل","Image resize list":"","Image toolbar":"نوارابزار تصویر","image widget":"ابزاره تصویر","In line":"",Insert:"","Insert image":"قرار دادن تصویر","Insert image via URL":"","Left aligned image":"تصویر تراز شده چپ",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"تصویر تراز شده راست","Side image":"تصویر جانبی","Text alternative":"متن جایگزین",Update:"","Update image URL":"","Upload failed":"آپلود ناموفق بود","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.fa=n.fa||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"کاهش تورفتگی","Increase indent":"افزایش تورفتگی"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.fa=n.fa||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"قابل بارگیری","Edit link":"ویرایش پیوند",Link:"پیوند","Link image":"اتصال پیوند به تصویر","Link URL":"نشانی اینترنتی پیوند","Open in a new tab":"بازکردن در برگه جدید","Open link in new tab":"باز کردن پیوند در برگه جدید","This link has no URL":"این پیوند نشانی اینترنتی ندارد",Unlink:"لغو پیوند"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.fa=e.fa||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"لیست نشانه‌دار","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"لیست عددی","Numbered list styles toolbar":"",Square:"","To-do List":"لیست انجام کار","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fa=i.fa||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"حذف کردن قالب"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.fa=e.fa||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"متن سلول را در سمت راست تراز کنید","Align cell text to the top":"","Align table to the left":"","Align table to the right":"جدول را در سمت راست تراز کنید",Alignment:"ترازبندی",Background:"زمینه",Border:"حاشیه","Cell properties":"خصوصیات سلول","Center table":"جدول وسط",Color:"رنگ","Color picker":"",Column:"ستون",Dashed:"نقطه چین","Delete column":"حذف ستون","Delete row":"حذف سطر",Dimensions:"ابعاد",Dotted:"خط چین",Double:"دوبل","Enter table caption":"",Groove:"خط دار کردن","Header column":"ستون سربرگ","Header row":"سطر سربرگ",Height:"ارتفاع","Horizontal text alignment toolbar":"","Insert column left":"درج ستون در سمت چپ","Insert column right":"درج ستون در سمت راست","Insert row above":"درج سطر در بالا","Insert row below":"درج سطر در پایین","Insert table":"درج جدول",Inset:"","Justify cell text":"","Merge cell down":"ادغام سلول پایین","Merge cell left":"ادغام سلول چپ","Merge cell right":"ادغام سلول راست","Merge cell up":"ادغام سلول بالا","Merge cells":"ادغام سلول ها",None:"هیچ کدام",Outset:"",Padding:"حاشیه داخلی",Ridge:"",Row:"سطر","Select column":"","Select row":"",Solid:"توپر","Split cell horizontally":"تقسیم افقی سلول","Split cell vertically":"تقسیم عمودی سلول",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"خصوصیات جدول","Table toolbar":"نوارابزار جدول",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:"عرض"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t.fa=t.fa||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"",Angle:"","Approximately equal to":"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"","Bitcoin sign":"","Cedi sign":"","Cent sign":"","Character categories":"","Colon sign":"","Contains as member":"","Copyright sign":"","Cruzeiro sign":"","Currency sign":"","Degree sign":"","Division sign":"","Dollar sign":"","Dong sign":"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"downwards double arrow","Drachma sign":"","Element of":"","Em dash":"","Empty set":"","En dash":"","end with leftwards arrow above":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","For all":"","Fraction slash":"","French franc sign":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"","Guarani sign":"","Horizontal ellipsis":"","Hryvnia sign":"","Identical to":"","Indian rupee sign":"",Infinity:"",Integral:"",Intersection:"","Inverted exclamation mark":"","Inverted question mark":"","Kip sign":"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin capital letter c with caron":"","Latin capital letter c with circumflex":"","Latin capital letter c with dot above":"","Latin capital letter d with caron":"","Latin capital letter d with stroke":"","Latin capital letter e with breve":"","Latin capital letter e with caron":"","Latin capital letter e with dot above":"","Latin capital letter e with macron":"","Latin capital letter e with ogonek":"","Latin capital letter eng":"","Latin capital letter g with breve":"","Latin capital letter g with cedilla":"","Latin capital letter g with circumflex":"","Latin capital letter g with dot above":"","Latin capital letter h with circumflex":"","Latin capital letter h with stroke":"","Latin capital letter i with breve":"","Latin capital letter i with dot above":"","Latin capital letter i with macron":"","Latin capital letter i with ogonek":"","Latin capital letter i with tilde":"","Latin capital letter j with circumflex":"","Latin capital letter k with cedilla":"","Latin capital letter l with acute":"","Latin capital letter l with caron":"","Latin capital letter l with cedilla":"","Latin capital letter l with middle dot":"","Latin capital letter l with stroke":"","Latin capital letter n with acute":"","Latin capital letter n with caron":"","Latin capital letter n with cedilla":"","Latin capital letter o with breve":"","Latin capital letter o with double acute":"","Latin capital letter o with macron":"","Latin capital letter r with acute":"","Latin capital letter r with caron":"","Latin capital letter r with cedilla":"","Latin capital letter s with acute":"","Latin capital letter s with caron":"","Latin capital letter s with cedilla":"","Latin capital letter s with circumflex":"","Latin capital letter t with caron":"","Latin capital letter t with cedilla":"","Latin capital letter t with stroke":"","Latin capital letter u with breve":"","Latin capital letter u with double acute":"","Latin capital letter u with macron":"","Latin capital letter u with ogonek":"","Latin capital letter u with ring above":"","Latin capital letter u with tilde":"","Latin capital letter w with circumflex":"","Latin capital letter y with circumflex":"","Latin capital letter y with diaeresis":"","Latin capital letter z with acute":"","Latin capital letter z with caron":"","Latin capital letter z with dot above":"","Latin capital ligature ij":"","Latin capital ligature oe":"","Latin small letter a with breve":"","Latin small letter a with macron":"","Latin small letter a with ogonek":"","Latin small letter c with acute":"","Latin small letter c with caron":"","Latin small letter c with circumflex":"","Latin small letter c with dot above":"","Latin small letter d with caron":"","Latin small letter d with stroke":"","Latin small letter dotless i":"","Latin small letter e with breve":"","Latin small letter e with caron":"","Latin small letter e with dot above":"","Latin small letter e with macron":"","Latin small letter e with ogonek":"","Latin small letter eng":"","Latin small letter f with hook":"","Latin small letter g with breve":"","Latin small letter g with cedilla":"","Latin small letter g with circumflex":"","Latin small letter g with dot above":"","Latin small letter h with circumflex":"","Latin small letter h with stroke":"","Latin small letter i with breve":"","Latin small letter i with macron":"","Latin small letter i with ogonek":"","Latin small letter i with tilde":"","Latin small letter j with circumflex":"","Latin small letter k with cedilla":"","Latin small letter kra":"","Latin small letter l with acute":"","Latin small letter l with caron":"","Latin small letter l with cedilla":"","Latin small letter l with middle dot":"","Latin small letter l with stroke":"","Latin small letter long s":"","Latin small letter n preceded by apostrophe":"","Latin small letter n with acute":"","Latin small letter n with caron":"","Latin small letter n with cedilla":"","Latin small letter o with breve":"","Latin small letter o with double acute":"","Latin small letter o with macron":"","Latin small letter r with acute":"","Latin small letter r with caron":"","Latin small letter r with cedilla":"","Latin small letter s with acute":"","Latin small letter s with caron":"","Latin small letter s with cedilla":"","Latin small letter s with circumflex":"","Latin small letter t with caron":"","Latin small letter t with cedilla":"","Latin small letter t with stroke":"","Latin small letter u with breve":"","Latin small letter u with double acute":"","Latin small letter u with macron":"","Latin small letter u with ogonek":"","Latin small letter u with ring above":"","Latin small letter u with tilde":"","Latin small letter w with circumflex":"","Latin small letter y with circumflex":"","Latin small letter z with acute":"","Latin small letter z with caron":"","Latin small letter z with dot above":"","Latin small ligature ij":"","Latin small ligature oe":"","Left double quotation mark":"","Left single quotation mark":"","Left-pointing double angle quotation mark":"","leftwards arrow to bar":"","leftwards dashed arrow":"leftwards dashed arrow","leftwards double arrow":"پیکان دوتایی چپ","Less-than or equal to":"","Less-than sign":"","Lira sign":"","Livre tournois sign":"","Logical and":"","Logical or":"",Macron:"","Manat sign":"","Mill sign":"","Minus sign":"","Multiplication sign":"","N-ary product":"","N-ary summation":"",Nabla:"","Naira sign":"","New sheqel sign":"","Nordic mark sign":"","Not an element of":"","Not equal to":"","Not sign":"","on with exclamation mark with left right arrow above":"",Overline:"","Paragraph sign":"","Partial differential":"","Per mille sign":"","Per ten thousand sign":"","Peseta sign":"","Peso sign":"","Plus-minus sign":"","Pound sign":"","Proportional to":"","Question exclamation mark":"","Registered sign":"","Reversed paragraph sign":"","Right double quotation mark":"","Right single quotation mark":"","Right-pointing double angle quotation mark":"","rightwards arrow to bar":"","rightwards dashed arrow":"","rightwards double arrow":"","Ruble sign":"","Rupee sign":"","Section sign":"","Single left-pointing angle quotation mark":"","Single low-9 quotation mark":"","Single right-pointing angle quotation mark":"","soon with rightwards arrow above":"","Special characters":"کاراکترهای ویژه","Spesmilo sign":"","Square root":"","Tenge sign":"","There exists":"","Tilde operator":"","top with upwards arrow above":"","Trade mark sign":"","Tugrik sign":"","Turkish lira sign":"","Two dot leader":"",Union:"","up down arrow with base":"","upwards arrow to bar":"","upwards dashed arrow":"","upwards double arrow":"","Vulgar fraction one half":"","Vulgar fraction one quarter":"","Vulgar fraction three quarters":"","Won sign":"","Yen sign":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.fa=e.fa||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"0% از 1%",Aquamarine:"زمرد کبود",Black:"سیاه",Blue:"آبی",Cancel:"لغو","Dim grey":"خاکستری تیره","Dropdown toolbar":"نوارابزار کشویی","Edit block":"ویرایش قطعه","Editor toolbar":"نوارابزار ویرایشگر",Green:"سبز",Grey:"خاکستری","Insert paragraph after block":"درج پاراگراف بعد از بلوک","Insert paragraph before block":"درج پاراگراف قبل از بلوک","Light blue":"آبی روشن","Light green":"سبز روشن","Light grey":"خاکستری روشن",Next:"بعدی",Orange:"نارنجی",Previous:"قبلی",Purple:"بنفش",Red:"قرمز",Redo:"باز انجام","Remove color":"حذف رنگ","Restore default":"","Rich Text Editor":"ویرایشگر متن غنی","Rich Text Editor, %0":"ویرایشگر متن غنی، %0",Save:"ذخیره","Select all":"انتخاب همه","Show more items":"نمایش گزینه‌های بیشتر",Turquoise:"فیروزه ای",Undo:"بازگردانی","Upload in progress":"آپلود در حال انجام",White:"سفید","Widget toolbar":"نوار ابزار ویجت",Yellow:"زرد"}),o.getPluralForm=function(e){return e>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/fi.js b/core/assets/vendor/ckeditor5/translations/fi.js
new file mode 100644
index 0000000000000000000000000000000000000000..4a198f5cb5390c63368218e0638d951daeb6e285
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/fi.js
@@ -0,0 +1 @@
+!function(a){const i=a.fi=a.fi||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Tasaa keskelle","Align left":"Tasaa vasemmalle","Align right":"Tasaa oikealle",Justify:"Tasaa molemmat reunat","Text alignment":"Tekstin tasaus","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fi=i.fi||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Lihavointi",Code:"Koodi",Italic:"Kursivointi",Strikethrough:"Yliviivaus",Subscript:"Alaindeksi",Superscript:"Yläindeksi",Underline:"Alleviivaus"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fi=i.fi||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Lainaus"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.fi=i.fi||{};o.dictionary=Object.assign(o.dictionary||{},{"Choose heading":"Valitse otsikko",Heading:"Otsikkotyyli","Heading 1":"Otsikko 1","Heading 2":"Otsikko 2","Heading 3":"Otsikko 3","Heading 4":"Otsikko 4","Heading 5":"Otsikko 5","Heading 6":"Otsikko 6",Paragraph:"Kappale","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.fi=e.fi||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Keskitetty kuva","Change image text alternative":"Vaihda kuvan vaihtoehtoinen teksti","Enter image caption":"Syötä kuvateksti","Full size image":"Täysikokoinen kuva","Image resize list":"","Image toolbar":"","image widget":"Kuvavimpain","In line":"",Insert:"","Insert image":"Lisää kuva","Insert image via URL":"","Left aligned image":"Vasemmalle tasattu kuva",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Oikealle tasattu kuva","Side image":"Pieni kuva","Text alternative":"Vaihtoehtoinen teksti",Update:"","Update image URL":"","Upload failed":"Lataus epäonnistui","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.fi=n.fi||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Vähennä sisennystä","Increase indent":"Lisää sisennystä"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fi=i.fi||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"","Edit link":"Muokkaa linkkiä",Link:"Linkki","Link image":"","Link URL":"Linkin osoite","Open in a new tab":"","Open link in new tab":"Avaa linkki uudessa välilehdessä","This link has no URL":"Linkillä ei ole URL-osoitetta",Unlink:"Poista linkki"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.fi=e.fi||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Lista","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numeroitu lista","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.fi=i.fi||{};o.dictionary=Object.assign(o.dictionary||{},{"Remove Format":"Poista muotoilu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.fi=e.fi||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Sarake",Dashed:"","Delete column":"Poista sarake","Delete row":"Poista rivi",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Otsikkosarake","Header row":"Otsikkorivi",Height:"","Horizontal text alignment toolbar":"","Insert column left":"Lisää sarake vasemmalle","Insert column right":"Lisää sarake oikealle","Insert row above":"Lisää rivi ylle","Insert row below":"Lisää rivi alle","Insert table":"Lisää taulukko",Inset:"","Justify cell text":"","Merge cell down":"Yhdistä solu alas","Merge cell left":"Yhdistä solu vasemmalle","Merge cell right":"Yhdistä solu oikealle","Merge cell up":"Yhdistä solu ylös","Merge cells":"Yhdistä tai jaa soluja",None:"",Outset:"",Padding:"",Ridge:"",Row:"Rivi","Select column":"Valitse sarake","Select row":"Valitse rivi",Solid:"","Split cell horizontally":"Jaa solu vaakasuunnassa","Split cell vertically":"Jaa solu pystysuunnassa",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.fi=e.fi||{};i.dictionary=Object.assign(i.dictionary||{},{"%0 of %1":"",Aquamarine:"Akvamariini",Black:"Musta",Blue:"Sininen",Cancel:"Peruuta","Dim grey":"","Dropdown toolbar":"","Edit block":"Muokkaa lohkoa","Editor toolbar":"",Green:"Vihreä",Grey:"Harmaa","Light blue":"Vaaleansininen","Light green":"Vaaleanvihreä","Light grey":"Vaaleanharmaa",Next:"",Orange:"Oranssi",Previous:"",Purple:"Purppura",Red:"Punainen",Redo:"Tee uudelleen","Remove color":"Poista väri","Restore default":"","Rich Text Editor":"Rikas tekstieditori","Rich Text Editor, %0":"Rikas tekstieditori, %0",Save:"Tallenna","Show more items":"",Turquoise:"Turkoosi",Undo:"Peru","Upload in progress":"Lähetys käynnissä",White:"Valkoinen",Yellow:"Keltainen"}),i.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/fr.js b/core/assets/vendor/ckeditor5/translations/fr.js
new file mode 100644
index 0000000000000000000000000000000000000000..e8d435d21ac4417c0012f4b9d98a73a3c9739ea2
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/fr.js
@@ -0,0 +1 @@
+!function(e){const t=e.fr=e.fr||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Centrer","Align left":"Aligner à gauche","Align right":"Aligner à droite",Justify:"Justifier","Text alignment":"Alignement du texte","Text alignment toolbar":"Barre d'outils d'alignement du texte"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fr=i.fr||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Gras",Code:"Code",Italic:"Italique",Strikethrough:"Barré",Subscript:"Indice",Superscript:"Exposant",Underline:"Souligné"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fr=i.fr||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citation"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.fr=e.fr||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Choisir l'en-tête",Heading:"En-tête","Heading 1":"Titre 1","Heading 2":"Titre 2","Heading 3":"Titre 3","Heading 4":"Titre 4","Heading 5":"Titre 5","Heading 6":"Titre 6",Paragraph:"Paragraphe","Type or paste your content here.":"Noter ou coller votre contenu ici","Type your title":"Rentrer votre titre"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fr=i.fr||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Ligne horizontale"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.fr=e.fr||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Image centrée","Change image text alternative":"Changer le texte alternatif à l’image","Enter image caption":"Saisir la légende de l’image","Full size image":"Image taille réelle","Image resize list":"Liste des tailles d'images","Image toolbar":"Barre d'outils des images","image widget":"Objet image","In line":"",Insert:"Insérer","Insert image":"Insérer une image","Insert image via URL":"Insérer une image à partir d'une URL","Left aligned image":"Image alignée à gauche",Original:"Taille originale","Resize image":"Redimensionner l'image","Resize image to %0":"Redimensionner à %0","Resize image to the original size":"Appliquer les dimensions d'origine","Right aligned image":"Image alignée à droite","Side image":"Image latérale","Text alternative":"Texte alternatif",Update:"Modifier","Update image URL":"Modifier l'URL de l'image","Upload failed":"Échec de l'envoi","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e.fr=e.fr||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Diminuer le retrait","Increase indent":"Augmenter le retrait"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const n=a.fr=a.fr||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Choisir la langue",Language:"Langue","Remove language":"Supprimer la langue"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.fr=n.fr||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Fichier téléchargeable","Edit link":"Modifier le lien",Link:"Lien","Link image":"Lien d'image","Link URL":"URL du lien","Open in a new tab":"Ouvrir dans un nouvel onglet","Open link in new tab":"Ouvrir le lien dans un nouvel onglet","This link has no URL":"Ce lien n'a pas d'URL",Unlink:"Supprimer le lien"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const s=e.fr=e.fr||{};s.dictionary=Object.assign(s.dictionary||{},{"Bulleted List":"Liste à puces","Bulleted list styles toolbar":"Barre d'outils des styles de liste à puce",Circle:"Cercle",Decimal:"Chiffres","Decimal with leading zero":"Chiffres avec des zéros supplémentaire",Disc:"Disque","Lower-latin":"Lettres minuscules","Lower–roman":"Chiffres romains en minuscules","Numbered List":"Liste numérotée","Numbered list styles toolbar":"Barre d'outils des styles de liste numérotée",Square:"Carré","To-do List":"Liste de tâches","Toggle the circle list style":'Activer / désactiver le style de liste "cercle"',"Toggle the decimal list style":'Activer / désactiver le style de liste "chiffres"',"Toggle the decimal with leading zero list style":'Activer / désactiver le style de liste "chiffres de mêmes longueurs"',"Toggle the disc list style":'Activer / désactiver le style de liste "disque"',"Toggle the lower–latin list style":'Activer / désactiver le style de liste "lettres minuscules"',"Toggle the lower–roman list style":'Activer / désactiver le style de liste "chiffres romains en minuscules"',"Toggle the square list style":'Activer / désactiver le style de liste "carré"',"Toggle the upper–latin list style":'Activer / désactiver le style de liste "lettres majuscules"',"Toggle the upper–roman list style":'Activer / désactiver le style de liste "chiffres romains en majuscules"',"Upper-latin":"Lettres majuscules","Upper-roman":"Chiffres romains en majuscules"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.fr=n.fr||{};o.dictionary=Object.assign(o.dictionary||{},{"Remove Format":"Enlever le format"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.fr=e.fr||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Aligner le texte en bas","Align cell text to the center":"Aligner la cellule au centre","Align cell text to the left":"Aligner la cellule à gauche","Align cell text to the middle":"Aligner le texte au milieu","Align cell text to the right":"Aligner la cellule à droite","Align cell text to the top":"Aligner le texte en haut","Align table to the left":"Aligner le tableau à gauche","Align table to the right":"Aligner le tableau à droite",Alignment:"Alignement",Background:"Fond",Border:"Bordure","Cell properties":"Propriétés de la cellule","Center table":"Centrer le tableau ",Color:"Couleur","Color picker":"Pipette à couleurs",Column:"Colonne",Dashed:"Tirets","Delete column":"Supprimer la colonne","Delete row":"Supprimer la ligne",Dimensions:"Dimensions",Dotted:"Pointillés",Double:"Double","Enter table caption":"",Groove:"Rainuré","Header column":"Colonne d'entête","Header row":"Ligne d'entête",Height:"Hauteur","Horizontal text alignment toolbar":"Barre d'outils pour modifier l'alignement horizontal du texte","Insert column left":"Insérer une colonne à gauche","Insert column right":"Insérer une colonne à droite","Insert row above":"Insérer une ligne au-dessus","Insert row below":"Insérer une ligne en-dessous","Insert table":"Insérer un tableau",Inset:"Relief intérieur","Justify cell text":"Justifier le contenu de la cellule","Merge cell down":"Fusionner la cellule en-dessous","Merge cell left":"Fusionner la cellule à gauche","Merge cell right":"Fusionner la cellule à droite","Merge cell up":"Fusionner la cellule au-dessus","Merge cells":"Fusionner les cellules",None:"Aucun",Outset:"Relief extérieur",Padding:"Remplissage pour aérer le texte",Ridge:"Relief",Row:"Ligne","Select column":"Sélectionner la colonne","Select row":"Sélectionner la ligne",Solid:"Continu","Split cell horizontally":"Scinder la cellule horizontalement","Split cell vertically":"Scinder la cellule verticalement",Style:"Style","Table alignment toolbar":"Barre d'outils pour modifier l'alignement du tableau","Table cell text alignment":"Alignement du texte de la cellule","Table properties":"Propriétés du tableau","Table toolbar":"Barre d'outils des tableaux",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'La couleur est invalide. Essayez "#FF0000" ou "rgb(255,0,0)" ou "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'La valeur est invalide. Essayez "10px" ou "2em" ou simplement "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Barre d'outils pour modifier l'alignement vertical du texte",Width:"Largeur"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.fr=e.fr||{};t.dictionary=Object.assign(t.dictionary||{},{"Almost equal to":"Presque égal à",Angle:"Angle","Approximately equal to":"Environ égal à","Asterisk operator":"Astérisque","Austral sign":"Austral","back with leftwards arrow above":"Précédent avec flèche vers la gauche","Bitcoin sign":"Bitcoin","Cedi sign":"Cédi","Cent sign":"Centime","Character categories":"Catégories de caractères","Colon sign":"Deux points","Contains as member":"Contient","Copyright sign":"Copyright","Cruzeiro sign":"Cruzeiro","Currency sign":"Symbole monétaire","Degree sign":"Degré","Division sign":"Division","Dollar sign":"Dollar","Dong sign":"Dong","Double dagger":"Croix de Lorraine","Double exclamation mark":"Double point d'exclamation","Double low-9 quotation mark":"Guillemet-virgule double inférieur","Double question mark":"Double point d'interrogation","downwards arrow to bar":"Flèche vers le bas avec barre de fin","downwards dashed arrow":"Flèche en pointillés vers le bas","downwards double arrow":"Double flèche vers le bas","Drachma sign":"Drachme","Element of":"Appartient à","Em dash":"Tiret long","Empty set":"Élément vide","En dash":"Tiret","end with leftwards arrow above":"Fin avec flèche vers la gauche","Euro sign":"Euro","Euro-currency sign":"Symbole monétaire de l'euro","Exclamation question mark":"Point exclamation et question","For all":"Pour tout","Fraction slash":"Fraction","French franc sign":"Franc français","German penny sign":"Pfennig","Greater-than or equal to":"Signe supérieur ou égal","Greater-than sign":"Signe supérieur","Guarani sign":"Guarani","Horizontal ellipsis":"Trois points","Hryvnia sign":"Hryvnia","Identical to":"Identique à","Indian rupee sign":"Roupie indienne",Infinity:"Infini",Integral:"Intégrale",Intersection:"Intersection","Inverted exclamation mark":"Point d'exclamation inversé","Inverted question mark":"Point d'interrogation inversé","Kip sign":"Kip","Latin capital letter a with breve":"A bref majuscule","Latin capital letter a with macron":"A barre majuscule","Latin capital letter a with ogonek":"A ogonek majuscule","Latin capital letter c with acute":"C accent aigu majuscule","Latin capital letter c with caron":"C caron majuscule","Latin capital letter c with circumflex":"C circonflexe majuscule","Latin capital letter c with dot above":"C point suscrit majuscule","Latin capital letter d with caron":"D caron majuscule","Latin capital letter d with stroke":"D barré majuscule","Latin capital letter e with breve":"E bref majuscule","Latin capital letter e with caron":"E caron majuscule","Latin capital letter e with dot above":"E point suscrit majuscule","Latin capital letter e with macron":"E macron majuscule","Latin capital letter e with ogonek":"E ogonek majuscule","Latin capital letter eng":"Eng majuscule","Latin capital letter g with breve":"G bref majuscule","Latin capital letter g with cedilla":"G cédille majuscule","Latin capital letter g with circumflex":"G accent circonflexe majuscule","Latin capital letter g with dot above":"G point suscrit majuscule","Latin capital letter h with circumflex":"H accent circonflexe majuscule","Latin capital letter h with stroke":"H barré majuscule","Latin capital letter i with breve":"I bref majuscule","Latin capital letter i with dot above":"I point suscrit majuscule","Latin capital letter i with macron":"I macron majuscule","Latin capital letter i with ogonek":"I ogonek majuscule","Latin capital letter i with tilde":"I tilde majuscule","Latin capital letter j with circumflex":"J accent circonflexe majuscule","Latin capital letter k with cedilla":"K cédille majuscule","Latin capital letter l with acute":"L accent aigu majuscule","Latin capital letter l with caron":"L caron majuscule","Latin capital letter l with cedilla":"L cédille majuscule","Latin capital letter l with middle dot":"L point médian majuscule","Latin capital letter l with stroke":"L barré majuscule","Latin capital letter n with acute":"N accent aigu majuscule","Latin capital letter n with caron":"N caron majuscule","Latin capital letter n with cedilla":"N cédille majuscule","Latin capital letter o with breve":"O bref majuscule","Latin capital letter o with double acute":"O double accent aigu majuscule","Latin capital letter o with macron":"O macron majuscule","Latin capital letter r with acute":"R accent aigu majuscule","Latin capital letter r with caron":"R caron majuscule","Latin capital letter r with cedilla":"R cédille majuscule","Latin capital letter s with acute":"S accent aigu majuscule","Latin capital letter s with caron":"S caron majuscule","Latin capital letter s with cedilla":"S cédille majuscule","Latin capital letter s with circumflex":"S circonflexe majuscule","Latin capital letter t with caron":"T caron majuscule","Latin capital letter t with cedilla":"T cédille majuscule","Latin capital letter t with stroke":"T barré majuscule","Latin capital letter u with breve":"U bref majuscule","Latin capital letter u with double acute":"U double accent aigu majuscule","Latin capital letter u with macron":"U macron majuscule","Latin capital letter u with ogonek":"U ogonek majuscule","Latin capital letter u with ring above":"U rond en chef majuscule","Latin capital letter u with tilde":"U tilde majuscule","Latin capital letter w with circumflex":"W circonflexe majuscule","Latin capital letter y with circumflex":"Y circonflexe majuscule","Latin capital letter y with diaeresis":"Y tréma majuscule","Latin capital letter z with acute":"Z accent circonflexe majuscule","Latin capital letter z with caron":"Z caron majuscule","Latin capital letter z with dot above":"Z point suscrit majuscule","Latin capital ligature ij":"Digramme soudé IJ majuscule","Latin capital ligature oe":"O-E entrelacé majuscule","Latin small letter a with breve":"A bref minuscule","Latin small letter a with macron":"A barre minuscule","Latin small letter a with ogonek":"A ogonek minuscule","Latin small letter c with acute":"C accent aigu minuscule","Latin small letter c with caron":"C caron minuscule","Latin small letter c with circumflex":"C circonflexe minuscule","Latin small letter c with dot above":"C point suscrit minuscule","Latin small letter d with caron":"C caron minuscule","Latin small letter d with stroke":"D barré minuscule","Latin small letter dotless i":"I sans point minuscule","Latin small letter e with breve":"E bref minuscule","Latin small letter e with caron":"E caron minuscule","Latin small letter e with dot above":"E point suscrit minuscule","Latin small letter e with macron":"E macron minuscule","Latin small letter e with ogonek":"E ogonek minuscule","Latin small letter eng":"Eng minuscule","Latin small letter f with hook":"Fonction","Latin small letter g with breve":"G bref minuscule","Latin small letter g with cedilla":"G cédille minuscule","Latin small letter g with circumflex":"G accent circonflexe minuscule","Latin small letter g with dot above":"G point suscrit minuscule","Latin small letter h with circumflex":"H accent circonflexe minuscule","Latin small letter h with stroke":"H barré minuscule","Latin small letter i with breve":"I bref minuscule","Latin small letter i with macron":"I macron minuscule","Latin small letter i with ogonek":"I ogonek minuscule","Latin small letter i with tilde":"I tilde minuscule","Latin small letter j with circumflex":"J accent circonflexe minuscule","Latin small letter k with cedilla":"K cédille minuscule","Latin small letter kra":"Kra minuscule","Latin small letter l with acute":"L accent aigu minuscule","Latin small letter l with caron":"L caron minuscule","Latin small letter l with cedilla":"L cédille minuscule","Latin small letter l with middle dot":"L point médian minuscule","Latin small letter l with stroke":"L barré minuscule","Latin small letter long s":"S long minuscule","Latin small letter n preceded by apostrophe":"Apostrophe N minuscule","Latin small letter n with acute":"N accent aigu minuscule","Latin small letter n with caron":"N caron minuscule","Latin small letter n with cedilla":"N cédille minuscule","Latin small letter o with breve":"O bref minuscule","Latin small letter o with double acute":"O double accent aigu minuscule","Latin small letter o with macron":"O macron minuscule","Latin small letter r with acute":"R accent aigu minuscule","Latin small letter r with caron":"R caron minuscule","Latin small letter r with cedilla":"R cédille minuscule","Latin small letter s with acute":"S accent aigu minuscule","Latin small letter s with caron":"S caron minuscule","Latin small letter s with cedilla":"S cédille minuscule","Latin small letter s with circumflex":"S circonflexe minuscule","Latin small letter t with caron":"T caron minuscule","Latin small letter t with cedilla":"T cédille minuscule","Latin small letter t with stroke":"T barré minuscule","Latin small letter u with breve":"U bref minuscule","Latin small letter u with double acute":"U double accent aigu minuscule","Latin small letter u with macron":"U macron minuscule","Latin small letter u with ogonek":"U ogonek minuscule","Latin small letter u with ring above":"U rond en chef minuscule","Latin small letter u with tilde":"U tilde minuscule","Latin small letter w with circumflex":"W circonflexe minuscule","Latin small letter y with circumflex":"Y circonflexe minuscule","Latin small letter z with acute":"Z accent circonflexe minuscule","Latin small letter z with caron":"Z caron minuscule","Latin small letter z with dot above":"Z point suscrit minuscule","Latin small ligature ij":"Digramme soudé IJ minuscule","Latin small ligature oe":"O-E entrelacé minuscule","Left double quotation mark":"Guillemet-apostrophe double culbuté","Left single quotation mark":"Guillemet-apostrophe culbuté","Left-pointing double angle quotation mark":"Guillemet double vers la gauche","leftwards arrow to bar":"Flèche vers la gauche avec barre de fin","leftwards dashed arrow":"Flèche en pointillés vers la gauche","leftwards double arrow":"Double flèche vers la gauche","Less-than or equal to":"Signe inférieur ou égal","Less-than sign":"Signe inférieur","Lira sign":"Lire","Livre tournois sign":"Livre tournois","Logical and":"Et logique","Logical or":"Ou logique",Macron:"Macron","Manat sign":"Manat","Mill sign":"Moulin","Minus sign":"Moins","Multiplication sign":"Multiplication","N-ary product":"Produit","N-ary summation":"Somme",Nabla:"Nabla","Naira sign":"Naira","New sheqel sign":"Shekel","Nordic mark sign":"Mark nordique","Not an element of":"N'appartient pas à","Not equal to":"Différent de","Not sign":"Négation logique","on with exclamation mark with left right arrow above":"Allumé avec flèches vers la gauche et la droite",Overline:"Macron long","Paragraph sign":"Fin de paragraphe","Partial differential":"Partiellement différent","Per mille sign":"Pour mille","Per ten thousand sign":"Pour dix milles","Peseta sign":"Peseta","Peso sign":"Peso","Plus-minus sign":"Plus ou moins","Pound sign":"Livre sterling","Proportional to":"Proportionnel à","Question exclamation mark":"Point d'interrogation et exclamation","Registered sign":"Registered","Reversed paragraph sign":"Fin de paragraphe inversé","Right double quotation mark":"Guillemet-apostrophe double","Right single quotation mark":"Guillemet-apostrophe","Right-pointing double angle quotation mark":"Guillemet double vers la droite","rightwards arrow to bar":"Flèche vers la droite avec barre de fin","rightwards dashed arrow":"Flèche en pointillés vers la droite","rightwards double arrow":"Double flèche vers la droite","Ruble sign":"Rouble","Rupee sign":"Roupie","Section sign":"Paragraphe","Single left-pointing angle quotation mark":"Guillemet simple vers la gauche","Single low-9 quotation mark":"Guillemet-virgule inférieur","Single right-pointing angle quotation mark":"Guillemet simple vers la droite","soon with rightwards arrow above":"Bientôt avec flèche vers la droite","Special characters":"Caractères spéciaux","Spesmilo sign":"Spesmilo","Square root":"Racine carrée","Tenge sign":"Tenge","There exists":"Existe","Tilde operator":"Tilde","top with upwards arrow above":"Haut avec flèche vers le haut","Trade mark sign":"Marque déposée","Tugrik sign":"Tugrik","Turkish lira sign":"Lire turque","Two dot leader":"Deux points",Union:"Union","up down arrow with base":"Flèche haut et bas avec barre de fin","upwards arrow to bar":"Flèche vers le haut avec barre de fin","upwards dashed arrow":"Flèche en pointillés vers le haut","upwards double arrow":"Double flèche vers le haut","Vulgar fraction one half":"Un demi","Vulgar fraction one quarter":"Un quart","Vulgar fraction three quarters":"Trois quarts","Won sign":"Won","Yen sign":"Yen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.fr=e.fr||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 sur %1",Aquamarine:"Bleu vert",Black:"Noir",Blue:"Bleu",Cancel:"Annuler","Dim grey":"Gris pâle","Dropdown toolbar":"Barre d'outils dans un menu déroulant","Edit block":"Modifier le bloc","Editor toolbar":"Barre d'outils de l'éditeur",Green:"Vert",Grey:"Gris","Insert paragraph after block":"Insérer du texte après ce bloc","Insert paragraph before block":"Insérer du texte avant ce bloc","Light blue":"Bleu clair","Light green":"Vert clair","Light grey":"Gris clair",Next:"Suivant",Orange:"Orange",Previous:"Précedent",Purple:"Violet",Red:"Rouge",Redo:"Restaurer","Remove color":"Enlever la couleur","Restore default":"","Rich Text Editor":"Éditeur de texte enrichi","Rich Text Editor, %0":"Éditeur de texte enrichi, %0",Save:"Enregistrer","Select all":"Sélectionner tout","Show more items":"Montrer plus d'éléments",Turquoise:"Turquoise",Undo:"Annuler","Upload in progress":"Téléchargement en cours",White:"Blanc","Widget toolbar":"Barre d'outils du widget",Yellow:"Jaune"}),r.getPluralForm=function(e){return e>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/gl.js b/core/assets/vendor/ckeditor5/translations/gl.js
new file mode 100644
index 0000000000000000000000000000000000000000..68c616804b602dfd8fb6b3700dd455b3b046a646
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/gl.js
@@ -0,0 +1 @@
+!function(t){const e=t.gl=t.gl||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Centrar horizontalmente","Align left":"Aliñar á esquerda","Align right":"Aliñar á dereita",Justify:"Xustificado","Text alignment":"Aliñamento do texto","Text alignment toolbar":"Barra de ferramentas de aliñamento de textos"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const c=i.gl=i.gl||{};c.dictionary=Object.assign(c.dictionary||{},{Bold:"Negra",Code:"Código",Italic:"Itálica",Strikethrough:"Riscado",Subscript:"Subíndice",Superscript:"Superíndice",Underline:"Subliñado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.gl=i.gl||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Cita de bloque"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const t=o.gl=o.gl||{};t.dictionary=Object.assign(t.dictionary||{},{"Choose heading":"Escolla o título",Heading:"Título","Heading 1":"Título 1","Heading 2":"Título 2","Heading 3":"Título 3","Heading 4":"Título 4","Heading 5":"Título 5","Heading 6":"Título 6",Paragraph:"Parágrafo","Type or paste your content here.":"Escriba ou pegue o seu contido aquí.","Type your title":"Escriba o seu título"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.gl=i.gl||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Liña horizontal"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.gl=a.gl||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"Romper o texto","Centered image":"Imaxe centrada horizontalmente","Change image text alternative":"Cambiar o texto alternativo da imaxe","Enter image caption":"Introduza o título da imaxe","Full size image":"Imaxe a tamaño completo","Image resize list":"Lista de tamaños de imaxe","Image toolbar":"Barra de ferramentas de imaxe","image widget":"Trebello de imaxe","In line":"En liña",Insert:"Inserir","Insert image":"Inserir imaxe","Insert image via URL":"Inserir imaxe a través de URL","Left aligned image":"Imaxe aliñada á esquerda",Original:"Orixinal","Resize image":"Redimensionar a imaxe","Resize image to %0":"Redimensionar a imaxe ao %0","Resize image to the original size":"Aplicar o tamaño orixinal da imaxe","Right aligned image":"Imaxe aliñada á dereita","Side image":"Lado da imaxe","Text alternative":"Texto alternativo",Update:"Actualizar","Update image URL":"Actualizar o URL da imaxe","Upload failed":"Fallou o envío","Wrap text":"Envolver o texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.gl=n.gl||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Reducir sangrado","Increase indent":"Aumentar sangrado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const a=o.gl=o.gl||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Escolla o idioma",Language:"Idioma","Remove language":"Retirar o idioma"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.gl=n.gl||{};a.dictionary=Object.assign(a.dictionary||{},{Downloadable:"Descargábel","Edit link":"Editar a ligazón",Link:"Ligar","Link image":"Ligazón da imaxe","Link URL":"URL de ligazón","Open in a new tab":"Abrir nunha nova lapela","Open link in new tab":"Abrir a ligazón nunha nova lapela","This link has no URL":"Esta ligazón non ten URL",Unlink:"Desligar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.gl=e.gl||{};a.dictionary=Object.assign(a.dictionary||{},{"Bulleted List":"Lista con viñetas","Bulleted list styles toolbar":"Barra de ferramentas de estilos de lista con viñetas",Circle:"Círculos",Decimal:"Decimais","Decimal with leading zero":"Decimais con cero á esquerda",Disc:"Discos","Lower-latin":"Letras minúsculas","Lower–roman":"Núm, romanos en minúscula","Numbered List":"Lista numerada","Numbered list styles toolbar":"Barra de ferramentas de estilos de lista numerada",Square:"Cadrados","To-do List":"Lista de cousas por facer","Toggle the circle list style":"Alternar o estilo da lista «círculos»","Toggle the decimal list style":"Alternar o estilo da lista «decimais»","Toggle the decimal with leading zero list style":"Activar/desactivar o estilo «decimais con cero á esquerda»","Toggle the disc list style":"Alternar o estilo da lista «discos»","Toggle the lower–latin list style":"Activar/desactivar o estilo da lista «letras minúsculas»","Toggle the lower–roman list style":"Activar/desactivar o estilo da lista «núm. romanos en minúscula»","Toggle the square list style":"Alternar o estilo da lista «cadrados»","Toggle the upper–latin list style":"Activar/desactivar o estilo da lista «letras maiúsculas»","Toggle the upper–roman list style":"Activar/desactivar o estilo da lista «núm. romanos en maiúscula»","Upper-latin":"Letras maiúsculas","Upper-roman":"Núm, romanos en maiúscula"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.gl=o.gl||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"Retirar o formato"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.gl=i.gl||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"Orixe"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.gl=e.gl||{};a.dictionary=Object.assign(a.dictionary||{},{"Align cell text to the bottom":"Aliñar o texto da cela á base","Align cell text to the center":"Aliñar o texto da cela ao centro","Align cell text to the left":"Aliñar o texto da cela á esquerda","Align cell text to the middle":"Aliñar o texto da cela ao medio","Align cell text to the right":"Aliña o texto da cela á dereita","Align cell text to the top":"Aliñar o texto da cela á parte superior","Align table to the left":"Aliñar a táboa á esquerda","Align table to the right":"Aliñar a táboa á dereita",Alignment:"Aliñamento",Background:"Fondo",Border:"Bordo","Cell properties":"Propiedades da cela","Center table":"Centrar a táboa",Color:"Cor","Color picker":"Selector de cores",Column:"Columna",Dashed:"Raiado","Delete column":"Eliminar columna","Delete row":"Eliminar fila",Dimensions:"Dimensións",Dotted:"Punteado",Double:"Dobre","Enter table caption":"Introduza o título da táboa",Groove:"Rañura","Header column":"Cabeceira de columna","Header row":"Cabeceira de fila",Height:"Alto","Horizontal text alignment toolbar":"Barra de ferramentas de aliñamento de texto horizontal","Insert column left":"Inserir columna á esquerda","Insert column right":"Inserir columna á dereita","Insert row above":"Inserir fila enriba","Insert row below":"Inserir fila embaixo","Insert table":"Inserir táboa",Inset:"Inserción","Justify cell text":"Xustificar o texto da cela","Merge cell down":"Combinar cela cara  abaixo","Merge cell left":"Combinar cela cara a esquerda","Merge cell right":"Combinar cela cara a dereita","Merge cell up":"Combinar cela cara arriba","Merge cells":"Combinar celas",None:"Ningún",Outset:"Inicio",Padding:"Recheo",Ridge:"Crista",Row:"Fila","Select column":"Seleccionar columna","Select row":"Seleccionar fila",Solid:"Sólido","Split cell horizontally":"Dividir cela en horizontal","Split cell vertically":"Dividir cela en vertical",Style:"Estilo","Table alignment toolbar":"Barra de ferramentas de aliñamento da táboa","Table cell text alignment":"Aliñamento do texto das celas da táboa","Table properties":"Propiedades da táboa","Table toolbar":"Barra de ferramentas de táboas",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"A cor non é válida. Probe «#FF0000» ou «rgb(255,0,0)» ou «vermello».",'The value is invalid. Try "10px" or "2em" or simply "2".':"O valor non é válido. Probe «10px» ou «2em» ou simplemente «2».","Toggle caption off":"Desactivar os subtítulos","Toggle caption on":"Activar os subtítulos","Vertical text alignment toolbar":"Barra de ferramentas de aliñamento de texto vertical",Width:"Largo"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.gl=i.gl||{};n.dictionary=Object.assign(n.dictionary||{},{"HTML object":"Obxecto HTML"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const o=a.gl=a.gl||{};o.dictionary=Object.assign(o.dictionary||{},{"Almost equal to":"Case igual a",Angle:"Ángulo","Approximately equal to":"Aproximadamente igual a","Asterisk operator":"Operador asterisco","Austral sign":"Símbolo do austral","back with leftwards arrow above":"cara atrás, coa frecha cara á esquerda enriba","Bitcoin sign":"Símbolo do Bitcoin","Cedi sign":"Símbolo do cedi","Cent sign":"Símbolo do centavo","Character categories":"Categorías de caracteres","Colon sign":"Símbolo do colón","Contains as member":"Conten a","Copyright sign":"Símbolo de copyright","Cruzeiro sign":"Símbolo do cruceiro","Currency sign":"Símbolo de moeda","Degree sign":"Signo de grao","Division sign":"Signo de división","Dollar sign":"Símbolo do dolar","Dong sign":"Símbolo do dong","Double dagger":"Daga dobre","Double exclamation mark":"Marca de dobre exclamación","Double low-9 quotation mark":"Marca de acoutamento comiña dobre baixo-9","Double question mark":"Marca de dobre interrogación","downwards arrow to bar":"frecha cara abaixo con tope","downwards dashed arrow":"frecha de guións cara abaixo","downwards double arrow":"frecha dobre cara abaixo","Drachma sign":"Símbolo do dracma","Element of":"Pertenza","Em dash":"Guión longo (raia)","Empty set":"Conxunto baleiro","En dash":"Guión curto","end with leftwards arrow above":"final, coa frecha cara á esquerda enriba","Euro sign":"Símbolo do euro","Euro-currency sign":"Símbolo da moeda do euro","Exclamation question mark":"Marca de exclamación interrogación","For all":"Para todo","Fraction slash":"Barra de fracción","French franc sign":"Símbolo do franco francés","German penny sign":"Símbolo do penique alemán","Greater-than or equal to":"Maior ou igual que","Greater-than sign":"Maior que","Guarani sign":"Símbolo do guaraní","Horizontal ellipsis":"Elipse horizontal","Hryvnia sign":"Símbolo do hryvnia","Identical to":"Idéntico a","Indian rupee sign":"Símbolo da rupia india",Infinity:"Infinito",Integral:"Integral",Intersection:"Intersección","Inverted exclamation mark":"Marca invertida de exclamación","Inverted question mark":"Marca invertida de interrogación","Kip sign":"Símbolo do kip","Latin capital letter a with breve":"A maiúsculo latino con acento breve","Latin capital letter a with macron":"A maiúsculo latino con macron","Latin capital letter a with ogonek":"A maiúsculo latino con ogonek","Latin capital letter c with acute":"C maiúsculo latino con acento agudo","Latin capital letter c with caron":"C maiúsculo latino con caron","Latin capital letter c with circumflex":"C maiúsculo latino con acento circunflexo","Latin capital letter c with dot above":"C maiúsculo latino con punto enriba","Latin capital letter d with caron":"D maiúsculo latino con caron","Latin capital letter d with stroke":"D maiúsculo latino barrado","Latin capital letter e with breve":"E maiúsculo latino con acento breve","Latin capital letter e with caron":"E maiúsculo latino con caron","Latin capital letter e with dot above":"E maiúsculo latino con punto enriba","Latin capital letter e with macron":"E maiúsculo latino con macron","Latin capital letter e with ogonek":"E maiúsculo latino con ogonek","Latin capital letter eng":"Eng (engma) mziúsculo latino","Latin capital letter g with breve":"G maiúsculo latino con acento breve","Latin capital letter g with cedilla":"G maiúsculo latino con cedilla","Latin capital letter g with circumflex":"G maiúsculo latino con acento circunflexo","Latin capital letter g with dot above":"G maiúsculo latino con punto enriba","Latin capital letter h with circumflex":"H maiúsculo latino con acento circunflexo","Latin capital letter h with stroke":"H maiúsculo latino barrado","Latin capital letter i with breve":"I maiúsculo latino con acento breve","Latin capital letter i with dot above":"I maiúsculo latino con punto enriba","Latin capital letter i with macron":"I maiúsculo latino con macron","Latin capital letter i with ogonek":"I maiúsculo latino con ogonek","Latin capital letter i with tilde":"I maiúsculo latino con til","Latin capital letter j with circumflex":"J maiúsculo latino con acento circunflexo","Latin capital letter k with cedilla":"K maiúsculo latino con cedilla","Latin capital letter l with acute":"L maiúsculo latino con acento agudo","Latin capital letter l with caron":"L maiúsculo latino con caron","Latin capital letter l with cedilla":"L maiúsculo latino con cedilla","Latin capital letter l with middle dot":"L maiúsculo latino con punto medio","Latin capital letter l with stroke":"L maiúsculo latino barrado","Latin capital letter n with acute":"N maiúsculo latino con acento agudo","Latin capital letter n with caron":"N maiúsculo latino con caron","Latin capital letter n with cedilla":"N maiúsculo latino con cedilla","Latin capital letter o with breve":"O maiúsculo latino con acento breve","Latin capital letter o with double acute":"O maiúsculo latino con acento agudo dobre","Latin capital letter o with macron":"O maiúsculo latino con macron","Latin capital letter r with acute":"R maiúsculo latino con acento agudo","Latin capital letter r with caron":"R maiúsculo latino con caron","Latin capital letter r with cedilla":"R maiúsculo latino con cedilla","Latin capital letter s with acute":"S maiúsculo latino con acento agudo","Latin capital letter s with caron":"S maiúsculo latino con caron","Latin capital letter s with cedilla":"S maiúsculo latino con cedilla","Latin capital letter s with circumflex":"S maiúsculo latino con acento circunflexo","Latin capital letter t with caron":"T maiúsculo latino con caron","Latin capital letter t with cedilla":"T maiúsculo latino con cedilla","Latin capital letter t with stroke":"T maiúsculo latino barrado","Latin capital letter u with breve":"U maiúsculo latino con acento breve","Latin capital letter u with double acute":"U maiúsculo latino con acento agudo dobre","Latin capital letter u with macron":"U maiúsculo latino con macron","Latin capital letter u with ogonek":"U maiúsculo latino con ogonek","Latin capital letter u with ring above":"U maiúsculo latino con anel enriba","Latin capital letter u with tilde":"U maiúsculo latino con til","Latin capital letter w with circumflex":"W maiúsculo latino con acento circunflexo","Latin capital letter y with circumflex":"Y maiúsculo latino con acento circunflexo","Latin capital letter y with diaeresis":"Y maiúsculo latino con diérese","Latin capital letter z with acute":"Z maiúsculo latino con acento agudo","Latin capital letter z with caron":"Z maiúsculo latino con caron","Latin capital letter z with dot above":"Z maiúsculo latino con punto enriba","Latin capital ligature ij":"Ligadura IJ maiúsculo latino","Latin capital ligature oe":"Ligadura OE maiúsculo latino","Latin small letter a with breve":"a minúsculo latino con acento breve","Latin small letter a with macron":"a minúsculo latino con macron","Latin small letter a with ogonek":"a minúsculo latino con ogonek","Latin small letter c with acute":"c minúsculo latino con acento agudo","Latin small letter c with caron":"cminúsculo latino con caron","Latin small letter c with circumflex":"c minúsculo latino con acento circunflexo","Latin small letter c with dot above":"c minúsculo latino con punto enriba","Latin small letter d with caron":"d minúsculo latino con caron","Latin small letter d with stroke":"d minúsculo latino barrado","Latin small letter dotless i":"i minúsculo latino sen punto","Latin small letter e with breve":"e minúsculo latino con acento breve","Latin small letter e with caron":"e minúsculo latino con caron","Latin small letter e with dot above":"e  minúsculo latino con punto enriba","Latin small letter e with macron":"e minúsculo latino con macron","Latin small letter e with ogonek":"e minúsculo latino con ogonek","Latin small letter eng":"Eng (engma) minúsculo latino","Latin small letter f with hook":"f minúsculo latino con gancho","Latin small letter g with breve":"g minúsculo latino con acento breve","Latin small letter g with cedilla":"g minúsculo latino con cedilla","Latin small letter g with circumflex":"g minúsculo latino con acento circunflexo","Latin small letter g with dot above":"g minúsculo latino con punto enriba","Latin small letter h with circumflex":"h minúsculo latino con acento circunflexo","Latin small letter h with stroke":"h minúsculo latino barrado","Latin small letter i with breve":"i minúsculo latino con acento breve","Latin small letter i with macron":"i minúsculo latino con macron","Latin small letter i with ogonek":"i minúsculo latino con ogonek","Latin small letter i with tilde":"i minúsculo latino con til","Latin small letter j with circumflex":"j minúsculo latino con acento circunflexo","Latin small letter k with cedilla":"k minúsculo latino con cedilla","Latin small letter kra":"Letra kra minúscula","Latin small letter l with acute":"l minúsculo latino con acento agudo","Latin small letter l with caron":"l minúsculo latino con caron","Latin small letter l with cedilla":"l minúsculo latino con cedilla","Latin small letter l with middle dot":"l minúsculo latino con punto medio","Latin small letter l with stroke":"l minúsculo latino barrado","Latin small letter long s":"s minúsculo latino larga","Latin small letter n preceded by apostrophe":"n minúsculo latino precedido de apostrofe","Latin small letter n with acute":"n minúsculo latino con acento agudo","Latin small letter n with caron":"n minúsculo latino con caron","Latin small letter n with cedilla":"n minúsculo latino con cedilla","Latin small letter o with breve":"o minúsculo latino con acento breve","Latin small letter o with double acute":"o minúsculo latino con acento agudo dobre","Latin small letter o with macron":"o minúsculo latino con macron","Latin small letter r with acute":"r minúsculo latino con acento agudo","Latin small letter r with caron":"r minúsculo latino con caron","Latin small letter r with cedilla":"r minúsculo latino con cedilla","Latin small letter s with acute":"s minúsculo latino con acento agudo","Latin small letter s with caron":"s minúsculo latino con caron","Latin small letter s with cedilla":"s minúsculo latino con cedilla","Latin small letter s with circumflex":"s minúsculo latino con acento circunflexo","Latin small letter t with caron":"t minúsculo latino con caron","Latin small letter t with cedilla":"t minúsculo latino con cedilla","Latin small letter t with stroke":"t minúsculo latino barrado","Latin small letter u with breve":"u minúsculo latino con acento breve","Latin small letter u with double acute":"u minúsculo latino con acento agudo dobre","Latin small letter u with macron":"u minúsculo latino con macron","Latin small letter u with ogonek":"u minúsculo latino con ogonek","Latin small letter u with ring above":"u minúsculo latino con anel enriba","Latin small letter u with tilde":"u minúsculo latino con til","Latin small letter w with circumflex":"w minúsculo latino con acento circunflexo","Latin small letter y with circumflex":"y minúsculo latino con acento circunflexo","Latin small letter z with acute":"z minúsculo latino con acento agudo","Latin small letter z with caron":"z minúsculo latino con caron","Latin small letter z with dot above":"z minúsculo latino con punto enriba","Latin small ligature ij":"Ligadura ij minúsculo latino","Latin small ligature oe":"Ligadura oe minúsculo latino","Left double quotation mark":"Marca de acoutamento comiña dobre esquerda","Left single quotation mark":"Marca de acoutamento comiña sinxela esquerda","Left-pointing double angle quotation mark":"Marca de acoutamento ángulo esquerdo dobre","leftwards arrow to bar":"frecha cara á esquerda con tope","leftwards dashed arrow":"frecha de guións cara á esquerda","leftwards double arrow":"frecha dobre cara á esquerda","Less-than or equal to":"Menor ou igual que","Less-than sign":"Menor que","Lira sign":"Símbolo da lira","Livre tournois sign":"Símbolo da libra tournois","Logical and":"E lóxico (conxunción)","Logical or":"Ou lóxico (disxunción)",Macron:"Macron","Manat sign":"Símbolo do manat","Mill sign":"Símbolo do mill","Minus sign":"Signo menos","Multiplication sign":"Signo de multiplicación","N-ary product":"Produto de n elementos, produtorio","N-ary summation":"Suma de n elementos, sumatorio",Nabla:"Nabla (Gradiente)","Naira sign":"Símbolo da naira","New sheqel sign":"Símbolo do novo xequel","Nordic mark sign":"Símbolo do marco nordico","Not an element of":"Non pertenza","Not equal to":"Distinto de","Not sign":"Signo non","on with exclamation mark with left right arrow above":"activado, con signo de exclamación coa frecha esquerda-dereita enrriba",Overline:"Liña superior","Paragraph sign":"Signo de parágrafo","Partial differential":"Derivada parcial","Per mille sign":"Signo de por milleiro","Per ten thousand sign":"Signo de por dez mil","Peseta sign":"Símbolo da peseta","Peso sign":"Símbolo do peso","Plus-minus sign":"Signo más/menos","Pound sign":"Símbolo da libra","Proportional to":"Proporcional a","Question exclamation mark":"Marca de interrogación exclamación","Registered sign":"Símbolo de rexistrado","Reversed paragraph sign":"Signo invertido do parágrafo","Right double quotation mark":"Marca de acoutamento comiña dobre dereita","Right single quotation mark":"Marca de acoutamento comiña sinxela dereita","Right-pointing double angle quotation mark":"Marca de acoutamento ángulo dereito dobre","rightwards arrow to bar":"frecha cara á dereita con tope","rightwards dashed arrow":"frecha de guións cara á dereita","rightwards double arrow":"frecha dobre cara á dereita","Ruble sign":"Símbolo do rublo","Rupee sign":"Símbolo da rupia","Section sign":"Signo de sección","Single left-pointing angle quotation mark":"Marca de acoutamento ángulo esquerdo sinxelo","Single low-9 quotation mark":"Marca de acoutamento comiña sinxela baixo-9","Single right-pointing angle quotation mark":"Marca de acoutamento ángulo dereito sinxelo","soon with rightwards arrow above":"logo, coa frecha cara á dereita enriba","Special characters":"Caracteres especiais","Spesmilo sign":"Símbolo do spesmilo","Square root":"Raíz cadrada","Tenge sign":"Símbolo do tenge","There exists":"Existe","Tilde operator":"Operador til","top with upwards arrow above":"superior, coa frecha cara arriba enriba","Trade mark sign":"Símbolo de marca de fábrica","Tugrik sign":"Símbolo do tugrik","Turkish lira sign":"Símbolo da lira turca","Two dot leader":"Líder de dous puntos",Union:"Unión","up down arrow with base":"frecha arriba-abaixo con base","upwards arrow to bar":"frecha cara arriba con tope","upwards dashed arrow":"frecha de guións cara arriba","upwards double arrow":"frecha dobre cara arriba","Vulgar fraction one half":"Fracción común dun medio","Vulgar fraction one quarter":"Fracción común dun cuarto","Vulgar fraction three quarters":"Fracción común de tres cuartos","Won sign":"Símbolo do won","Yen sign":"Símbolo do yen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.gl=e.gl||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 de %1",Aquamarine:"Augamariña",Black:"Negro",Blue:"Azul",Cancel:"Cancelar","Dim grey":"Gris fume","Dropdown toolbar":"Barra de ferramentas despregábel","Edit block":"Editar bloque","Editor toolbar":"Barra de ferramentas do editor",Green:"Verde",Grey:"Gris","Insert paragraph after block":"Inserir parágrafo após o bloque","Insert paragraph before block":"Inserir parágrafo antes do bloque","Light blue":"Azul claro","Light green":"Verde claro","Light grey":"Gris claro",Next:"Seguinte",Orange:"Laranxa",Previous:"Anterior",Purple:"Púrpura",Red:"Vermello",Redo:"Refacer","Remove color":"Retirar a cor","Restore default":"Restaurar valores predeterminados","Rich Text Editor":"Editor de texto mellorado","Rich Text Editor, %0":"Editor de texto mellorado, %0",Save:"Gardar","Select all":"Seleccionar todo","Show more items":"Amosar máis elementos",Turquoise:"Turquesa",Undo:"Desfacer","Upload in progress":"Envío en proceso",White:"Branco","Widget toolbar":"Barra de ferramentas de trebellos",Yellow:"Amarelo"}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/gu.js b/core/assets/vendor/ckeditor5/translations/gu.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d023aa8243657d61aa436cf03d7e802cc08345d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/gu.js
@@ -0,0 +1 @@
+!function(i){const n=i.gu=i.gu||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"ઘાટુ - બોલ્ડ્",Code:"",Italic:"ત્રાંસુ - ઇટલિક્",Strikethrough:"",Subscript:"",Superscript:"",Underline:"નીચે લિટી - અન્ડરલાઇન્"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.gu=i.gu||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":" વિચાર ટાંકો"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/he.js b/core/assets/vendor/ckeditor5/translations/he.js
new file mode 100644
index 0000000000000000000000000000000000000000..7fc0e372e7be1fa78bbf2eeaa5d59218d775a690
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/he.js
@@ -0,0 +1 @@
+!function(n){const i=n.he=n.he||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"יישור באמצע","Align left":"יישור לשמאל","Align right":"יישור לימין",Justify:"מרכוז גבולות","Text alignment":"יישור טקסט","Text alignment toolbar":"סרגל כלים יישור טקסט"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.he=i.he||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"מודגש",Code:"קוד",Italic:"נטוי",Strikethrough:"קו חוצה",Subscript:"כתב תחתי",Superscript:"כתב עילי",Underline:"קו תחתון"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.he=i.he||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"בלוק ציטוט"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e.he=e.he||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"בחר סוג כותרת",Heading:"כותרת","Heading 1":"כותרת 1","Heading 2":"כותרת 2","Heading 3":"כותרת 3","Heading 4":"כותרת 4","Heading 5":"כותרת 5","Heading 6":"כותרת 6",Paragraph:"פיסקה","Type or paste your content here.":"הזן או הדבק את התוכן כאן","Type your title":"הזן כותרת"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.he=i.he||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"קו אופקי"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.he=e.he||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"תמונה ממרוכזת","Change image text alternative":"שינוי טקסט אלטרנטיבי לתמונה","Enter image caption":"הזן כותרת תמונה","Full size image":"תמונה בפריסה מלאה","Image resize list":"","Image toolbar":"סרגל תמונה","image widget":"תמונה","In line":"",Insert:"","Insert image":"הוספת תמונה","Insert image via URL":"","Left aligned image":"תמונה מיושרת לשמאל",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"תמונה מיושרת לימין","Side image":"תמונת צד","Text alternative":"טקסט אלטרנטיבי",Update:"","Update image URL":"","Upload failed":"העלאה נכשלה","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.he=n.he||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"עריכת קישור",Link:"קישור","Link image":"","Link URL":"קישור כתובת אתר","Open in a new tab":"","Open link in new tab":"פתח קישור בכרטיסייה חדשה","This link has no URL":"לקישור זה אין כתובת אתר",Unlink:"ביטול קישור"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.he=e.he||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"רשימה מנוקדת","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"רשימה ממוספרת","Numbered list styles toolbar":"",Square:"","To-do List":"רשימת מטלות","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.he=e.he||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"0% מתוך %1",Aquamarine:"",Black:"",Blue:"",Cancel:"ביטול","Dim grey":"","Dropdown toolbar":"סרגל כלים נפתח","Edit block":"הגדרות בלוק","Editor toolbar":"סרגל הכלים",Green:"",Grey:"","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"","Light green":"","Light grey":"",Next:"הבא",Orange:"",Previous:"הקודם",Purple:"",Red:"",Redo:"ביצוע מחדש","Remove color":"","Restore default":"","Rich Text Editor":"עורך טקסט עשיר","Rich Text Editor, %0":"עורך טקסט עשיר, %0",Save:"שמירה","Show more items":"הצד פריטים נוספים",Turquoise:"",Undo:"ביטול","Upload in progress":"העלאה מתבצעת",White:"","Widget toolbar":"סרגל יישומון",Yellow:""}),o.getPluralForm=function(e){return 1==e&&e%1==0?0:2==e&&e%1==0?1:e%10==0&&e%1==0&&e>10?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/hi.js b/core/assets/vendor/ckeditor5/translations/hi.js
new file mode 100644
index 0000000000000000000000000000000000000000..9974a59f6dc0598e24e2283fa680e0541c5d5ec2
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/hi.js
@@ -0,0 +1 @@
+!function(i){const n=i.hi=i.hi||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Align center","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":"Text alignment toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.hi=i.hi||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Bold",Code:"Code",Italic:"Italic",Strikethrough:"Strikethrough",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.hi=i.hi||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.hi=e.hi||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Choose heading",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Paragraph:"Paragraph","Type or paste your content here.":"Type or paste your content here.","Type your title":"Type your title"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.hi=i.hi||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Horizontal line"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.hi=e.hi||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Enter image caption":"Enter image caption","Full size image":"Full size image","Image resize list":"Image resize list","Image toolbar":"Image toolbar","image widget":"image widget","In line":"",Insert:"Insert","Insert image":"Insert image","Insert image via URL":"Insert image via URL","Left aligned image":"Left aligned image",Original:"Original","Resize image":"Resize image","Resize image to %0":"Resize image to %0","Resize image to the original size":"Resize image to the original size","Right aligned image":"Right aligned image","Side image":"Side image","Text alternative":"Text alternative",Update:"Update","Update image URL":"Update image URL","Upload failed":"Upload failed","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.hi=n.hi||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Decrease indent","Increase indent":"Increase indent"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.hi=n.hi||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Downloadable","Edit link":"Edit link",Link:"Link","Link image":"Link image","Link URL":"Link URL","Open in a new tab":"Open in a new tab","Open link in new tab":"Open link in new tab","This link has no URL":"This link has no URL",Unlink:"Unlink"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.hi=e.hi||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Circle:"Circle",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero",Disc:"Disc","Lower-latin":"Lower-latin","Lower–roman":"Lower–roman","Numbered List":"Numbered List","Numbered list styles toolbar":"Numbered list styles toolbar",Square:"Square","To-do List":"To-do List","Toggle the circle list style":"Toggle the circle list style","Toggle the decimal list style":"Toggle the decimal list style","Toggle the decimal with leading zero list style":"Toggle the decimal with leading zero list style","Toggle the disc list style":"Toggle the disc list style","Toggle the lower–latin list style":"Toggle the lower–latin list style","Toggle the lower–roman list style":"Toggle the lower–roman list style","Toggle the square list style":"Toggle the square list style","Toggle the upper–latin list style":"Toggle the upper–latin list style","Toggle the upper–roman list style":"Toggle the upper–roman list style","Upper-latin":"Upper-latin","Upper-roman":"Upper-roman"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.hi=i.hi||{};o.dictionary=Object.assign(o.dictionary||{},{"Remove Format":"Remove Format"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.hi=e.hi||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",Background:"Background",Border:"Border","Cell properties":"Cell properties","Center table":"Center table",Color:"Color","Color picker":"Color picker",Column:"Column",Dashed:"Dashed","Delete column":"Delete column","Delete row":"Delete row",Dimensions:"Dimensions",Dotted:"Dotted",Double:"Double","Enter table caption":"",Groove:"Groove","Header column":"Header column","Header row":"Header row",Height:"Height","Horizontal text alignment toolbar":"Horizontal text alignment toolbar","Insert column left":"Insert column left","Insert column right":"Insert column right","Insert row above":"Insert row above","Insert row below":"Insert row below","Insert table":"Insert table",Inset:"Inset","Justify cell text":"Justify cell text","Merge cell down":"Merge cell down","Merge cell left":"Merge cell left","Merge cell right":"Merge cell right","Merge cell up":"Merge cell up","Merge cells":"Merge cells",None:"None",Outset:"Outset",Padding:"Padding",Ridge:"Ridge",Row:"Row","Select column":"Select column","Select row":"Select row",Solid:"Solid","Split cell horizontally":"Split cell horizontally","Split cell vertically":"Split cell vertically",Style:"Style","Table alignment toolbar":"Table alignment toolbar","Table cell text alignment":"Table cell text alignment","Table properties":"Table properties","Table toolbar":"Table toolbar",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'The value is invalid. Try "10px" or "2em" or simply "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Vertical text alignment toolbar",Width:"Width"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t.hi=t.hi||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above","Bitcoin sign":"Bitcoin sign","Cedi sign":"Cedi sign","Cent sign":"Cent sign","Character categories":"Character categories","Colon sign":"Colon sign","Contains as member":"Contains as member","Copyright sign":"Copyright sign","Cruzeiro sign":"Cruzeiro sign","Currency sign":"Currency sign","Degree sign":"Degree sign","Division sign":"Division sign","Dollar sign":"Dollar sign","Dong sign":"Dong sign","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","Drachma sign":"Drachma sign","Element of":"Element of","Em dash":"Em dash","Empty set":"Empty set","En dash":"En dash","end with leftwards arrow above":"end with leftwards arrow above","Euro sign":"Euro sign","Euro-currency sign":"Euro-currency sign","Exclamation question mark":"Exclamation question mark","For all":"For all","Fraction slash":"Fraction slash","French franc sign":"French franc sign","German penny sign":"German penny sign","Greater-than or equal to":"Greater-than or equal to","Greater-than sign":"Greater-than sign","Guarani sign":"Guarani sign","Horizontal ellipsis":"Horizontal ellipsis","Hryvnia sign":"Hryvnia sign","Identical to":"Identical to","Indian rupee sign":"Indian rupee sign",Infinity:"Infinity",Integral:"Integral",Intersection:"Intersection","Inverted exclamation mark":"Inverted exclamation mark","Inverted question mark":"Inverted question mark","Kip sign":"Kip sign","Latin capital letter a with breve":"Latin capital letter a with breve","Latin capital letter a with macron":"Latin capital letter a with macron","Latin capital letter a with ogonek":"Latin capital letter a with ogonek","Latin capital letter c with acute":"Latin capital letter c with acute","Latin capital letter c with caron":"Latin capital letter c with caron","Latin capital letter c with circumflex":"Latin capital letter c with circumflex","Latin capital letter c with dot above":"Latin capital letter c with dot above","Latin capital letter d with caron":"Latin capital letter d with caron","Latin capital letter d with stroke":"Latin capital letter d with stroke","Latin capital letter e with breve":"Latin capital letter e with breve","Latin capital letter e with caron":"Latin capital letter e with caron","Latin capital letter e with dot above":"Latin capital letter e with dot above","Latin capital letter e with macron":"Latin capital letter e with macron","Latin capital letter e with ogonek":"Latin capital letter e with ogonek","Latin capital letter eng":"Latin capital letter eng","Latin capital letter g with breve":"Latin capital letter g with breve","Latin capital letter g with cedilla":"Latin capital letter g with cedilla","Latin capital letter g with circumflex":"Latin capital letter g with circumflex","Latin capital letter g with dot above":"Latin capital letter g with dot above","Latin capital letter h with circumflex":"Latin capital letter h with circumflex","Latin capital letter h with stroke":"Latin capital letter h with stroke","Latin capital letter i with breve":"Latin capital letter i with breve","Latin capital letter i with dot above":"Latin capital letter i with dot above","Latin capital letter i with macron":"Latin capital letter i with macron","Latin capital letter i with ogonek":"Latin capital letter i with ogonek","Latin capital letter i with tilde":"Latin capital letter i with tilde","Latin capital letter j with circumflex":"Latin capital letter j with circumflex","Latin capital letter k with cedilla":"Latin capital letter k with cedilla","Latin capital letter l with acute":"Latin capital letter l with acute","Latin capital letter l with caron":"Latin capital letter l with caron","Latin capital letter l with cedilla":"Latin capital letter l with cedilla","Latin capital letter l with middle dot":"Latin capital letter l with middle dot","Latin capital letter l with stroke":"Latin capital letter l with stroke","Latin capital letter n with acute":"Latin capital letter n with acute","Latin capital letter n with caron":"Latin capital letter n with caron","Latin capital letter n with cedilla":"Latin capital letter n with cedilla","Latin capital letter o with breve":"Latin capital letter o with breve","Latin capital letter o with double acute":"Latin capital letter o with double acute","Latin capital letter o with macron":"Latin capital letter o with macron","Latin capital letter r with acute":"Latin capital letter r with acute","Latin capital letter r with caron":"Latin capital letter r with caron","Latin capital letter r with cedilla":"Latin capital letter r with cedilla","Latin capital letter s with acute":"Latin capital letter s with acute","Latin capital letter s with caron":"Latin capital letter s with caron","Latin capital letter s with cedilla":"Latin capital letter s with cedilla","Latin capital letter s with circumflex":"Latin capital letter s with circumflex","Latin capital letter t with caron":"Latin capital letter t with caron","Latin capital letter t with cedilla":"Latin capital letter t with cedilla","Latin capital letter t with stroke":"Latin capital letter t with stroke","Latin capital letter u with breve":"Latin capital letter u with breve","Latin capital letter u with double acute":"Latin capital letter u with double acute","Latin capital letter u with macron":"Latin capital letter u with macron","Latin capital letter u with ogonek":"Latin capital letter u with ogonek","Latin capital letter u with ring above":"Latin capital letter u with ring above","Latin capital letter u with tilde":"Latin capital letter u with tilde","Latin capital letter w with circumflex":"Latin capital letter w with circumflex","Latin capital letter y with circumflex":"Latin capital letter y with circumflex","Latin capital letter y with diaeresis":"Latin capital letter y with diaeresis","Latin capital letter z with acute":"Latin capital letter z with acute","Latin capital letter z with caron":"Latin capital letter z with caron","Latin capital letter z with dot above":"Latin capital letter z with dot above","Latin capital ligature ij":"Latin capital ligature ij","Latin capital ligature oe":"Latin capital ligature oe","Latin small letter a with breve":"Latin small letter a with breve","Latin small letter a with macron":"Latin small letter a with macron","Latin small letter a with ogonek":"Latin small letter a with ogonek","Latin small letter c with acute":"Latin small letter c with acute","Latin small letter c with caron":"Latin small letter c with caron","Latin small letter c with circumflex":"Latin small letter c with circumflex","Latin small letter c with dot above":"Latin small letter c with dot above","Latin small letter d with caron":"Latin small letter d with caron","Latin small letter d with stroke":"Latin small letter d with stroke","Latin small letter dotless i":"Latin small letter dotless i","Latin small letter e with breve":"Latin small letter e with breve","Latin small letter e with caron":"Latin small letter e with caron","Latin small letter e with dot above":"Latin small letter e with dot above","Latin small letter e with macron":"Latin small letter e with macron","Latin small letter e with ogonek":"Latin small letter e with ogonek","Latin small letter eng":"Latin small letter eng","Latin small letter f with hook":"Latin small letter f with hook","Latin small letter g with breve":"Latin small letter g with breve","Latin small letter g with cedilla":"Latin small letter g with cedilla","Latin small letter g with circumflex":"Latin small letter g with circumflex","Latin small letter g with dot above":"Latin small letter g with dot above","Latin small letter h with circumflex":"Latin small letter h with circumflex","Latin small letter h with stroke":"Latin small letter h with stroke","Latin small letter i with breve":"Latin small letter i with breve","Latin small letter i with macron":"Latin small letter i with macron","Latin small letter i with ogonek":"Latin small letter i with ogonek","Latin small letter i with tilde":"Latin small letter i with tilde","Latin small letter j with circumflex":"Latin small letter j with circumflex","Latin small letter k with cedilla":"Latin small letter k with cedilla","Latin small letter kra":"Latin small letter kra","Latin small letter l with acute":"Latin small letter l with acute","Latin small letter l with caron":"Latin small letter l with caron","Latin small letter l with cedilla":"Latin small letter l with cedilla","Latin small letter l with middle dot":"Latin small letter l with middle dot","Latin small letter l with stroke":"Latin small letter l with stroke","Latin small letter long s":"Latin small letter long s","Latin small letter n preceded by apostrophe":"Latin small letter n preceded by apostrophe","Latin small letter n with acute":"Latin small letter n with acute","Latin small letter n with caron":"Latin small letter n with caron","Latin small letter n with cedilla":"Latin small letter n with cedilla","Latin small letter o with breve":"Latin small letter o with breve","Latin small letter o with double acute":"Latin small letter o with double acute","Latin small letter o with macron":"Latin small letter o with macron","Latin small letter r with acute":"Latin small letter r with acute","Latin small letter r with caron":"Latin small letter r with caron","Latin small letter r with cedilla":"Latin small letter r with cedilla","Latin small letter s with acute":"Latin small letter s with acute","Latin small letter s with caron":"Latin small letter s with caron","Latin small letter s with cedilla":"Latin small letter s with cedilla","Latin small letter s with circumflex":"Latin small letter s with circumflex","Latin small letter t with caron":"Latin small letter t with caron","Latin small letter t with cedilla":"Latin small letter t with cedilla","Latin small letter t with stroke":"Latin small letter t with stroke","Latin small letter u with breve":"Latin small letter u with breve","Latin small letter u with double acute":"Latin small letter u with double acute","Latin small letter u with macron":"Latin small letter u with macron","Latin small letter u with ogonek":"Latin small letter u with ogonek","Latin small letter u with ring above":"Latin small letter u with ring above","Latin small letter u with tilde":"Latin small letter u with tilde","Latin small letter w with circumflex":"Latin small letter w with circumflex","Latin small letter y with circumflex":"Latin small letter y with circumflex","Latin small letter z with acute":"Latin small letter z with acute","Latin small letter z with caron":"Latin small letter z with caron","Latin small letter z with dot above":"Latin small letter z with dot above","Latin small ligature ij":"Latin small ligature ij","Latin small ligature oe":"Latin small ligature oe","Left double quotation mark":"Left double quotation mark","Left single quotation mark":"Left single quotation mark","Left-pointing double angle quotation mark":"Left-pointing double angle quotation mark","leftwards arrow to bar":"leftwards arrow to bar","leftwards dashed arrow":"leftwards dashed arrow","leftwards double arrow":"leftwards double arrow","Less-than or equal to":"Less-than or equal to","Less-than sign":"Less-than sign","Lira sign":"Lira sign","Livre tournois sign":"Livre tournois sign","Logical and":"Logical and","Logical or":"Logical or",Macron:"Macron","Manat sign":"Manat sign","Mill sign":"Mill sign","Minus sign":"Minus sign","Multiplication sign":"Multiplication sign","N-ary product":"N-ary product","N-ary summation":"N-ary summation",Nabla:"Nabla","Naira sign":"Naira sign","New sheqel sign":"New sheqel sign","Nordic mark sign":"Nordic mark sign","Not an element of":"Not an element of","Not equal to":"Not equal to","Not sign":"Not sign","on with exclamation mark with left right arrow above":"on with exclamation mark with left right arrow above",Overline:"Overline","Paragraph sign":"Paragraph sign","Partial differential":"Partial differential","Per mille sign":"Per mille sign","Per ten thousand sign":"Per ten thousand sign","Peseta sign":"Peseta sign","Peso sign":"Peso sign","Plus-minus sign":"Plus-minus sign","Pound sign":"Pound sign","Proportional to":"Proportional to","Question exclamation mark":"Question exclamation mark","Registered sign":"Registered sign","Reversed paragraph sign":"Reversed paragraph sign","Right double quotation mark":"Right double quotation mark","Right single quotation mark":"Right single quotation mark","Right-pointing double angle quotation mark":"Right-pointing double angle quotation mark","rightwards arrow to bar":"rightwards arrow to bar","rightwards dashed arrow":"rightwards dashed arrow","rightwards double arrow":"rightwards double arrow","Ruble sign":"Ruble sign","Rupee sign":"Rupee sign","Section sign":"Section sign","Single left-pointing angle quotation mark":"Single left-pointing angle quotation mark","Single low-9 quotation mark":"Single low-9 quotation mark","Single right-pointing angle quotation mark":"Single right-pointing angle quotation mark","soon with rightwards arrow above":"soon with rightwards arrow above","Special characters":"Special characters","Spesmilo sign":"Spesmilo sign","Square root":"Square root","Tenge sign":"Tenge sign","There exists":"There exists","Tilde operator":"Tilde operator","top with upwards arrow above":"top with upwards arrow above","Trade mark sign":"Trade mark sign","Tugrik sign":"Tugrik sign","Turkish lira sign":"Turkish lira sign","Two dot leader":"Two dot leader",Union:"Union","up down arrow with base":"up down arrow with base","upwards arrow to bar":"upwards arrow to bar","upwards dashed arrow":"upwards dashed arrow","upwards double arrow":"upwards double arrow","Vulgar fraction one half":"Vulgar fraction one half","Vulgar fraction one quarter":"Vulgar fraction one quarter","Vulgar fraction three quarters":"Vulgar fraction three quarters","Won sign":"Won sign","Yen sign":"Yen sign"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.hi=e.hi||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Aquamarine",Black:"Black",Blue:"Blue",Cancel:"Cancel","Dim grey":"Dim grey","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Editor toolbar":"Editor toolbar",Green:"Green",Grey:"Grey","Insert paragraph after block":"Insert paragraph after block","Insert paragraph before block":"Insert paragraph before block","Light blue":"Light blue","Light green":"Light green","Light grey":"Light grey",Next:"Next",Orange:"Orange",Previous:"Previous",Purple:"Purple",Red:"Red",Redo:"Redo","Remove color":"Remove color","Restore default":"","Rich Text Editor":"Rich Text Editor","Rich Text Editor, %0":"Rich Text Editor, %0",Save:"Save","Select all":"Select all","Show more items":"Show more items",Turquoise:"Turquoise",Undo:"Undo","Upload in progress":"Upload in progress",White:"White","Widget toolbar":"Widget toolbar",Yellow:"Yellow"}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/hr.js b/core/assets/vendor/ckeditor5/translations/hr.js
new file mode 100644
index 0000000000000000000000000000000000000000..895df5bc7fca1eb39b32b2d445d712db1632ffa0
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/hr.js
@@ -0,0 +1 @@
+!function(n){const a=n.hr=n.hr||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Poravnaj po sredini","Align left":"Poravnaj ulijevo","Align right":"Poravnaj udesno",Justify:"Razvuci","Text alignment":"Poravnanje teksta","Text alignment toolbar":"Traka za poravnanje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.hr=n.hr||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Podebljano",Code:"Kod",Italic:"Ukošeno",Strikethrough:"Precrtano",Subscript:"Indeks",Superscript:"Eksponent",Underline:"Podcrtavanje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.hr=i.hr||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blok citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.hr=a.hr||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Odaberite naslov",Heading:"Naslov","Heading 1":"Naslov 1","Heading 2":"Naslov 2","Heading 3":"Naslov 3","Heading 4":"Naslov 4","Heading 5":"Naslov 5","Heading 6":"Naslov 6",Paragraph:"Paragraf","Type or paste your content here.":"Utipkajte ili zalijepite Vaš sadržaj ovdje.","Type your title":"Utipkajte naslov"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.hr=i.hr||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Vodoravna linija"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.hr=e.hr||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Centrirana slika","Change image text alternative":"Promijeni alternativni tekst slike","Enter image caption":"Unesite naslov slike","Full size image":"Slika pune veličine","Image resize list":"","Image toolbar":"Traka za slike","image widget":"Slika widget","In line":"",Insert:"","Insert image":"Umetni sliku","Insert image via URL":"","Left aligned image":"Lijevo poravnata slika",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Slika poravnata desno","Side image":"Slika sa strane","Text alternative":"Alternativni tekst",Update:"","Update image URL":"","Upload failed":"Slanje nije uspjelo","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.hr=n.hr||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Umanji uvlačenje","Increase indent":"Povećaj uvlačenje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.hr=i.hr||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"Moguće preuzeti","Edit link":"Uredi vezu",Link:"Veza","Link image":"","Link URL":"URL veze","Open in a new tab":"Otvori u novoj kartici","Open link in new tab":"Otvori vezu u novoj kartici","This link has no URL":"Ova veza nema URL",Unlink:"Ukloni vezu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.hr=e.hr||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Obična lista","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Brojčana lista","Numbered list styles toolbar":"",Square:"","To-do List":"Lista zadataka za obaviti","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.hr=o.hr||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"Ukloni format"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.hr=e.hr||{};a.dictionary=Object.assign(a.dictionary||{},{"Align cell text to the bottom":"Tekst ćelije poravnaj prema dolje","Align cell text to the center":"Tekst ćelije poravnaj u sredinu","Align cell text to the left":"Tekst ćelije poravnaj lijevo","Align cell text to the middle":"Tekst ćelije poravnaj u sredinu","Align cell text to the right":"Tekst ćelije poravnaj udesno","Align cell text to the top":"Tekst ćelije poravnaj prema gore","Align table to the left":"Poravnaj tablicu ulijevo","Align table to the right":"Poravnaj tablicu udesno",Alignment:"Poravnanje",Background:"Pozadina",Border:"Granica","Cell properties":"Svojstva ćelije","Center table":"Centriraj tablicu",Color:"Boja","Color picker":"Birač boje",Column:"Kolona",Dashed:"Crtičasta","Delete column":"Obriši kolonu","Delete row":"Obriši red",Dimensions:"Dimenzije",Dotted:"Točkasta",Double:"Dvostruka","Enter table caption":"",Groove:"","Header column":"Kolona zaglavlja","Header row":"Red zaglavlja",Height:"Visina","Horizontal text alignment toolbar":"Alatna traka za horizontalno poravnanje teksta","Insert column left":"Umetni stupac lijevo","Insert column right":"Umetni stupac desno","Insert row above":"Ubaci red iznad","Insert row below":"Ubaci red ispod","Insert table":"Ubaci tablicu",Inset:"","Justify cell text":"Razvuci tekst ćelije","Merge cell down":"Spoji ćelije prema dolje","Merge cell left":"Spoji ćelije prema lijevo","Merge cell right":"Spoji ćelije prema desno","Merge cell up":"Spoji ćelije prema gore","Merge cells":"Spoji ćelije",None:"Nikakva",Outset:"",Padding:"Podstava",Ridge:"Greben",Row:"Red","Select column":"Odaberi stupac","Select row":"Odaberi redak",Solid:"Neprekidna","Split cell horizontally":"Razdvoji ćeliju vodoravno","Split cell vertically":"Razdvoji ćeliju okomito",Style:"Stil","Table alignment toolbar":"Alatna traka za poravnanje tablice","Table cell text alignment":"Poravnanje teksta ćelije tablice","Table properties":"Svojstva tablice","Table toolbar":"Traka za tablice",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Neispravna boja. Pokušajte "#FF0000" ili "rgb(255,0,0)" ili "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Neispravna vrijednost. Pokušajte "10px" ili "2em" ili jednostavno "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Alatna traka za vertikalno poravnanje teksta",Width:"Širina"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.hr=a.hr||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 od %1",Aquamarine:"Akvamarin",Black:"Crna",Blue:"Plava",Cancel:"Poništi","Dim grey":"Tamnosiva","Dropdown toolbar":"Traka padajućeg izbornika","Edit block":"Uredi blok","Editor toolbar":"Traka uređivača",Green:"Zelena",Grey:"Siva","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Svijetloplava","Light green":"Svijetlozelena","Light grey":"Svijetlosiva",Next:"Sljedeći",Orange:"Narančasta",Previous:"Prethodni",Purple:"Ljubičasta",Red:"Crvena",Redo:"Ponovi","Remove color":"Ukloni boju","Restore default":"","Rich Text Editor":"Rich Text Editor","Rich Text Editor, %0":"Rich Text Editor, %0",Save:"Snimi","Select all":"Odaberi sve","Show more items":"Prikaži više stavaka",Turquoise:"Tirkizna",Undo:"Poništi","Upload in progress":"Slanje u tijeku",White:"Bijela","Widget toolbar":"Traka sa spravicama",Yellow:"Žuta"}),e.getPluralForm=function(a){return a%10==1&&a%100!=11?0:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?1:2}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/hu.js b/core/assets/vendor/ckeditor5/translations/hu.js
new file mode 100644
index 0000000000000000000000000000000000000000..bb550b93a50286bc7223ebcba6b28fd3c53c7e68
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/hu.js
@@ -0,0 +1 @@
+!function(i){const t=i.hu=i.hu||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Középre igazítás","Align left":"Balra igazítás","Align right":"Jobbra igazítás",Justify:"Sorkizárt","Text alignment":"Szöveg igazítása","Text alignment toolbar":"Szöveg igazítás eszköztár"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const i=t.hu=t.hu||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Félkövér",Code:"Forráskód",Italic:"Dőlt",Strikethrough:"Áthúzott",Subscript:"Alsó index",Superscript:"Felső index",Underline:"Aláhúzott"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.hu=i.hu||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Idézet"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.hu=e.hu||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"Stílus megadása",Heading:"Stílusok","Heading 1":"Címsor 1","Heading 2":"Címsor 2","Heading 3":"Címsor 3","Heading 4":"Címsor 4","Heading 5":"Címsor 5","Heading 6":"Címsor 6",Paragraph:"Bekezdés","Type or paste your content here.":"Írja be, vagy illessze be a tartalmat.","Type your title":"Adja meg a címet"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.hu=n.hu||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Vízszintes elválasztóvonal"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.hu=e.hu||{};t.dictionary=Object.assign(t.dictionary||{},{"Break text":"Sortörés","Centered image":"Középre igazított kép","Change image text alternative":"Helyettesítő szöveg módosítása","Enter image caption":"Képaláírás megadása","Full size image":"Teljes méretű kép","Image resize list":"Kép átméretezési lista","Image toolbar":"Kép eszköztár","image widget":"képmodul","In line":"Soron belül",Insert:"Beszúrás","Insert image":"Kép beszúrása","Insert image via URL":"Kép beszúrása URL alapján","Left aligned image":"Balra igazított kép",Original:"Eredeti","Resize image":"Kép átméretezése","Resize image to %0":"Kép méretezése %0","Resize image to the original size":"Kép méretezése az eredeti méretre","Right aligned image":"Jobbra igazított kép","Side image":"Oldalsó kép","Text alternative":"Helyettesítő szöveg",Update:"Módosítás","Update image URL":"Kép URL módosítása","Upload failed":"A feltöltés nem sikerült","Wrap text":"Körbefuttatás"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.hu=n.hu||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Behúzás csökkentése","Increase indent":"Behúzás növelése"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.hu=a.hu||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose language":"Nyelv választása",Language:"Nyelv","Remove language":"Nyelv eltávolítása"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.hu=n.hu||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Letölthető","Edit link":"Link szerkesztése",Link:"Link","Link image":"Hivatkozás","Link URL":"URL link","Open in a new tab":"Megnyitás új lapon","Open link in new tab":"Link megnyitása új ablakban","This link has no URL":"A link nem tartalmaz URL-t",Unlink:"Link eltávolítása"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.hu=e.hu||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Pontozott lista","Bulleted list styles toolbar":"",Circle:"Kör",Decimal:"Szám","Decimal with leading zero":"Nullával kezdődő szám",Disc:"Korong","Lower-latin":"Kisbetűs latin szám","Lower–roman":"Kisbetűs római szám","Numbered List":"Számozott lista","Numbered list styles toolbar":"",Square:"Négyzet","To-do List":"Tennivaló lista","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"Nagybetűs latin szám","Upper-roman":"Nagybetűs római szám"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.hu=o.hu||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"Formázás eltávolítása"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.hu=i.hu||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"Forrás"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.hu=e.hu||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Szöveg igazítása a cellában alulra","Align cell text to the center":"Szöveg igazítása a cellában középre","Align cell text to the left":"Szöveg igazítása a cellában balra","Align cell text to the middle":"Szöveg igazítása a cellában középre","Align cell text to the right":"Szöveg igazítása a cellában jobbra","Align cell text to the top":"Szöveg igazítása a cellában felülre","Align table to the left":"Tábla igazítása balra","Align table to the right":"Tábla igazítása jobbra",Alignment:"Igazítás",Background:"Háttér",Border:"Keret","Cell properties":"Cella tulajdonságok","Center table":"Tábla igazítása középre",Color:"Szín","Color picker":"Szín választása",Column:"Oszlop",Dashed:"Szaggatott","Delete column":"Oszlop törlése","Delete row":"Sor törlése",Dimensions:"Méretek",Dotted:"Pontozott",Double:"Dupla","Enter table caption":"Táblázat feliratának megadása",Groove:"Árok","Header column":"Oszlop fejléc","Header row":"Sor fejléc",Height:"Magasság","Horizontal text alignment toolbar":"Vízszintes szövegigazítási eszköztár","Insert column left":"Oszlop beszúrása balra","Insert column right":"Oszlop beszúrása jobbra","Insert row above":"Sor beszúrása fölé","Insert row below":"Sor beszúrása alá","Insert table":"Táblázat beszúrása",Inset:"Mélyített","Justify cell text":"Szöveg igazítása a cellában sorkizártra","Merge cell down":"Cellák egyesítése lefelé","Merge cell left":"Cellák egyesítése balra","Merge cell right":"Cellák egyesítése jobbra","Merge cell up":"Cellák egyesítése felfelé","Merge cells":"Cellaegyesítés",None:"Nincs",Outset:"Kiemelkedő",Padding:"Térköz",Ridge:"Gerinc",Row:"Sor","Select column":"Oszlop kijelölése","Select row":"Sor kijelölése",Solid:"Tömör","Split cell horizontally":"Cella felosztása vízszintesen","Split cell vertically":"Cella felosztása függőlegesen",Style:"Stílus","Table alignment toolbar":"Táblázatigazítási eszköztár","Table cell text alignment":"Szöveg igazítása a cellában","Table properties":"Táblázat tulajdonságai","Table toolbar":"Táblázat eszköztár",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'A szín érványtelen. Próbáld így "#FF0000" vagy "rgb(255,0,0)" vagy "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Az érték érvénytelen. Próbáld így "10px" vagy "2em" vagy csak egyszerűen "2".',"Toggle caption off":"Felirat kikapcsolása","Toggle caption on":"Felirat bekapcsolása","Vertical text alignment toolbar":"Függőleges szövegigazítási eszköztár",Width:"Szélesség"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.hu=i.hu||{};n.dictionary=Object.assign(n.dictionary||{},{"HTML object":"HTML objektum"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t.hu=t.hu||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"",Angle:"","Approximately equal to":"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"","Bitcoin sign":"Bitcoin jel","Cedi sign":"","Cent sign":"Cent jel","Character categories":"","Colon sign":"Kettőspont","Contains as member":"","Copyright sign":"Copyright jele","Cruzeiro sign":"","Currency sign":"Pénznem jel","Degree sign":"","Division sign":"","Dollar sign":"Dollár jel","Dong sign":"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"","downwards arrow to bar":"","downwards dashed arrow":"szaggatott nyíl lefelé","downwards double arrow":"dupla nyíl lefelé","Drachma sign":"","Element of":"","Em dash":"","Empty set":"","En dash":"","end with leftwards arrow above":"","Euro sign":"Euró jel","Euro-currency sign":"Euró pénznem jel","Exclamation question mark":"","For all":"","Fraction slash":"","French franc sign":"Francia frank jel","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"","Guarani sign":"","Horizontal ellipsis":"","Hryvnia sign":"","Identical to":"","Indian rupee sign":"",Infinity:"",Integral:"",Intersection:"","Inverted exclamation mark":"","Inverted question mark":"Fordított kérdőjel","Kip sign":"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin capital letter c with caron":"","Latin capital letter c with circumflex":"","Latin capital letter c with dot above":"","Latin capital letter d with caron":"","Latin capital letter d with stroke":"","Latin capital letter e with breve":"","Latin capital letter e with caron":"","Latin capital letter e with dot above":"","Latin capital letter e with macron":"","Latin capital letter e with ogonek":"","Latin capital letter eng":"","Latin capital letter g with breve":"","Latin capital letter g with cedilla":"","Latin capital letter g with circumflex":"","Latin capital letter g with dot above":"","Latin capital letter h with circumflex":"","Latin capital letter h with stroke":"","Latin capital letter i with breve":"","Latin capital letter i with dot above":"","Latin capital letter i with macron":"","Latin capital letter i with ogonek":"","Latin capital letter i with tilde":"","Latin capital letter j with circumflex":"","Latin capital letter k with cedilla":"","Latin capital letter l with acute":"","Latin capital letter l with caron":"","Latin capital letter l with cedilla":"","Latin capital letter l with middle dot":"","Latin capital letter l with stroke":"","Latin capital letter n with acute":"","Latin capital letter n with caron":"","Latin capital letter n with cedilla":"","Latin capital letter o with breve":"","Latin capital letter o with double acute":"","Latin capital letter o with macron":"","Latin capital letter r with acute":"","Latin capital letter r with caron":"","Latin capital letter r with cedilla":"","Latin capital letter s with acute":"","Latin capital letter s with caron":"","Latin capital letter s with cedilla":"","Latin capital letter s with circumflex":"","Latin capital letter t with caron":"","Latin capital letter t with cedilla":"","Latin capital letter t with stroke":"","Latin capital letter u with breve":"","Latin capital letter u with double acute":"","Latin capital letter u with macron":"","Latin capital letter u with ogonek":"","Latin capital letter u with ring above":"","Latin capital letter u with tilde":"","Latin capital letter w with circumflex":"","Latin capital letter y with circumflex":"","Latin capital letter y with diaeresis":"","Latin capital letter z with acute":"","Latin capital letter z with caron":"","Latin capital letter z with dot above":"","Latin capital ligature ij":"","Latin capital ligature oe":"","Latin small letter a with breve":"","Latin small letter a with macron":"","Latin small letter a with ogonek":"","Latin small letter c with acute":"","Latin small letter c with caron":"","Latin small letter c with circumflex":"","Latin small letter c with dot above":"","Latin small letter d with caron":"","Latin small letter d with stroke":"","Latin small letter dotless i":"","Latin small letter e with breve":"","Latin small letter e with caron":"","Latin small letter e with dot above":"","Latin small letter e with macron":"","Latin small letter e with ogonek":"","Latin small letter eng":"","Latin small letter f with hook":"","Latin small letter g with breve":"","Latin small letter g with cedilla":"","Latin small letter g with circumflex":"","Latin small letter g with dot above":"","Latin small letter h with circumflex":"","Latin small letter h with stroke":"","Latin small letter i with breve":"","Latin small letter i with macron":"","Latin small letter i with ogonek":"","Latin small letter i with tilde":"","Latin small letter j with circumflex":"","Latin small letter k with cedilla":"","Latin small letter kra":"","Latin small letter l with acute":"","Latin small letter l with caron":"","Latin small letter l with cedilla":"","Latin small letter l with middle dot":"","Latin small letter l with stroke":"","Latin small letter long s":"","Latin small letter n preceded by apostrophe":"","Latin small letter n with acute":"","Latin small letter n with caron":"","Latin small letter n with cedilla":"","Latin small letter o with breve":"","Latin small letter o with double acute":"","Latin small letter o with macron":"","Latin small letter r with acute":"","Latin small letter r with caron":"","Latin small letter r with cedilla":"","Latin small letter s with acute":"","Latin small letter s with caron":"","Latin small letter s with cedilla":"","Latin small letter s with circumflex":"","Latin small letter t with caron":"","Latin small letter t with cedilla":"","Latin small letter t with stroke":"","Latin small letter u with breve":"","Latin small letter u with double acute":"","Latin small letter u with macron":"","Latin small letter u with ogonek":"","Latin small letter u with ring above":"","Latin small letter u with tilde":"","Latin small letter w with circumflex":"","Latin small letter y with circumflex":"","Latin small letter z with acute":"","Latin small letter z with caron":"","Latin small letter z with dot above":"","Latin small ligature ij":"","Latin small ligature oe":"","Left double quotation mark":"","Left single quotation mark":"","Left-pointing double angle quotation mark":"","leftwards arrow to bar":"","leftwards dashed arrow":"szaggatott nyíl balra","leftwards double arrow":"dupla nyíl balra","Less-than or equal to":"","Less-than sign":"","Lira sign":"Líra jel","Livre tournois sign":"","Logical and":"","Logical or":"",Macron:"","Manat sign":"","Mill sign":"","Minus sign":"","Multiplication sign":"","N-ary product":"","N-ary summation":"",Nabla:"","Naira sign":"","New sheqel sign":"","Nordic mark sign":"","Not an element of":"","Not equal to":"","Not sign":"","on with exclamation mark with left right arrow above":"",Overline:"","Paragraph sign":"","Partial differential":"","Per mille sign":"","Per ten thousand sign":"","Peseta sign":"","Peso sign":"","Plus-minus sign":"","Pound sign":"Font jel","Proportional to":"","Question exclamation mark":"","Registered sign":"","Reversed paragraph sign":"","Right double quotation mark":"","Right single quotation mark":"","Right-pointing double angle quotation mark":"","rightwards arrow to bar":"","rightwards dashed arrow":"szaggatott nyíl jobbra","rightwards double arrow":"dupla nyíl jobbra","Ruble sign":"","Rupee sign":"","Section sign":"","Single left-pointing angle quotation mark":"","Single low-9 quotation mark":"","Single right-pointing angle quotation mark":"","soon with rightwards arrow above":"","Special characters":"Speciális karakterek","Spesmilo sign":"","Square root":"","Tenge sign":"","There exists":"","Tilde operator":"","top with upwards arrow above":"","Trade mark sign":"","Tugrik sign":"","Turkish lira sign":"","Two dot leader":"",Union:"","up down arrow with base":"","upwards arrow to bar":"","upwards dashed arrow":"szaggatott nyíl felfelé","upwards double arrow":"dupla nyíl felfelé","Vulgar fraction one half":"","Vulgar fraction one quarter":"","Vulgar fraction three quarters":"","Won sign":"","Yen sign":"Yen jel"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.hu=e.hu||{};t.dictionary=Object.assign(t.dictionary||{},{"%0 of %1":"%0 / %1",Aquamarine:"Kékeszöld",Black:"Fekete",Blue:"Kék",Cancel:"Mégsem","Dim grey":"Halvány szürke","Dropdown toolbar":"Lenyíló eszköztár","Edit block":"Blokk szerkesztése","Editor toolbar":"Szerkesztő eszköztár",Green:"Zöld",Grey:"Szürke","Insert paragraph after block":"Bekezdés beszúrása utána","Insert paragraph before block":"Bekezdés beszúrása elé","Light blue":"Világoskék","Light green":"Világoszöld","Light grey":"Világosszürke",Next:"Következő",Orange:"Narancs",Previous:"Előző",Purple:"Lila",Red:"Piros",Redo:"Újra","Remove color":"Szín eltávolítása","Restore default":"Alapértelmezés visszaállítása","Rich Text Editor":"Bővített szövegszerkesztő","Rich Text Editor, %0":"Bővített szövegszerkesztő, %0",Save:"Mentés","Select all":"Mindet kijelöl","Show more items":"További elemek",Turquoise:"Türkiz",Undo:"Visszavonás","Upload in progress":"A feltöltés folyamatban",White:"Fehér","Widget toolbar":"Widget eszköztár",Yellow:"Sárga"}),t.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/id.js b/core/assets/vendor/ckeditor5/translations/id.js
new file mode 100644
index 0000000000000000000000000000000000000000..4a06298dfd260c5a389657008c138902fcc5fb3d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/id.js
@@ -0,0 +1 @@
+!function(a){const t=a.id=a.id||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Rata tengah","Align left":"Rata kiri","Align right":"Rata kanan",Justify:"Rata kanan-kiri","Text alignment":"Perataan teks","Text alignment toolbar":"Alat perataan teks"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const r=i.id=i.id||{};r.dictionary=Object.assign(r.dictionary||{},{Bold:"Tebal",Code:"Kode",Italic:"Miring",Strikethrough:"Coret",Subscript:"Subskrip",Superscript:"Superskrip",Underline:"Garis bawah"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.id=i.id||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Kutipan"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const i=a.id=a.id||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Pilih tajuk",Heading:"Tajuk","Heading 1":"Tajuk 1","Heading 2":"Tajuk 2","Heading 3":"Tajuk 3","Heading 4":"Tajuk 4","Heading 5":"Tajuk 5","Heading 6":"Tajuk 6",Paragraph:"Paragraf","Type or paste your content here.":"Ketik atau tempel konten Anda di sini.","Type your title":"Ketik judul Anda"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.id=i.id||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Garis horizontal"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.id=a.id||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"","Centered image":"Gambar rata tengah","Change image text alternative":"Ganti alternatif teks gambar","Enter image caption":"Tambahkan deskripsi gambar","Full size image":"Gambar ukuran penuh","Image resize list":"Daftar ukuran gambar","Image toolbar":"Alat gambar","image widget":"widget gambar","In line":"",Insert:"Sisipkan","Insert image":"Sisipkan gambar","Insert image via URL":"Sisipkan gambar melalui URL","Left aligned image":"Gambar rata kiri",Original:"Asli","Resize image":"Ubah ukuran gambar","Resize image to %0":"Ubah ukuran gambar ke %0","Resize image to the original size":"Ubah ukuran gambar ke ukuran asli","Right aligned image":"Gambar rata kanan","Side image":"Gambar sisi","Text alternative":"Alternatif teks",Update:"Perbarui","Update image URL":"Perbarui URL gambar","Upload failed":"Gagal mengunggah","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.id=n.id||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Kurangi indentasi","Increase indent":"Tambah indentasi"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const i=a.id=a.id||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose language":"Pilih bahasa",Language:"Bahasa","Remove language":"Singkirkan bahasa"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.id=n.id||{};a.dictionary=Object.assign(a.dictionary||{},{Downloadable:"Dapat diunduh","Edit link":"Sunting tautan",Link:"Tautan","Link image":"","Link URL":"URL tautan","Open in a new tab":"Buka di tab baru","Open link in new tab":"Buka tautan di tab baru","This link has no URL":"Tautan ini tidak memiliki URL",Unlink:"Hapus tautan"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.id=e.id||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Daftar Tak Berangka","Bulleted list styles toolbar":"Bilah alat gaya daftar bullet",Circle:"Lingkaran",Decimal:"Desimal","Decimal with leading zero":"Desimal dengan awalan nol",Disc:"Disk","Lower-latin":"","Lower–roman":"","Numbered List":"Daftar Berangka","Numbered list styles toolbar":"Bilah alat gaya daftar angka",Square:"Kotak","To-do List":"Daftar untuk-dikerjakan","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.id=i.id||{};o.dictionary=Object.assign(o.dictionary||{},{"Remove Format":"Hapus Format"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.id=e.id||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"Latar belakang",Border:"Garis batas","Cell properties":"Properti sel","Center table":"",Color:"Warna","Color picker":"",Column:"Kolom",Dashed:"","Delete column":"Hapus kolom","Delete row":"Hapus baris",Dimensions:"Dimensi",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Kolom tajuk","Header row":"Baris tajuk",Height:"Tinggi","Horizontal text alignment toolbar":"","Insert column left":"Sisipkan kolom ke kiri","Insert column right":"Sisipkan kolom ke kanan","Insert row above":"Sisipkan baris ke atas","Insert row below":"Sisipkan baris ke bawah","Insert table":"Sisipkan tabel",Inset:"","Justify cell text":"","Merge cell down":"Gabungkan sel ke bawah","Merge cell left":"Gabungkan sel ke kiri","Merge cell right":"Gabungkan sel ke kanan","Merge cell up":"Gabungkan sel ke atas","Merge cells":"Gabungkan sel",None:"",Outset:"",Padding:"",Ridge:"",Row:"Baris","Select column":"Seleksi kolom","Select row":"Seleksi baris",Solid:"","Split cell horizontally":"Bagikan sel secara horizontal","Split cell vertically":"Bagikan sel secara vertikal",Style:"Gaya","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"Properti tabel","Table toolbar":"Alat tabel",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:"Lebar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.id=a.id||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 dari %1",Aquamarine:"Biru laut",Black:"Hitam",Blue:"Biru",Cancel:"Batal","Dim grey":"Kelabu gelap","Dropdown toolbar":"Alat dropdown","Edit block":"Sunting blok","Editor toolbar":"Alat editor",Green:"Hijau",Grey:"Kelabu","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Biru terang","Light green":"Hijau terang","Light grey":"Kelabu terang",Next:"Berikutnya",Orange:"Jingga",Previous:"Sebelumnya",Purple:"Ungu",Red:"Merah",Redo:"Lakukan lagi","Remove color":"Hapus warna","Restore default":"","Rich Text Editor":"Editor Teks Kaya","Rich Text Editor, %0":"Editor Teks Kaya, %0",Save:"Simpan","Show more items":"",Turquoise:"Turkish",Undo:"Batal","Upload in progress":"Sedang mengunggah",White:"Putih","Widget toolbar":"Alat widget",Yellow:"Kuning"}),e.getPluralForm=function(a){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/it.js b/core/assets/vendor/ckeditor5/translations/it.js
new file mode 100644
index 0000000000000000000000000000000000000000..0109c4aa6edc07fc49be14809c2c8cce78faabcc
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/it.js
@@ -0,0 +1 @@
+!function(i){const n=i.it=i.it||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Allinea al centro","Align left":"Allinea a sinistra","Align right":"Allinea a destra",Justify:"Giustifica","Text alignment":"Allineamento del testo","Text alignment toolbar":"Barra degli strumenti dell'allineamento"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.it=i.it||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Grassetto",Code:"Codice",Italic:"Corsivo",Strikethrough:"Barrato",Subscript:"Pedice",Superscript:"Apice",Underline:"Sottolineato"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.it=i.it||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blocco citazione"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e.it=e.it||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Seleziona intestazione",Heading:"Intestazione","Heading 1":"Intestazione 1","Heading 2":"Intestazione 2","Heading 3":"Intestazione 3","Heading 4":"Intestazione 4","Heading 5":"Intestazione 5","Heading 6":"Intestazione 6",Paragraph:"Paragrafo","Type or paste your content here.":"Inserire o incollare qui il proprio contenuto.","Type your title":"Inserire il proprio titolo"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.it=i.it||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Linea orizzontale"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i.it=i.it||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"Interrompi testo","Centered image":"Immagine centrata","Change image text alternative":"Cambia testo alternativo dell'immagine","Enter image caption":"inserire didascalia dell'immagine","Full size image":"Immagine a dimensione intera","Image resize list":"Elenco ridimensionamenti immagine","Image toolbar":"Barra degli strumenti dell'immagine","image widget":"Widget immagine","In line":"In linea",Insert:"Inserisci","Insert image":"Inserisci immagine","Insert image via URL":"Inserisci immagine tramite URL","Left aligned image":"Immagine allineata a sinistra",Original:"Originale","Resize image":"Ridimensiona immagine","Resize image to %0":"Ridimensiona immagine a %0","Resize image to the original size":"Ridimensiona immagine alle dimensioni originali","Right aligned image":"Immagine allineata a destra","Side image":"Immagine laterale","Text alternative":"Testo alternativo",Update:"Aggiorna","Update image URL":"Aggiorna URL immagine","Upload failed":"Caricamento fallito","Wrap text":"Testo a capo"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.it=i.it||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Riduci rientro","Increase indent":"Aumenta rientro"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.it=i.it||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Seleziona lingua",Language:"Lingua","Remove language":"Rimuovi lingua"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.it=n.it||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Scaricabile","Edit link":"Modifica collegamento",Link:"Collegamento","Link image":"Collega immagine","Link URL":"URL del collegamento","Open in a new tab":"Apri in una nuova scheda","Open link in new tab":"Apri collegamento in nuova scheda","This link has no URL":"Questo collegamento non ha un URL",Unlink:"Elimina collegamento"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.it=e.it||{};i.dictionary=Object.assign(i.dictionary||{},{"Bulleted List":"Elenco puntato","Bulleted list styles toolbar":"Barra degli strumenti con gli stili degli elenchi puntati",Circle:"Cerchio",Decimal:"Numero","Decimal with leading zero":"Numero con zero anteposto",Disc:"Disco","Lower-latin":"Lettera minuscola","Lower–roman":"Numero romano minuscolo","Numbered List":"Elenco numerato","Numbered list styles toolbar":"Barra degli strumenti con gli stili degli elenchi numerati",Square:"Quadrato","To-do List":"Elenco cose da fare","Toggle the circle list style":"Attiva/disattiva lo stile degli elenchi con cerchi","Toggle the decimal list style":"Attiva/disattiva lo stile degli elenchi con numeri","Toggle the decimal with leading zero list style":"Attiva/disattiva lo stile degli elenchi con numeri con zero anteposto","Toggle the disc list style":"Attiva/disattiva lo stile degli elenchi con dischi","Toggle the lower–latin list style":"Attiva/disattiva lo stile degli elenchi con lettere minuscole","Toggle the lower–roman list style":"Attiva/disattiva lo stile degli elenchi con numeri romani minuscoli","Toggle the square list style":"Attiva/disattiva lo stile degli elenchi con quadrati","Toggle the upper–latin list style":"Attiva/disattiva lo stile degli elenchi con lettere maiuscole","Toggle the upper–roman list style":"Attiva/disattiva lo stile degli elenchi con numeri romani maiuscoli","Upper-latin":"Lettera maiuscola","Upper-roman":"Numero romano maiuscolo"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.it=i.it||{};o.dictionary=Object.assign(o.dictionary||{},{"Remove Format":"Rimuovi formato"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.it=i.it||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"Sorgente"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.it=e.it||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Allinea il testo della cella in basso","Align cell text to the center":"Allinea il testo della cella al centro","Align cell text to the left":"Allinea il testo della cella a sinistra","Align cell text to the middle":"Allinea il testo della cella in mezzo","Align cell text to the right":"Allinea il testo della cella a destra","Align cell text to the top":"Allinea il testo della cella in alto","Align table to the left":"Allinea tabella a sinistra","Align table to the right":"Allinea tabella a destra",Alignment:"Allineamento",Background:"Sfondo",Border:"Bordo","Cell properties":"Proprietà cella","Center table":"Allinea tabella al centro",Color:"Colore","Color picker":"Selezione colore",Column:"Colonna",Dashed:"Tratteggiato","Delete column":"Elimina colonna","Delete row":"Elimina riga",Dimensions:"Dimensioni",Dotted:"Punteggiato",Double:"Doppio","Enter table caption":"Inserire la didascalia della tabella",Groove:"Scanalatura","Header column":"Intestazione colonna","Header row":"Riga d'intestazione",Height:"Altezza","Horizontal text alignment toolbar":"Barra degli strumenti dell'allineamento orizzontale del testo","Insert column left":"Inserisci colonna a sinistra","Insert column right":"Inserisci colonna a destra","Insert row above":"Inserisci riga sopra","Insert row below":"Inserisci riga sotto","Insert table":"Inserisci tabella",Inset:"Incassato","Justify cell text":"Testo della cella giustificato","Merge cell down":"Unisci cella sotto","Merge cell left":"Unisci cella a sinistra","Merge cell right":"Unisci cella a destra","Merge cell up":"Unisci cella sopra","Merge cells":"Unisci celle",None:"Nessuno",Outset:"Rialzato",Padding:"Spaziatura interna",Ridge:"Rilievo",Row:"Riga","Select column":"Seleziona colonna","Select row":"Seleziona riga",Solid:"Solido","Split cell horizontally":"Dividi cella orizzontalmente","Split cell vertically":"Dividi cella verticalmente",Style:"Stile","Table alignment toolbar":"Barra degli strumenti dell'allineamento della tabella","Table cell text alignment":"Allineamento del testo nella cella della tabella","Table properties":"Proprietà tabella","Table toolbar":"Barra degli strumenti della tabella",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Il colore non è valido. Provare "#FF0000" o "rgb(255,0,0)" o "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Il valore non è valido. Provare "10px" o "2em" o semplicemente "2".',"Toggle caption off":"Attiva didascalia","Toggle caption on":"Disattiva didascalia","Vertical text alignment toolbar":"Barra degli strumenti dell'allineamento verticale del testo",Width:"Larghezza"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.it=i.it||{};t.dictionary=Object.assign(t.dictionary||{},{"HTML object":"Oggetto HTML"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const t=a.it=a.it||{};t.dictionary=Object.assign(t.dictionary||{},{"Almost equal to":"Quasi uguale a",Angle:"Angolo","Approximately equal to":"Approssimativamente uguale a","Asterisk operator":"Operatore asterisco","Austral sign":"Simbolo austral","back with leftwards arrow above":"back con sopra freccia verso sinistra","Bitcoin sign":"Simbolo bitcoin","Cedi sign":"Simbolo cedi","Cent sign":"Simbolo centesimo","Character categories":"Categorie di caratteri","Colon sign":"Simbolo colon","Contains as member":"Contiene","Copyright sign":"Simbolo copyright","Cruzeiro sign":"Simbolo cruzeiro","Currency sign":"Simbolo valuta","Degree sign":"Simbolo gradi","Division sign":"Segno di divisione","Dollar sign":"Simbolo dollaro","Dong sign":"Simbolo dong","Double dagger":"Doppio obelisco","Double exclamation mark":"Doppio punto esclamativo","Double low-9 quotation mark":"Doppie virgolette basse","Double question mark":"Doppio punto interrogativo","downwards arrow to bar":"Freccia verso barra in basso","downwards dashed arrow":"Freccia tratteggiata verso il basso","downwards double arrow":"Freccia doppia verso il basso","Drachma sign":"Simbolo dracma","Element of":"Elemento di","Em dash":"Trattino lungo (em)","Empty set":"Insieme vuoto","En dash":"Trattino medio (en)","end with leftwards arrow above":"end con sopra freccia verso sinistra","Euro sign":"Simbolo euro","Euro-currency sign":"Simbolo valuta euro","Exclamation question mark":"Punti esclamativo e interrogativo","For all":"Per ogni","Fraction slash":"Barra di frazione","French franc sign":"Simbolo franco francese","German penny sign":"Simbolo pfennig tedesco","Greater-than or equal to":"Maggiore o uguale a","Greater-than sign":"Simbolo maggiore di","Guarani sign":"Simbolo guaraní","Horizontal ellipsis":"Puntini di sospensione orizzontali","Hryvnia sign":"Simbolo grivnia","Identical to":"Identico a","Indian rupee sign":"Simbolo rupia indiana",Infinity:"Infinito",Integral:"Integrale",Intersection:"Intersezione","Inverted exclamation mark":"Punto esclamativo invertito","Inverted question mark":"Punto interrogativo invertito","Kip sign":"Simbolo kip","Latin capital letter a with breve":"Lettera A latina maiuscola con breve","Latin capital letter a with macron":"Lettera A latina maiuscola con macron","Latin capital letter a with ogonek":"Lettera A latina maiuscola con codetta","Latin capital letter c with acute":"Lettera C latina maiuscola con accento acuto","Latin capital letter c with caron":"Lettera C latina maiuscola con pipa","Latin capital letter c with circumflex":"Lettera C latina maiuscola con accento circonflesso","Latin capital letter c with dot above":"Lettera C latina maiuscola con punto sovrascritto","Latin capital letter d with caron":"Lettera D latina maiuscola con pipa","Latin capital letter d with stroke":"Lettera D latina maiuscola con barra","Latin capital letter e with breve":"Lettera E latina maiuscola con accento breve","Latin capital letter e with caron":"Lettera E latina maiuscola con pipa","Latin capital letter e with dot above":"Lettera E latina maiuscola con punto sovrascritto","Latin capital letter e with macron":"Lettera E latina maiuscola con macron","Latin capital letter e with ogonek":"Lettera E latina maiuscola con codetta","Latin capital letter eng":"Nasale velare maiuscola","Latin capital letter g with breve":"Lettera G latina maiuscola con breve","Latin capital letter g with cedilla":"Lettera G latina maiuscola con cediglia","Latin capital letter g with circumflex":"Lettera G latina maiuscola con accento circonflesso","Latin capital letter g with dot above":"Lettera G latina maiuscola con punto sovrascritto","Latin capital letter h with circumflex":"Lettera H latina maiuscola con accento circonflesso","Latin capital letter h with stroke":"Lettera H latina maiuscola con barra","Latin capital letter i with breve":"Lettera I latina maiuscola con breve","Latin capital letter i with dot above":"Lettera I latina maiuscola con punto sovrascritto","Latin capital letter i with macron":"Lettera I latina maiuscola con macron","Latin capital letter i with ogonek":"Lettera I latina maiuscola con codetta","Latin capital letter i with tilde":"Lettera I latina maiuscola con tilde","Latin capital letter j with circumflex":"Lettera J latina maiuscola con accento circonflesso","Latin capital letter k with cedilla":"Lettera K latina maiuscola con cediglia","Latin capital letter l with acute":"Lettera L latina maiuscola con accento acuto","Latin capital letter l with caron":"Lettera L latina maiuscola con pipa","Latin capital letter l with cedilla":"Lettera L latina maiuscola con cediglia","Latin capital letter l with middle dot":"Lettera L latina maiuscola con punto in mezzo","Latin capital letter l with stroke":"Lettera L latina maiuscola con barra","Latin capital letter n with acute":"Lettera N latina maiuscola con accento acuto","Latin capital letter n with caron":"Lettera N latina maiuscola con pipa","Latin capital letter n with cedilla":"Lettera N latina maiuscola con cediglia","Latin capital letter o with breve":"Lettera O latina maiuscola con breve","Latin capital letter o with double acute":"Lettera O latina maiuscola con doppio accento acuto","Latin capital letter o with macron":"Lettera O latina maiuscola con macron","Latin capital letter r with acute":"Lettera R latina maiuscola con accento acuto","Latin capital letter r with caron":"Lettera R latina maiuscola con pipa","Latin capital letter r with cedilla":"Lettera R latina maiuscola con cediglia","Latin capital letter s with acute":"Lettera S latina maiuscola con accento acuto","Latin capital letter s with caron":"Lettera S latina maiuscola con pipa","Latin capital letter s with cedilla":"Lettera S latina maiuscola con cediglia","Latin capital letter s with circumflex":"Lettera S latina maiuscola con accento circonflesso","Latin capital letter t with caron":"Lettera T latina maiuscola con pipa","Latin capital letter t with cedilla":"Lettera T latina maiuscola con cediglia","Latin capital letter t with stroke":"Lettera T latina maiuscola con barra","Latin capital letter u with breve":"Lettera U latina maiuscola con breve","Latin capital letter u with double acute":"Lettera U latina maiuscola con doppio accento acuto","Latin capital letter u with macron":"Lettera U latina maiuscola con macron","Latin capital letter u with ogonek":"Lettera U latina maiuscola con codetta","Latin capital letter u with ring above":"Lettera U latina maiuscola con anello in alto","Latin capital letter u with tilde":"Lettera U latina maiuscola con tilde","Latin capital letter w with circumflex":"Lettera W latina maiuscola con accento circonflesso","Latin capital letter y with circumflex":"Lettera Y latina maiuscola con accento circonflesso","Latin capital letter y with diaeresis":"Lettera Y latina maiuscola con dieresi","Latin capital letter z with acute":"Lettera Z latina maiuscola con accento acuto","Latin capital letter z with caron":"Lettera Z latina maiuscola con pipa","Latin capital letter z with dot above":"Lettera Z latina maiuscola con punto sovrascritto","Latin capital ligature ij":"Legatura IJ latina maiuscola","Latin capital ligature oe":"Legatura OE latina maiuscola","Latin small letter a with breve":"Lettera A latina minuscola con breve","Latin small letter a with macron":"Lettera A latina minuscola con macron","Latin small letter a with ogonek":"Lettera A latina minuscola con codetta","Latin small letter c with acute":"Lettera C latina minuscola con accento acuto","Latin small letter c with caron":"Lettera C latina minuscola con pipa","Latin small letter c with circumflex":"Lettera C latina minuscola con accento circonflesso","Latin small letter c with dot above":"Lettera C latina minuscola con punto sovrascritto","Latin small letter d with caron":"Lettera D latina minuscola con pipa","Latin small letter d with stroke":"Lettera D latina minuscola con barra","Latin small letter dotless i":"Lettera I latina minuscola senza punto","Latin small letter e with breve":"Lettera E latina minuscola con accento breve","Latin small letter e with caron":"Lettera E latina minuscola con pipa","Latin small letter e with dot above":"Lettera E latina minuscola con punto sovrascritto","Latin small letter e with macron":"Lettera E latina minuscola con macron","Latin small letter e with ogonek":"Lettera E latina minuscola con codetta","Latin small letter eng":"Nasale velare minuscola","Latin small letter f with hook":"Lettera f latina minuscola con gancio","Latin small letter g with breve":"Lettera G latina minuscola con breve","Latin small letter g with cedilla":"Lettera G latina minuscola con cediglia","Latin small letter g with circumflex":"Lettera G latina minuscola con accento circonflesso","Latin small letter g with dot above":"Lettera G latina minuscola con punto sovrascritto","Latin small letter h with circumflex":"Lettera H latina minuscola con accento circonflesso","Latin small letter h with stroke":"Lettera H latina minuscola con barra","Latin small letter i with breve":"Lettera I latina minuscola con breve","Latin small letter i with macron":"Lettera I latina minuscola con macron","Latin small letter i with ogonek":"Lettera I latina minuscola con codetta","Latin small letter i with tilde":"Lettera I latina minuscola con tilde","Latin small letter j with circumflex":"Lettera J latina minuscola con accento circonflesso","Latin small letter k with cedilla":"Lettera K latina minuscola con cediglia","Latin small letter kra":"Lettera Kra latina minuscola","Latin small letter l with acute":"Lettera L latina minuscola con accento acuto","Latin small letter l with caron":"Lettera L latina minuscola con pipa","Latin small letter l with cedilla":"Lettera L latina minuscola con cediglia","Latin small letter l with middle dot":"Lettera L latina minuscola con punto in mezzo","Latin small letter l with stroke":"Lettera L latina minuscola con barra","Latin small letter long s":"Lettera S latina lunga minuscola","Latin small letter n preceded by apostrophe":"Lettera N latina minuscola preceduta da apostrofo","Latin small letter n with acute":"Lettera N latina minuscola con accento acuto","Latin small letter n with caron":"Lettera N latina minuscola con pipa","Latin small letter n with cedilla":"Lettera N latina minuscola con cediglia","Latin small letter o with breve":"Lettera O latina minuscola con breve","Latin small letter o with double acute":"Lettera O latina minuscola con doppio accento acuto","Latin small letter o with macron":"Lettera O latina minuscola con macron","Latin small letter r with acute":"Lettera R latina minuscola con accento acuto","Latin small letter r with caron":"Lettera R latina minuscola con pipa","Latin small letter r with cedilla":"Lettera R latina minuscola con cediglia","Latin small letter s with acute":"Lettera S latina minuscola con accento acuto","Latin small letter s with caron":"Lettera S latina minuscola con pipa","Latin small letter s with cedilla":"Lettera S latina minuscola con cediglia","Latin small letter s with circumflex":"Lettera S latina minuscola con accento circonflesso","Latin small letter t with caron":"Lettera T latina minuscola con pipa","Latin small letter t with cedilla":"Lettera T latina minuscola con cediglia","Latin small letter t with stroke":"Lettera T latina minuscola con barra","Latin small letter u with breve":"Lettera U latina minuscola con breve","Latin small letter u with double acute":"Lettera U latina minuscola con doppio accento acuto","Latin small letter u with macron":"Lettera U latina minuscola con macron","Latin small letter u with ogonek":"Lettera U latina minuscola con codetta","Latin small letter u with ring above":"Lettera U latina minuscola con cerchio in alto","Latin small letter u with tilde":"Lettera U latina minuscola con tilde","Latin small letter w with circumflex":"Lettera W latina minuscola con accento circonflesso","Latin small letter y with circumflex":"Lettera Y latina minuscola con accento circonflesso","Latin small letter z with acute":"Lettera Z latina minuscola con accento acuto","Latin small letter z with caron":"Lettera Z latina minuscola con pipa","Latin small letter z with dot above":"Lettera Z latina minuscola con punto sovrascritto","Latin small ligature ij":"Legatura IJ latina minuscola","Latin small ligature oe":"Legatura OE latina minuscola","Left double quotation mark":"Doppie virgolette a sinistra","Left single quotation mark":"Virgoletta a sinistra","Left-pointing double angle quotation mark":"Virgolette doppie angolari a sinistra","leftwards arrow to bar":"Freccia verso barra a sinistra","leftwards dashed arrow":"Freccia tratteggiata verso sinistra","leftwards double arrow":"Freccia doppia verso sinistra","Less-than or equal to":"Minore o uguale a","Less-than sign":"Simbolo minore di","Lira sign":"Simbolo lira","Livre tournois sign":"Simbolo livre tournois","Logical and":"E logico","Logical or":"O logico",Macron:"Macron","Manat sign":"Simbolo manat","Mill sign":"Simbolo millesimo","Minus sign":"Segno di sottrazione","Multiplication sign":"Segno di moltiplicazione","N-ary product":"Prodotto ennesimo","N-ary summation":"Sommatoria",Nabla:"Nabla","Naira sign":"Simbolo naira","New sheqel sign":"Simbolo nuovo shekel","Nordic mark sign":"Simbolo marco nordico","Not an element of":"Non parte di","Not equal to":"Non uguale a","Not sign":"Simbolo Not","on with exclamation mark with left right arrow above":"on! con sopra freccia verso sinistra",Overline:"Linea alta","Paragraph sign":"Simbolo paragrafo","Partial differential":"Derivata parziale","Per mille sign":"Simbolo per mille","Per ten thousand sign":"Simbolo per diecimila","Peseta sign":"Simbolo peseta","Peso sign":"Simbolo peso","Plus-minus sign":"Segno più o meno","Pound sign":"Simbolo sterlina","Proportional to":"Proporzionale a","Question exclamation mark":"Punti interrogativo ed esclamativo","Registered sign":"Simbolo marchio registrato","Reversed paragraph sign":"Simbolo paragrafo invertito","Right double quotation mark":"Doppie virgolette a destra","Right single quotation mark":"Virgoletta a destra","Right-pointing double angle quotation mark":"Virgolette doppie angolari a destra","rightwards arrow to bar":"Freccia verso barra a destra","rightwards dashed arrow":"Freccia tratteggiata verso destra","rightwards double arrow":"Freccia doppia verso destra","Ruble sign":"Simbolo rublo","Rupee sign":"Simbolo rupia","Section sign":"Simbolo sezione","Single left-pointing angle quotation mark":"Virgoletta angolare a sinistra","Single low-9 quotation mark":"Virgoletta bassa","Single right-pointing angle quotation mark":"Virgoletta angolare a destra","soon with rightwards arrow above":"soon con sopra freccia verso destra","Special characters":"Caratteri speciali","Spesmilo sign":"Simbolo spesmilo","Square root":"Radice quadrata","Tenge sign":"Simbolo tenge","There exists":"Esiste","Tilde operator":"Operatore tilde","top with upwards arrow above":"top con sopra freccia verso l'alto","Trade mark sign":"Simbolo trademark","Tugrik sign":"Simbolo tugrik","Turkish lira sign":"Simbolo lira turca","Two dot leader":"Due punti iniziali",Union:"Unione","up down arrow with base":"Doppia freccia verticale con base","upwards arrow to bar":"Freccia verso barra in alto","upwards dashed arrow":"Freccia tratteggiata verso l'alto","upwards double arrow":"Freccia doppia verso l'alto","Vulgar fraction one half":"Frazione semplice un mezzo","Vulgar fraction one quarter":"Frazione semplice un quarto","Vulgar fraction three quarters":"Frazione semplice tre quarti","Won sign":"Simbolo won","Yen sign":"Simbolo yen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const r=o.it=o.it||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 di %1",Aquamarine:"Aquamarina",Black:"Nero",Blue:"Blu",Cancel:"Annulla","Dim grey":"Grigio tenue","Dropdown toolbar":"Barra degli strumenti del menu a discesa","Edit block":"Modifica blocco","Editor toolbar":"Barra degli strumenti dell'editor",Green:"Verde",Grey:"Grigio","Insert paragraph after block":"Inserisci paragrafo dopo blocco","Insert paragraph before block":"Inserisci paragrafo prima di blocco","Light blue":"Azzurro","Light green":"Verde chiaro","Light grey":"Grigio chiaro",Next:"Avanti",Orange:"Arancio",Previous:"Indietro",Purple:"Porpora",Red:"Rosso",Redo:"Ripristina","Remove color":"Rimuovi colore","Restore default":"Ripristina predefinito","Rich Text Editor":"Editor di testo formattato","Rich Text Editor, %0":"Editor di testo formattato, %0",Save:"Salva","Select all":"Seleziona tutto","Show more items":"Mostra più elementi",Turquoise:"Turchese",Undo:"Annulla","Upload in progress":"Caricamento in corso",White:"Bianco","Widget toolbar":"Barra degli strumenti del widget",Yellow:"Giallo"}),r.getPluralForm=function(o){return 1!=o}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/ja.js b/core/assets/vendor/ckeditor5/translations/ja.js
new file mode 100644
index 0000000000000000000000000000000000000000..1ff28067cc5bf29d19d59ef22a331b3d48d3198c
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/ja.js
@@ -0,0 +1 @@
+!function(n){const i=n.ja=n.ja||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"中央揃え","Align left":"左揃え","Align right":"右揃え",Justify:"両端揃え","Text alignment":"文字揃え","Text alignment toolbar":"テキストの整列"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ja=i.ja||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"ボールド",Code:"コード",Italic:"イタリック",Strikethrough:"取り消し線",Subscript:"下付き文字",Superscript:"上付き文字",Underline:"アンダーライン"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ja=i.ja||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"ブロッククオート(引用)"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.ja=n.ja||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"見出しを選択",Heading:"見出し","Heading 1":"見出し1","Heading 2":"見出し2","Heading 3":"見出し3 ","Heading 4":"見出し4","Heading 5":"見出し5","Heading 6":"見出し6",Paragraph:"段落","Type or paste your content here.":"コンテンツをここに入力または貼り付けしてください。","Type your title":"タイトルを入力"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ja=i.ja||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"区切り"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ja=e.ja||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"中央寄せ画像","Change image text alternative":"画像の代替テキストを変更","Enter image caption":"画像の注釈を入力","Full size image":"フルサイズ画像","Image resize list":"画像サイズリスト","Image toolbar":"画像","image widget":"画像ウィジェット","In line":"",Insert:"挿入","Insert image":"画像挿入","Insert image via URL":"画像URLを挿入","Left aligned image":"左寄せ画像",Original:"オリジナル","Resize image":"画像サイズ","Resize image to %0":"画像サイズを%0に変更","Resize image to the original size":"画像サイズを元のサイズに変更","Right aligned image":"右寄せ画像","Side image":"サイドイメージ","Text alternative":"代替テキスト",Update:"更新","Update image URL":"画像URLを更新","Upload failed":"アップロード失敗","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ja=n.ja||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"インデントの削除","Increase indent":"インデントの追加"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ja=n.ja||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"ダウンロード可能","Edit link":"リンクを編集",Link:"リンク","Link image":"リンク画像","Link URL":"リンクURL","Open in a new tab":"新しいタブで開く","Open link in new tab":"新しいタブでリンクを開く","This link has no URL":"リンクにURLが設定されていません",Unlink:"リンク解除"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ja=e.ja||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"箇条書きリスト","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"番号付きリスト","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ja=i.ja||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"フォーマットの削除"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ja=e.ja||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"列",Dashed:"","Delete column":"列を削除","Delete row":"行を削除",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"見出し列","Header row":"見出し行",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"上に行を挿入","Insert row below":"下に行を挿入","Insert table":"表の挿入",Inset:"","Justify cell text":"","Merge cell down":"下のセルと結合","Merge cell left":"左のセルと結合","Merge cell right":"右のセルと結合","Merge cell up":"上のセルと結合","Merge cells":"セルを結合",None:"",Outset:"",Padding:"",Ridge:"",Row:"行","Select column":"","Select row":"",Solid:"","Split cell horizontally":"縦にセルを分離","Split cell vertically":"横にセルを分離",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t.ja=t.ja||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"",Angle:"","Approximately equal to":"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"","Bitcoin sign":"","Cedi sign":"","Cent sign":"","Character categories":"","Colon sign":"","Contains as member":"","Copyright sign":"","Cruzeiro sign":"","Currency sign":"","Degree sign":"","Division sign":"","Dollar sign":"","Dong sign":"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","Drachma sign":"","Element of":"","Em dash":"","Empty set":"","En dash":"","end with leftwards arrow above":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","For all":"","Fraction slash":"","French franc sign":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"","Guarani sign":"","Horizontal ellipsis":"","Hryvnia sign":"","Identical to":"","Indian rupee sign":"",Infinity:"",Integral:"",Intersection:"","Inverted exclamation mark":"","Inverted question mark":"","Kip sign":"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin capital letter c with caron":"","Latin capital letter c with circumflex":"","Latin capital letter c with dot above":"","Latin capital letter d with caron":"","Latin capital letter d with stroke":"","Latin capital letter e with breve":"","Latin capital letter e with caron":"","Latin capital letter e with dot above":"","Latin capital letter e with macron":"","Latin capital letter e with ogonek":"","Latin capital letter eng":"","Latin capital letter g with breve":"","Latin capital letter g with cedilla":"","Latin capital letter g with circumflex":"","Latin capital letter g with dot above":"","Latin capital letter h with circumflex":"","Latin capital letter h with stroke":"","Latin capital letter i with breve":"","Latin capital letter i with dot above":"","Latin capital letter i with macron":"","Latin capital letter i with ogonek":"","Latin capital letter i with tilde":"","Latin capital letter j with circumflex":"","Latin capital letter k with cedilla":"","Latin capital letter l with acute":"","Latin capital letter l with caron":"","Latin capital letter l with cedilla":"","Latin capital letter l with middle dot":"","Latin capital letter l with stroke":"","Latin capital letter n with acute":"","Latin capital letter n with caron":"","Latin capital letter n with cedilla":"","Latin capital letter o with breve":"","Latin capital letter o with double acute":"","Latin capital letter o with macron":"","Latin capital letter r with acute":"","Latin capital letter r with caron":"","Latin capital letter r with cedilla":"","Latin capital letter s with acute":"","Latin capital letter s with caron":"","Latin capital letter s with cedilla":"","Latin capital letter s with circumflex":"","Latin capital letter t with caron":"","Latin capital letter t with cedilla":"","Latin capital letter t with stroke":"","Latin capital letter u with breve":"","Latin capital letter u with double acute":"","Latin capital letter u with macron":"","Latin capital letter u with ogonek":"","Latin capital letter u with ring above":"","Latin capital letter u with tilde":"","Latin capital letter w with circumflex":"","Latin capital letter y with circumflex":"","Latin capital letter y with diaeresis":"","Latin capital letter z with acute":"","Latin capital letter z with caron":"","Latin capital letter z with dot above":"","Latin capital ligature ij":"","Latin capital ligature oe":"","Latin small letter a with breve":"","Latin small letter a with macron":"","Latin small letter a with ogonek":"","Latin small letter c with acute":"","Latin small letter c with caron":"","Latin small letter c with circumflex":"","Latin small letter c with dot above":"","Latin small letter d with caron":"","Latin small letter d with stroke":"","Latin small letter dotless i":"","Latin small letter e with breve":"","Latin small letter e with caron":"","Latin small letter e with dot above":"","Latin small letter e with macron":"","Latin small letter e with ogonek":"","Latin small letter eng":"","Latin small letter f with hook":"","Latin small letter g with breve":"","Latin small letter g with cedilla":"","Latin small letter g with circumflex":"","Latin small letter g with dot above":"","Latin small letter h with circumflex":"","Latin small letter h with stroke":"","Latin small letter i with breve":"","Latin small letter i with macron":"","Latin small letter i with ogonek":"","Latin small letter i with tilde":"","Latin small letter j with circumflex":"","Latin small letter k with cedilla":"","Latin small letter kra":"","Latin small letter l with acute":"","Latin small letter l with caron":"","Latin small letter l with cedilla":"","Latin small letter l with middle dot":"","Latin small letter l with stroke":"","Latin small letter long s":"","Latin small letter n preceded by apostrophe":"","Latin small letter n with acute":"","Latin small letter n with caron":"","Latin small letter n with cedilla":"","Latin small letter o with breve":"","Latin small letter o with double acute":"","Latin small letter o with macron":"","Latin small letter r with acute":"","Latin small letter r with caron":"","Latin small letter r with cedilla":"","Latin small letter s with acute":"","Latin small letter s with caron":"","Latin small letter s with cedilla":"","Latin small letter s with circumflex":"","Latin small letter t with caron":"","Latin small letter t with cedilla":"","Latin small letter t with stroke":"","Latin small letter u with breve":"","Latin small letter u with double acute":"","Latin small letter u with macron":"","Latin small letter u with ogonek":"","Latin small letter u with ring above":"","Latin small letter u with tilde":"","Latin small letter w with circumflex":"","Latin small letter y with circumflex":"","Latin small letter z with acute":"","Latin small letter z with caron":"","Latin small letter z with dot above":"","Latin small ligature ij":"","Latin small ligature oe":"","Left double quotation mark":"","Left single quotation mark":"","Left-pointing double angle quotation mark":"","leftwards arrow to bar":"","leftwards dashed arrow":"","leftwards double arrow":"","Less-than or equal to":"","Less-than sign":"","Lira sign":"","Livre tournois sign":"","Logical and":"","Logical or":"",Macron:"","Manat sign":"","Mill sign":"","Minus sign":"","Multiplication sign":"","N-ary product":"","N-ary summation":"",Nabla:"","Naira sign":"","New sheqel sign":"","Nordic mark sign":"","Not an element of":"","Not equal to":"","Not sign":"","on with exclamation mark with left right arrow above":"",Overline:"","Paragraph sign":"","Partial differential":"","Per mille sign":"","Per ten thousand sign":"","Peseta sign":"","Peso sign":"","Plus-minus sign":"","Pound sign":"","Proportional to":"","Question exclamation mark":"","Registered sign":"","Reversed paragraph sign":"","Right double quotation mark":"","Right single quotation mark":"","Right-pointing double angle quotation mark":"","rightwards arrow to bar":"","rightwards dashed arrow":"","rightwards double arrow":"","Ruble sign":"","Rupee sign":"","Section sign":"","Single left-pointing angle quotation mark":"","Single low-9 quotation mark":"","Single right-pointing angle quotation mark":"","soon with rightwards arrow above":"","Special characters":"特殊文字","Spesmilo sign":"","Square root":"","Tenge sign":"","There exists":"","Tilde operator":"","top with upwards arrow above":"","Trade mark sign":"","Tugrik sign":"","Turkish lira sign":"","Two dot leader":"",Union:"","up down arrow with base":"","upwards arrow to bar":"","upwards dashed arrow":"","upwards double arrow":"","Vulgar fraction one half":"","Vulgar fraction one quarter":"","Vulgar fraction three quarters":"","Won sign":"","Yen sign":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.ja=e.ja||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"薄い青緑",Black:"黒",Blue:"青",Cancel:"キャンセル","Dim grey":"暗い灰色","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"緑",Grey:"灰色","Insert paragraph after block":"ブロックの後にパラグラフを挿入","Insert paragraph before block":"ブロックの前にパラグラフを挿入","Light blue":"明るい青","Light green":"明るい緑","Light grey":"明るい灰色",Next:"",Orange:"オレンジ",Previous:"",Purple:"紫",Red:"赤",Redo:"やり直し","Remove color":"カラーを削除","Restore default":"","Rich Text Editor":"リッチテキストエディター","Rich Text Editor, %0":"リッチテキストエディター, %0",Save:"保存","Select all":"すべて選択","Show more items":"",Turquoise:"水色",Undo:"元に戻す","Upload in progress":"アップロード中",White:"白","Widget toolbar":"ウィジェットツールバー",Yellow:"黄"}),o.getPluralForm=function(e){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/kk.js b/core/assets/vendor/ckeditor5/translations/kk.js
new file mode 100644
index 0000000000000000000000000000000000000000..0bcf7db44bd48c06a15b924f6c1f3c5698a71fc1
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/kk.js
@@ -0,0 +1 @@
+!function(n){const i=n.kk=n.kk||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Ортадан туралау","Align left":"Солға туралау","Align right":"Оңға туралау",Justify:"","Text alignment":"Мәтінді туралау","Text alignment toolbar":"Мәтінді туралау құралдар тақтасы"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/km.js b/core/assets/vendor/ckeditor5/translations/km.js
new file mode 100644
index 0000000000000000000000000000000000000000..5ef6ffe10517fa5af8c76c84c0f7ad05cc7e886d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/km.js
@@ -0,0 +1 @@
+!function(n){const i=n.km=n.km||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"តម្រឹម​កណ្ដាល","Align left":"តម្រឹម​ឆ្វេង","Align right":"តម្រឹម​ស្ដាំ",Justify:"តម្រឹម​សងខាង","Text alignment":"ការ​តម្រឹម​អក្សរ","Text alignment toolbar":"របារ​ឧបករណ៍​តម្រឹម​អក្សរ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.km=i.km||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"ដិត",Code:"កូដ",Italic:"ទ្រេត",Strikethrough:"ឆូតកណ្ដាល",Subscript:"អក្សរ​តូចក្រោម",Superscript:"អក្សរ​តូចលើ",Underline:"គូស​បន្ទាត់​ក្រោម"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.km=i.km||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"ប្លុក​ពាក្យ​សម្រង់"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.km=n.km||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"ជ្រើសរើស​ក្បាលអត្ថបទ",Heading:"ក្បាលអត្ថបទ","Heading 1":"ក្បាលអត្ថបទ 1","Heading 2":"ក្បាលអត្ថបទ 2","Heading 3":"ក្បាលអត្ថបទ 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"កថាខណ្ឌ","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.km=e.km||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"","Enter image caption":"បញ្ចូល​ពាក្យ​ពណ៌នា​រូបភាព","Full size image":"រូបភាព​ពេញ​ទំហំ","Image resize list":"","Image toolbar":"","image widget":"វិដជិត​រូបភាព","In line":"",Insert:"","Insert image":"បញ្ចូល​រូបភាព","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"រូបភាព​នៅ​ខាង","Text alternative":"",Update:"","Update image URL":"","Upload failed":"អាប់ឡូត​មិនបាន","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.km=n.km||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"",Link:"តំណ","Link image":"","Link URL":"URL តំណ","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"ផ្ដាច់​តំណ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.km=e.km||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"បញ្ជី​ជា​ចំណុច","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"បញ្ជី​ជា​លេខ","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.km=e.km||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"បោះបង់","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"ធ្វើ​វិញ","Remove color":"","Restore default":"","Rich Text Editor":"កម្មវិធី​កែសម្រួល​អត្ថបទ​សម្បូរបែប","Rich Text Editor, %0":"កម្មវិធី​កែសម្រួល​អត្ថបទ​សម្បូរបែប, %0",Save:"រក្សាទុ","Show more items":"",Turquoise:"",Undo:"លែង​ធ្វើ​វិញ",White:"",Yellow:""}),o.getPluralForm=function(e){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/kn.js b/core/assets/vendor/ckeditor5/translations/kn.js
new file mode 100644
index 0000000000000000000000000000000000000000..4af863edc30f7eddb3ebdc27e772affa31742730
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/kn.js
@@ -0,0 +1 @@
+!function(i){const n=i.kn=i.kn||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"‍‍ದಪ್ಪ",Code:"",Italic:"‍ಇಟಾಲಿಕ್",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.kn=n.kn||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"‍‍‍‍ಗುರುತಿಸಲಾದ ‍‍ಉಲ್ಲೇಖ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.kn=n.kn||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"ಶೀರ್ಷಿಕೆ ಆಯ್ಕೆಮಾಡು",Heading:"ಶೀರ್ಷಿಕೆ","Heading 1":"ಶೀರ್ಷಿಕೆ 1","Heading 2":"ಶೀರ್ಷಿಕೆ 2","Heading 3":"ಶೀರ್ಷಿಕೆ 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"ಪ್ಯಾರಾಗ್ರಾಫ್","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.kn=e.kn||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"‍ಚಿತ್ರದ ಬದಲಿ ಪಠ್ಯ ಬದಲಾಯಿಸು","Enter image caption":"‍ಚಿತ್ರದ ಶೀರ್ಷಿಕೆ ಸೇರಿಸು","Full size image":"‍ಪೂರ್ಣ ‍‍ಅಳತೆಯ ಚಿತ್ರ","Image resize list":"","Image toolbar":"","image widget":"‍ಚಿತ್ರ ವಿಜೆಟ್","In line":"",Insert:"","Insert image":"","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"‍ಪಕ್ಕದ ಚಿತ್ರ","Text alternative":"‍ಪಠ್ಯದ ಬದಲಿ",Update:"","Update image URL":"","Upload failed":"","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.kn=n.kn||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"",Link:"‍ಕೊಂಡಿ","Link image":"","Link URL":"‍ಕೊಂಡಿ ಸಂಪರ್ಕಿಸು","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"‍ಕೊಂಡಿ ತೆಗೆ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.kn=e.kn||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"‍‍ಬುಲೆಟ್ ಪಟ್ಟಿ","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"‍ಸಂಖ್ಯೆಯ ಪಟ್ಟಿ‍","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.kn=e.kn||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"ರದ್ದುಮಾಡು","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"‍ಮತ್ತೆ ಮಾಡು","Remove color":"","Restore default":"","Rich Text Editor":"‍ಸಮೃದ್ಧ ಪಠ್ಯ ಸಂಪಾದಕ‍‍","Rich Text Editor, %0":"‍ಸಮೃದ್ಧ ಪಠ್ಯ ಸಂಪಾದಕ‍, %0",Save:"ಉಳಿಸು","Show more items":"",Turquoise:"",Undo:"‍‍ರದ್ದು",White:"",Yellow:""}),o.getPluralForm=function(e){return e>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/ko.js b/core/assets/vendor/ckeditor5/translations/ko.js
new file mode 100644
index 0000000000000000000000000000000000000000..dab245730572c882d67d0d1448143ad10d0a2b8e
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/ko.js
@@ -0,0 +1 @@
+!function(n){const i=n.ko=n.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"가운데 정렬","Align left":"왼쪽 정렬","Align right":"오른쪽 정렬",Justify:"양쪽 정렬","Text alignment":"텍스트 정렬","Text alignment toolbar":"텍스트 정렬 툴바"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.ko=i.ko||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"굵게",Code:"코드",Italic:"기울임꼴",Strikethrough:"취소선",Subscript:"아래 첨자",Superscript:"위 첨자",Underline:"밑줄"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.ko=o.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"인용 단락"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ko=n.ko||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"제목 선택",Heading:"제목","Heading 1":"제목 1","Heading 2":"제목 2","Heading 3":"제목 3","Heading 4":"제목 4","Heading 5":"제목 5","Heading 6":"제목 6",Paragraph:"문단","Type or paste your content here.":"여기에 내용을 입력하거나 붙여넣기 하세요.","Type your title":"제목을 입력해주세요"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ko=i.ko||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"수평선"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ko=e.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"가운데 정렬","Change image text alternative":"대체 문구 변경","Enter image caption":"사진 설명을 입력하세요","Full size image":"꽉 찬 크기","Image resize list":"사진 크기 목록","Image toolbar":"사진 툴바","image widget":"사진 위젯","In line":"",Insert:"","Insert image":"사진 삽입","Insert image via URL":"","Left aligned image":"왼쪽 정렬",Original:"원본","Resize image":"사진 크기 조절","Resize image to %0":"사진의 크기를 %0으로 조절","Resize image to the original size":"사진을 원래 크기로 돌려놓기","Right aligned image":"오른쪽 정렬","Side image":"본문 옆에 배치","Text alternative":"대체 문구",Update:"","Update image URL":"","Upload failed":"업로드 실패","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ko=n.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"들여쓰기 줄이기","Increase indent":"들여쓰기 늘리기"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ko=n.ko||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"다운로드 가능","Edit link":"링크 편집",Link:"링크","Link image":"사진 링크","Link URL":"링크 주소","Open in a new tab":"새 탭에서 열기","Open link in new tab":"새 탭에서 링크 열기","This link has no URL":"이 링크에는 URL이 없습니다.",Unlink:"링크 삭제"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ko=e.ko||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"불릿 목록","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"번호 목록","Numbered list styles toolbar":"",Square:"","To-do List":"확인 목록","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.ko=o.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"서식 지우기"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ko=e.ko||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"",Dashed:"","Delete column":"","Delete row":"",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"","Header row":"",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"","Insert row below":"","Insert table":"테이블 삽입",Inset:"","Justify cell text":"","Merge cell down":"","Merge cell left":"","Merge cell right":"","Merge cell up":"","Merge cells":"",None:"",Outset:"",Padding:"",Ridge:"",Row:"","Select column":"","Select row":"",Solid:"","Split cell horizontally":"","Split cell vertically":"",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t.ko=t.ko||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"",Angle:"","Approximately equal to":"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"","Bitcoin sign":"","Cedi sign":"","Cent sign":"","Character categories":"","Colon sign":"","Contains as member":"","Copyright sign":"","Cruzeiro sign":"","Currency sign":"","Degree sign":"","Division sign":"","Dollar sign":"","Dong sign":"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","Drachma sign":"","Element of":"","Em dash":"","Empty set":"","En dash":"","end with leftwards arrow above":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","For all":"","Fraction slash":"","French franc sign":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"","Guarani sign":"","Horizontal ellipsis":"","Hryvnia sign":"","Identical to":"","Indian rupee sign":"",Infinity:"",Integral:"",Intersection:"","Inverted exclamation mark":"","Inverted question mark":"","Kip sign":"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin capital letter c with caron":"","Latin capital letter c with circumflex":"","Latin capital letter c with dot above":"","Latin capital letter d with caron":"","Latin capital letter d with stroke":"","Latin capital letter e with breve":"","Latin capital letter e with caron":"","Latin capital letter e with dot above":"","Latin capital letter e with macron":"","Latin capital letter e with ogonek":"","Latin capital letter eng":"","Latin capital letter g with breve":"","Latin capital letter g with cedilla":"","Latin capital letter g with circumflex":"","Latin capital letter g with dot above":"","Latin capital letter h with circumflex":"","Latin capital letter h with stroke":"","Latin capital letter i with breve":"","Latin capital letter i with dot above":"","Latin capital letter i with macron":"","Latin capital letter i with ogonek":"","Latin capital letter i with tilde":"","Latin capital letter j with circumflex":"","Latin capital letter k with cedilla":"","Latin capital letter l with acute":"","Latin capital letter l with caron":"","Latin capital letter l with cedilla":"","Latin capital letter l with middle dot":"","Latin capital letter l with stroke":"","Latin capital letter n with acute":"","Latin capital letter n with caron":"","Latin capital letter n with cedilla":"","Latin capital letter o with breve":"","Latin capital letter o with double acute":"","Latin capital letter o with macron":"","Latin capital letter r with acute":"","Latin capital letter r with caron":"","Latin capital letter r with cedilla":"","Latin capital letter s with acute":"","Latin capital letter s with caron":"","Latin capital letter s with cedilla":"","Latin capital letter s with circumflex":"","Latin capital letter t with caron":"","Latin capital letter t with cedilla":"","Latin capital letter t with stroke":"","Latin capital letter u with breve":"","Latin capital letter u with double acute":"","Latin capital letter u with macron":"","Latin capital letter u with ogonek":"","Latin capital letter u with ring above":"","Latin capital letter u with tilde":"","Latin capital letter w with circumflex":"","Latin capital letter y with circumflex":"","Latin capital letter y with diaeresis":"","Latin capital letter z with acute":"","Latin capital letter z with caron":"","Latin capital letter z with dot above":"","Latin capital ligature ij":"","Latin capital ligature oe":"","Latin small letter a with breve":"","Latin small letter a with macron":"","Latin small letter a with ogonek":"","Latin small letter c with acute":"","Latin small letter c with caron":"","Latin small letter c with circumflex":"","Latin small letter c with dot above":"","Latin small letter d with caron":"","Latin small letter d with stroke":"","Latin small letter dotless i":"","Latin small letter e with breve":"","Latin small letter e with caron":"","Latin small letter e with dot above":"","Latin small letter e with macron":"","Latin small letter e with ogonek":"","Latin small letter eng":"","Latin small letter f with hook":"","Latin small letter g with breve":"","Latin small letter g with cedilla":"","Latin small letter g with circumflex":"","Latin small letter g with dot above":"","Latin small letter h with circumflex":"","Latin small letter h with stroke":"","Latin small letter i with breve":"","Latin small letter i with macron":"","Latin small letter i with ogonek":"","Latin small letter i with tilde":"","Latin small letter j with circumflex":"","Latin small letter k with cedilla":"","Latin small letter kra":"","Latin small letter l with acute":"","Latin small letter l with caron":"","Latin small letter l with cedilla":"","Latin small letter l with middle dot":"","Latin small letter l with stroke":"","Latin small letter long s":"","Latin small letter n preceded by apostrophe":"","Latin small letter n with acute":"","Latin small letter n with caron":"","Latin small letter n with cedilla":"","Latin small letter o with breve":"","Latin small letter o with double acute":"","Latin small letter o with macron":"","Latin small letter r with acute":"","Latin small letter r with caron":"","Latin small letter r with cedilla":"","Latin small letter s with acute":"","Latin small letter s with caron":"","Latin small letter s with cedilla":"","Latin small letter s with circumflex":"","Latin small letter t with caron":"","Latin small letter t with cedilla":"","Latin small letter t with stroke":"","Latin small letter u with breve":"","Latin small letter u with double acute":"","Latin small letter u with macron":"","Latin small letter u with ogonek":"","Latin small letter u with ring above":"","Latin small letter u with tilde":"","Latin small letter w with circumflex":"","Latin small letter y with circumflex":"","Latin small letter z with acute":"","Latin small letter z with caron":"","Latin small letter z with dot above":"","Latin small ligature ij":"","Latin small ligature oe":"","Left double quotation mark":"","Left single quotation mark":"","Left-pointing double angle quotation mark":"","leftwards arrow to bar":"","leftwards dashed arrow":"","leftwards double arrow":"","Less-than or equal to":"","Less-than sign":"","Lira sign":"","Livre tournois sign":"","Logical and":"","Logical or":"",Macron:"","Manat sign":"","Mill sign":"","Minus sign":"","Multiplication sign":"","N-ary product":"","N-ary summation":"",Nabla:"","Naira sign":"","New sheqel sign":"","Nordic mark sign":"","Not an element of":"","Not equal to":"","Not sign":"","on with exclamation mark with left right arrow above":"",Overline:"","Paragraph sign":"","Partial differential":"","Per mille sign":"","Per ten thousand sign":"","Peseta sign":"","Peso sign":"","Plus-minus sign":"","Pound sign":"","Proportional to":"","Question exclamation mark":"","Registered sign":"","Reversed paragraph sign":"","Right double quotation mark":"","Right single quotation mark":"","Right-pointing double angle quotation mark":"","rightwards arrow to bar":"","rightwards dashed arrow":"","rightwards double arrow":"","Ruble sign":"","Rupee sign":"","Section sign":"","Single left-pointing angle quotation mark":"","Single low-9 quotation mark":"","Single right-pointing angle quotation mark":"","soon with rightwards arrow above":"","Special characters":"특수 문자","Spesmilo sign":"","Square root":"","Tenge sign":"","There exists":"","Tilde operator":"","top with upwards arrow above":"","Trade mark sign":"","Tugrik sign":"","Turkish lira sign":"","Two dot leader":"",Union:"","up down arrow with base":"","upwards arrow to bar":"","upwards dashed arrow":"","upwards double arrow":"","Vulgar fraction one half":"","Vulgar fraction one quarter":"","Vulgar fraction three quarters":"","Won sign":"","Yen sign":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.ko=e.ko||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"0% / %1",Aquamarine:"연한 청록색",Black:"검은색",Blue:"파랑색",Cancel:"취소","Dim grey":"진한 회색","Dropdown toolbar":"드롭다운 툴바","Edit block":"편집 영역","Editor toolbar":"에디터 툴바",Green:"초록색",Grey:"회색","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"연한 파랑색","Light green":"밝은 초록색","Light grey":"밝은 회색",Next:"다음",Orange:"주황색",Previous:"이전",Purple:"보라색",Red:"빨간색",Redo:"다시 실행","Remove color":"색깔 제거","Restore default":"","Rich Text Editor":"리치 텍스트 편집기","Rich Text Editor, %0":"리치 텍스트 편집기, %0",Save:"저장","Select all":"전체 선택","Show more items":"더보기",Turquoise:"청록색",Undo:"실행 취소","Upload in progress":"업로드 진행 중",White:"흰색","Widget toolbar":"위젯 툴바",Yellow:"노랑색"}),o.getPluralForm=function(e){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/ku.js b/core/assets/vendor/ckeditor5/translations/ku.js
new file mode 100644
index 0000000000000000000000000000000000000000..1a40202c83e9f85303a8237645797e09c07a29fc
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/ku.js
@@ -0,0 +1 @@
+!function(n){const i=n.ku=n.ku||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"بەهێڵکردنی ناورەڕاست","Align left":"بەهێڵکردنی چەپ","Align right":"بەهێڵکردنی ڕاست",Justify:"هاوستوونی","Text alignment":"ڕیززکردنی تێکست","Text alignment toolbar":"تووڵامرازی ڕیززکردنی تێکست"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ku=i.ku||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"قەڵەو",Code:"کۆد",Italic:"لار",Strikethrough:"هێڵ بەسەرداهاتوو",Subscript:"ژێرنووس",Superscript:"سەرنووس",Underline:"ژێرهێڵ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ku=i.ku||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"وتەی وەرگیراو"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ku=n.ku||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"سەرنووسە هەڵبژێرە",Heading:"سەرنووسە","Heading 1":"سەرنووسەی 1","Heading 2":"سەرنووسەی 2","Heading 3":"سەرنووسەی 3","Heading 4":"سەرنووسەی 4","Heading 5":"سەرنووسەی 5","Heading 6":"سەرنووسەی 6",Paragraph:"پەراگراف","Type or paste your content here.":"بنووسە یاخوود ناوەڕۆکی کۆپیکراو لیڕە بلکێنە","Type your title":"نوسینی ناونیشان"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ku=i.ku||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"هێڵی ئاسۆیی"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ku=e.ku||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"ناوەڕاستکراوی وێنە","Change image text alternative":"گۆڕینی جێگروەی تێکیسی وێنە","Enter image caption":"سەردێڕی وێنە دابنێ","Full size image":"پڕ بەقەبارەی وێنە","Image resize list":"","Image toolbar":"تووڵامرازی وێنە","image widget":"وێدجیتی وێنە","In line":"",Insert:"","Insert image":"وێنە دابنێ","Insert image via URL":"","Left aligned image":"ڕیزکردنی وێنە بۆ لای چەپ",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"ڕیزکردنی وێنە بۆ لای ڕاست","Side image":"لای وێنە","Text alternative":"جێگرەوەی تێکست",Update:"","Update image URL":"","Upload failed":"بارکردنەکە سەرنەکەووت","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ku=n.ku||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"کەمکردنەوەی بۆشایی","Increase indent":"زیادکردنی بۆشایی"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ku=n.ku||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Downloadable","Edit link":"دەستکاری بەستەر",Link:"بەستەر","Link image":"","Link URL":"ناونیشانی بەستەر","Open in a new tab":"کردنەوەی لە پەنجەرەیەکی نوێ","Open link in new tab":"کردنەوەی بەستەرەکە لە پەڕەیەکی نوێ","This link has no URL":"ئەم بەستەرە ناونیشانی نیە",Unlink:"لابردنی بەستەر"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ku=e.ku||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"لیستەی خاڵەیی","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"لیستەی ژمارەیی","Numbered list styles toolbar":"",Square:"","To-do List":"لیستەی کردن","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ku=i.ku||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"لابردنی شێواز"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ku=e.ku||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"ستوون",Dashed:"","Delete column":"سڕینەوەی ستوون","Delete row":"سڕینەوەی ڕیز",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"ستوونی دەسپێک","Header row":"ڕیزی دەسپێک",Height:"","Horizontal text alignment toolbar":"","Insert column left":"دانانی ستوون لە چەپ","Insert column right":"دانانی ستوون لە ڕاست","Insert row above":"دانانی ڕیز لە سەرەوە","Insert row below":"دانانی ڕیز لە ژێرەوە","Insert table":"خشتە دابنێ",Inset:"","Justify cell text":"","Merge cell down":"تێکەڵکردنی خانەکان بەرەو ژێرەوە","Merge cell left":"تێکەڵکردنی خانەکان بەرەو چەپ","Merge cell right":"تێکەڵکردنی خانەکان بەرەو ڕاست","Merge cell up":"تێکەڵکردنی خانەکان بەرەو سەر","Merge cells":"تێکەڵکردنی خانەکان",None:"",Outset:"",Padding:"",Ridge:"",Row:"ڕیز","Select column":"","Select row":"",Solid:"","Split cell horizontally":"بەشکردنی خانەکان بە ئاسۆیی","Split cell vertically":"بەشکردنی خانەکان بە ئەستوونی",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"تووڵامرازی خشتە",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.ku=e.ku||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 لە %1",Aquamarine:"شینی دەریایی",Black:"ڕەش",Blue:"شین",Cancel:"هەڵوەشاندنەوە","Dim grey":"ڕەساسی تاریک","Dropdown toolbar":"تووڵامرازی لیستەیی","Edit block":"دەستکاری بلۆک","Editor toolbar":"تووڵامرازی دەسکاریکەر",Green:"سەوز",Grey:"ڕەساسی","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"شینی ڕووناک","Light green":"سەوزی ڕووناک","Light grey":"ڕەساسی ڕووناک",Next:"دواتر",Orange:"پرتەقاڵی",Previous:"پێشتر",Purple:"مۆر",Red:"سور",Redo:"هەلگەڕاندنەوە","Remove color":"لابردنی ڕەنگ","Restore default":"","Rich Text Editor":"سەرنوسەری دەقی بەپیت","Rich Text Editor, %0":"سەرنوسەری دەقی بەپیت, %0",Save:"پاشکەوتکردن","Show more items":"بڕگەی زیاتر نیشانبدە",Turquoise:"شینی ئاسمانی",Undo:"وەک خۆی لێ بکەوە","Upload in progress":"بارکردنەکە لە جێبەجێکردن دایە",White:"سپی","Widget toolbar":"تووڵامرازی ویدجێت",Yellow:"زەرد"}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/lt.js b/core/assets/vendor/ckeditor5/translations/lt.js
new file mode 100644
index 0000000000000000000000000000000000000000..4e31868fe8df7e507babbfe9d47592abcea63672
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/lt.js
@@ -0,0 +1 @@
+!function(i){const t=i.lt=i.lt||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Centruoti","Align left":"Lygiuoti į kairę","Align right":"Lygiuoti į dešinę",Justify:"Lygiuoti per visą plotį","Text alignment":"Teksto lygiavimas","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const a=i.lt=i.lt||{};a.dictionary=Object.assign(a.dictionary||{},{Bold:"Paryškintas",Code:"Kodas",Italic:"Kursyvas",Strikethrough:"Perbrauktas",Subscript:"Žemiau",Superscript:"Aukščiau",Underline:"Pabrauktas"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const i=t.lt=t.lt||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Citata"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const t=a.lt=a.lt||{};t.dictionary=Object.assign(t.dictionary||{},{"Choose heading":"Pasirinkite antraštę",Heading:"Antraštė","Heading 1":"Antraštė 1","Heading 2":"Antraštė 2","Heading 3":"Antraštė 3","Heading 4":"Antraštė 4","Heading 5":"Antraštė 5","Heading 6":"Antraštė 6",Paragraph:"Paragrafas","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.lt=e.lt||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Vaizdas centre","Change image text alternative":"Pakeisti vaizdo alternatyvųjį tekstą","Enter image caption":"Įveskite vaizdo antraštę","Full size image":"Pilno dydžio vaizdas","Image resize list":"","Image toolbar":"","image widget":"vaizdų valdiklis","In line":"",Insert:"","Insert image":"Įterpti vaizdą","Insert image via URL":"","Left aligned image":"Vaizdas kairėje",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Vaizdas dešinėje","Side image":"Vaizdas šone","Text alternative":"Alternatyvusis tekstas",Update:"","Update image URL":"","Upload failed":"Įkelti nepavyko","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.lt=i.lt||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Sumažinti atitraukimą","Increase indent":"Padidinti atitraukimą"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.lt=n.lt||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"Keisti nuorodą",Link:"Pridėti nuorodą","Link image":"","Link URL":"Nuorodos URL","Open in a new tab":"","Open link in new tab":"Atidaryti nuorodą naujame skirtuke","This link has no URL":"Ši nuorda neturi URL",Unlink:"Pašalinti nuorodą"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.lt=e.lt||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Sąrašas","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numeruotas rąrašas","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.lt=i.lt||{};t.dictionary=Object.assign(t.dictionary||{},{"Remove Format":"Naikinti formatavimą"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.lt=e.lt||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Stulpelis",Dashed:"","Delete column":"Ištrinti stulpelį","Delete row":"Ištrinti eilutę",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Antraštės stulpelis","Header row":"Antraštės eilutė",Height:"","Horizontal text alignment toolbar":"","Insert column left":"Įterpti stulpelį kairėje","Insert column right":"Įterpti stulpelį dešinėje","Insert row above":"Įterpti eilutę aukščiau","Insert row below":"Įterpti eilutę žemiau","Insert table":"Įterpti lentelę",Inset:"","Justify cell text":"","Merge cell down":"Prijungti langelį apačioje","Merge cell left":"Prijungti langelį kairėje","Merge cell right":"Prijungti langelį dešinėje","Merge cell up":"Prijungti langelį viršuje","Merge cells":"Sujungti langelius",None:"",Outset:"",Padding:"",Ridge:"",Row:"Eilutė","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Padalinti langelį horizontaliai","Split cell vertically":"Padalinti langelį vertikaliai",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.lt=i.lt||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"Aquamarine",Black:"Juoda",Blue:"Mėlyna",Cancel:"Atšaukti","Dim grey":"Pilkšva","Dropdown toolbar":"","Edit block":"Redaguoti bloką","Editor toolbar":"",Green:"Žalia",Grey:"Pilka","Light blue":"Šviesiai mėlyna","Light green":"Šviesiai žalia","Light grey":"Šviesiai pilka",Next:"",Orange:"Oranžinė",Previous:"",Purple:"Violetinė",Red:"Raudona",Redo:"Pirmyn","Remove color":"Pašalinti spalvą","Restore default":"","Rich Text Editor":"Raiškiojo teksto redaktorius","Rich Text Editor, %0":"Raiškiojo teksto redaktorius, %0",Save:"Išsaugoti","Show more items":"",Turquoise:"Turkio",Undo:"Atgal","Upload in progress":"Įkelima",White:"Balta",Yellow:"Geltona"}),o.getPluralForm=function(i){return i%10==1&&(i%100>19||i%100<11)?0:i%10>=2&&i%10<=9&&(i%100>19||i%100<11)?1:i%1!=0?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/lv.js b/core/assets/vendor/ckeditor5/translations/lv.js
new file mode 100644
index 0000000000000000000000000000000000000000..344d7527afe05b5e041e725fadb7a8e4876308f9
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/lv.js
@@ -0,0 +1 @@
+!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Centrēt","Align left":"Pa kreisi","Align right":"Pa labi",Justify:"Izlīdzināt abas malas","Text alignment":"Teksta izlīdzināšana","Text alignment toolbar":"Teksta līdzināšanas rīkjosla"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(s){const t=s.lv=s.lv||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Trekns",Code:"Kods",Italic:"Kursīvs",Strikethrough:"Nosvītrots",Subscript:"Apakšraksts",Superscript:"Augšraksts",Underline:"Pasvītrots"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citāts"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(s){const i=s.lv=s.lv||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Izvēlēties virsrakstu",Heading:"Virsraksts","Heading 1":"Virsraksts 1","Heading 2":"Virsraksts 2","Heading 3":"Virsraksts 3","Heading 4":"Virsraksts 4","Heading 5":"Virsraksts 5","Heading 6":"Virsraksts 6",Paragraph:"Pagrāfs","Type or paste your content here.":"Rakstiet vai ielīmējiet saturu šeit.","Type your title":"Ievadiet virsrakstu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Horizontāli atdalošā līnija"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const e=t.lv=t.lv||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"","Centered image":"Centrēts attēls","Change image text alternative":"Mainīt attēla alternatīvo tekstu","Enter image caption":"Ievadiet attēla parakstu","Full size image":"Pilna izmēra attēls","Image resize list":"","Image toolbar":"Attēlu rīkjosla","image widget":"attēla sīkrīks","In line":"",Insert:"","Insert image":"Ievietot attēlu","Insert image via URL":"","Left aligned image":"Pa kreisi līdzināts attēls",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Pa labi līdzināts attēls","Side image":"Sānā novietots attēls","Text alternative":"Alternatīvais teksts",Update:"","Update image URL":"","Upload failed":"Augšupielāde neizdevusies","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Samazināt atkāpi","Increase indent":"Palielināt atkāpi"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"Lejupielādējams","Edit link":"Labot Saiti",Link:"Saite","Link image":"","Link URL":"Saites URL","Open in a new tab":"Atvērt jaunā cilnē","Open link in new tab":"Atvērt saiti jaunā cilnē","This link has no URL":"Saitei nav norādīts URL",Unlink:"Noņemt Saiti"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.lv=e.lv||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Nenumurēts Saraksts","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numurēts Saraksts","Numbered list styles toolbar":"",Square:"","To-do List":"To-do Saraksts","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.lv=o.lv||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"Noņemt formatējumu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.lv=e.lv||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Kolonna",Dashed:"","Delete column":"Dzēst kolonnu","Delete row":"Dzēst rindu",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Šī kolonna ir galvene","Header row":"Šī rinda ir galvene",Height:"","Horizontal text alignment toolbar":"","Insert column left":"Ievietot kolonnu pa kreisi","Insert column right":"Ievietot kolonnu pa labi","Insert row above":"Ievietot rindu virs","Insert row below":"Ievietot rindu zem","Insert table":"Ievietot tabulu",Inset:"","Justify cell text":"","Merge cell down":"Apvienot šūnas uz leju","Merge cell left":"Apvienot šūnas pa kreisi","Merge cell right":"Apvienot šūnas pa labi","Merge cell up":"Apvienot šūnas uz augšu","Merge cells":"Apvienot šūnas",None:"",Outset:"",Padding:"",Ridge:"",Row:"Rinda","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Atdalīt šūnu horizontāli","Split cell vertically":"Atdalīt šūnu vertikāli",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"Tabulas rīkjosla",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.lv=e.lv||{};a.dictionary=Object.assign(a.dictionary||{},{"%0 of %1":"%0 no %1",Aquamarine:"Akvamarīns",Black:"Melns",Blue:"Zils",Cancel:"Atcelt","Dim grey":"Blāvi pelēks","Dropdown toolbar":"Papildus izvēlnes rīkjosla","Edit block":"Labot bloku","Editor toolbar":"Redaktora rīkjosla",Green:"Zaļš",Grey:"Pelēks","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Gaiši zils","Light green":"Gaiši zaļš","Light grey":"Gaiši pelēks",Next:"Nākamā",Orange:"Oranžs",Previous:"Iepriekšējā",Purple:"Violets",Red:"Sarkans",Redo:"Uz priekšu","Remove color":"Noņemt krāsu","Restore default":"","Rich Text Editor":"Bagātinātais Teksta Redaktors","Rich Text Editor, %0":"Bagātinātais Teksta Redaktors, %0",Save:"Saglabāt","Show more items":"Parādīt vairāk vienumus",Turquoise:"Tirkīza",Undo:"Atsaukt","Upload in progress":"Notiek augšupielāde",White:"Balts","Widget toolbar":"Sīkrīku rīkjosla",Yellow:"Dzeltens"}),a.getPluralForm=function(e){return e%10==1&&e%100!=11?0:0!=e?1:2}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/nb.js b/core/assets/vendor/ckeditor5/translations/nb.js
new file mode 100644
index 0000000000000000000000000000000000000000..575e55bfd0d82959df1a63f165e4956a4a8353a6
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/nb.js
@@ -0,0 +1 @@
+!function(t){const n=t.nb=t.nb||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Midstill","Align left":"Venstrejuster","Align right":"Høyrejuster",Justify:"Blokkjuster","Text alignment":"Tekstjustering","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nb=n.nb||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Fet",Code:"Kode",Italic:"Kursiv",Strikethrough:"Gjennomstreking",Subscript:"",Superscript:"",Underline:"Understreking"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nb=n.nb||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blokksitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.nb=e.nb||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Velg overskrift",Heading:"Overskrift","Heading 1":"Overskrift 1","Heading 2":"Overskrift 2","Heading 3":"Overskrift 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Avsnitt","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.nb=e.nb||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Midtstilt bilde","Change image text alternative":"Endre tekstalternativ for bilde","Enter image caption":"Skriv inn bildetekst","Full size image":"Bilde i full størrelse","Image resize list":"","Image toolbar":"","image widget":"Bilde-widget","In line":"",Insert:"","Insert image":"Sett inn bilde","Insert image via URL":"","Left aligned image":"Venstrejustert bilde",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Høyrejustert bilde","Side image":"Sidebilde","Text alternative":"Tekstalternativ for bilde",Update:"","Update image URL":"","Upload failed":"Opplasting feilet","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.nb=n.nb||{};e.dictionary=Object.assign(e.dictionary||{},{Downloadable:"","Edit link":"Rediger lenke",Link:"Lenke","Link image":"","Link URL":"URL for lenke","Open in a new tab":"","Open link in new tab":"Åpne lenke i ny fane","This link has no URL":"Denne lenken har ingen URL",Unlink:"Fjern lenke"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.nb=e.nb||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Punktmerket liste","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Nummerert liste","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.nb=e.nb||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Kolonne",Dashed:"","Delete column":"Slett kolonne","Delete row":"Slett rad",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Overskriftkolonne","Header row":"Overskriftrad",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"Sett inn rad over","Insert row below":"Sett inn rad under","Insert table":"Sett inn tabell",Inset:"","Justify cell text":"","Merge cell down":"Slå sammen celle ned","Merge cell left":"Slå sammen celle til venstre","Merge cell right":"Slå sammen celle til høyre","Merge cell up":"Slå sammen celle opp","Merge cells":"Slå sammen celler",None:"",Outset:"",Padding:"",Ridge:"",Row:"Rad","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Del celle horisontalt","Split cell vertically":"Del celle vertikalt",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.nb=e.nb||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Avbryt","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Gjør om","Remove color":"","Restore default":"","Rich Text Editor":"Rikteksteditor","Rich Text Editor, %0":"Rikteksteditor, %0",Save:"Lagre","Show more items":"",Turquoise:"",Undo:"Angre","Upload in progress":"Opplasting pågår",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/ne.js b/core/assets/vendor/ckeditor5/translations/ne.js
new file mode 100644
index 0000000000000000000000000000000000000000..03346b74b69d928eb9085daccdbd67705e0aa38a
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/ne.js
@@ -0,0 +1 @@
+!function(n){const i=n.ne=n.ne||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"केन्द्र पङ्क्तिबद्ध गर्नुहोस्","Align left":"बायाँ पङ्क्तिबद्ध गर्नुहोस्","Align right":"दायाँ पङ्क्तिबद्ध गर्नुहोस्",Justify:"जस्टिफाइ गर्नुहोस्","Text alignment":"पाठ संरेखण","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ne=i.ne||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"बोल्ड",Code:"कोड",Italic:"इटालिक",Strikethrough:"स्ट्राइकथ्रू",Subscript:"सबस्क्रिप्ट",Superscript:"सुपरस्क्रिप्ट",Underline:"रेखांकन"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ne=n.ne||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"ब्लक उद्धरण"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ne=n.ne||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"शीर्षक छनौट गर्नुहोस्",Heading:"शीर्षक","Heading 1":"शीर्षक-एक","Heading 2":"शीर्षक २","Heading 3":"शीर्षक ३","Heading 4":"शीर्षक ४","Heading 5":"शीर्षक ५","Heading 6":"शीर्षक ६",Paragraph:"अनुच्छेद","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ne=e.ne||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"केन्द्रित तस्वीर","Change image text alternative":"तस्वीर पाठ विकल्प परिवर्तन गर्नुहोस्","Enter image caption":"तस्वीर क्याप्शन प्रविष्ट गर्नुहोस्","Full size image":"पूर्ण आकार तस्वीर","Image resize list":"","Image toolbar":"","image widget":"तस्वीर विजेट","In line":"",Insert:"","Insert image":"तस्वीर सम्मिलित गर्नुहोस्","Insert image via URL":"","Left aligned image":"बायाँ पङ्क्ति तस्वीर",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"दायाँ पङ्क्तिबद्ध तस्वीर","Side image":"साइड तस्वीर","Text alternative":"पाठ विकल्प",Update:"","Update image URL":"","Upload failed":"अपलोड असफल भयो","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ne=n.ne||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"इन्डेन्ट घटाउन","Increase indent":"इन्डेन्ट बढाउन"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ne=n.ne||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"डाउनलोड योग्य","Edit link":"लिङ्क सम्पादन गर्नुहोस्",Link:"लिङ्क","Link image":"","Link URL":"लिङ्क यूआरएल","Open in a new tab":"नयाँ ट्याबमा खोल्न","Open link in new tab":"नयाँ ट्याबमा लिङ्क खोल्नुहोस्","This link has no URL":"यो लिङ्कसँग यूआरएल छैन",Unlink:"अनलिङ्क गर्नुहोस्"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ne=e.ne||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"गोली चिन्ह अङ्कित सूची","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"सूचीबद्ध सूची","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ne=n.ne||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"ढाँचा हटाउनुहोस्"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ne=e.ne||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"स्तम्भ",Dashed:"","Delete column":"स्तम्भ मेटाउनुहोस्","Delete row":"पङ्क्ति मेटाउनुहोस्",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"हेडर स्तम्भ","Header row":"हेडर पङ्क्ति",Height:"","Horizontal text alignment toolbar":"","Insert column left":"बायाँ स्तम्भ सम्मिलित गर्न","Insert column right":"दायाँ स्तम्भ सम्मिलित गर्न","Insert row above":"माथि पंक्ति सम्मिलित गर्नुहोस्","Insert row below":"तल पंक्ति सम्मिलित गर्नुहोस्","Insert table":"तालिका सम्मिलित गर्नुहोस्",Inset:"","Justify cell text":"","Merge cell down":"कक्ष तल मर्ज गर्नुहोस्","Merge cell left":"सेल बायाँ मर्ज गर्नुहोस्","Merge cell right":"दायाँ कक्ष मर्ज गर्नुहोस्","Merge cell up":"कक्ष माथि मर्ज गर्नुहोस्","Merge cells":"कक्ष मर्ज गर्नुहोस्",None:"",Outset:"",Padding:"",Ridge:"",Row:"पङ्क्ति","Select column":"","Select row":"",Solid:"","Split cell horizontally":"क्षैतिज कक्ष विभाजित गर्नुहोस्","Split cell vertically":"ठाडो कक्ष विभाजित गर्नुहोस्",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.ne=e.ne||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"०% मध्ये १%",Aquamarine:"अव्कवामरिन",Black:"कालो",Blue:"निलो",Cancel:"रद्द गर्नुहोस्","Dim grey":"धमिलो खैरो","Dropdown toolbar":"","Edit block":"ब्लक सम्पादन गर्न","Editor toolbar":"",Green:"हरियो",Grey:"खैरो","Light blue":"हल्का निलो","Light green":"हल्का हरियो","Light grey":"हल्का खैरो",Next:"अर्को",Orange:"सुन्तला रंग",Previous:"अघिल्लो",Purple:"बैंगनी रंग",Red:"रातो",Redo:"रिडु","Remove color":"रंग हटाउन","Restore default":"","Rich Text Editor":"धनी पाठ सम्पादक","Rich Text Editor, %0":"धनी पाठ सम्पादक, %0",Save:"सुरक्षित गर्नुहोस्","Show more items":"",Turquoise:"त्रकोइस",Undo:"पूर्ववत","Upload in progress":"अपलोड हुदैछ",White:"सेतो",Yellow:"पहेंलो"}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/nl.js b/core/assets/vendor/ckeditor5/translations/nl.js
new file mode 100644
index 0000000000000000000000000000000000000000..221a417e0b7f40e070504b4b2d1f0b3dfbb9d49b
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/nl.js
@@ -0,0 +1 @@
+!function(i){const n=i.nl=i.nl||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Midden uitlijnen","Align left":"Links uitlijnen","Align right":"Rechts uitlijnen",Justify:"Volledig uitlijnen","Text alignment":"Tekst uitlijning","Text alignment toolbar":"Tekst uitlijning werkbalk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.nl=i.nl||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Vet",Code:"Code",Italic:"Cursief",Strikethrough:"Doorhalen",Subscript:"Subscript",Superscript:"Superscript",Underline:"Onderlijnen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blok citaat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const n=o.nl=o.nl||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Kies kop",Heading:"Koppen","Heading 1":"Kop 1","Heading 2":"Kop 2","Heading 3":"Kop 3","Heading 4":"Kop 4","Heading 5":"Kop 5","Heading 6":"Kop 6",Paragraph:"Paragraaf","Type or paste your content here.":"Voer of plak uw inhoud in.","Type your title":"Voor uw titel in"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Horizontale lijn"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.nl=e.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Gecentreerde afbeelding","Change image text alternative":"Verander alt-tekst van de afbeelding","Enter image caption":"Typ een afbeeldingsbijschrift","Full size image":"Afbeelding op volledige grootte","Image resize list":"","Image toolbar":"Afbeeldingswerkbalk","image widget":"afbeeldingswidget","In line":"",Insert:"Invoegen","Insert image":"Afbeelding toevoegen","Insert image via URL":"","Left aligned image":"Links uitgelijnde afbeelding",Original:"Origineel","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Rechts uitgelijnde afbeelding","Side image":"Afbeelding naast tekst","Text alternative":"Alt-tekst",Update:"","Update image URL":"","Upload failed":"Uploaden afbeelding mislukt","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Minder inspringen","Increase indent":"Inspringen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const n=a.nl=a.nl||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Kies taal",Language:"Taal","Remove language":"Taal verwijderen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Downloadbaar","Edit link":"Bewerk link",Link:"Link","Link image":"Link afbeelding","Link URL":"Link URL","Open in a new tab":"Open een nieuw tabblad","Open link in new tab":"Open link in nieuw tabblad","This link has no URL":"Deze link heeft geen URL",Unlink:"Verwijder link"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.nl=e.nl||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Ongenummerde lijst","Bulleted list styles toolbar":"",Circle:"Cirkel",Decimal:"Decimaal","Decimal with leading zero":"",Disc:"Schijf","Lower-latin":"","Lower–roman":"","Numbered List":"Genummerde lijst","Numbered list styles toolbar":"",Square:"Vierkant","To-do List":"To-do lijst","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"Verwijder format"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{Source:"Bron"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.nl=e.nl||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"Tekst in de cel centreren","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"Uitlijning",Background:"Achtergrond",Border:"Rand","Cell properties":"Celeigenschappen","Center table":"Tabel centreren",Color:"Kleur","Color picker":"",Column:"Kolom",Dashed:"","Delete column":"Verwijder kolom","Delete row":"Verwijder rij",Dimensions:"",Dotted:"Stippellijn",Double:"Dubbel","Enter table caption":"",Groove:"","Header column":"Titel kolom","Header row":"Titel rij",Height:"Hoogte","Horizontal text alignment toolbar":"","Insert column left":"Kolom links invoegen","Insert column right":"Kolom rechts invoegen","Insert row above":"Rij hierboven invoegen","Insert row below":"Rij hieronder invoegen","Insert table":"Tabel invoegen",Inset:"","Justify cell text":"","Merge cell down":"Cel hieronder samenvoegen","Merge cell left":"Cel hiervoor samenvoegen","Merge cell right":"Cel hierna samenvoegen","Merge cell up":"Cel hierboven samenvoegen","Merge cells":"Cellen samenvoegen",None:"Geen",Outset:"",Padding:"",Ridge:"",Row:"Rij","Select column":"Selecteer kolom","Select row":"Selecteer rij",Solid:"","Split cell horizontally":"Splits cel horizontaal","Split cell vertically":"Splits cel verticaal",Style:"Stijl","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"Tabeleigenschappen","Table toolbar":"Tabel werkbalk",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'De kleur in niet correct, probeer "#FF0000" of "rgb(255,0,0)" of "red".','The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:"Breedte"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"HTML object":"HTML object"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.nl=e.nl||{};t.dictionary=Object.assign(t.dictionary||{},{"Almost equal to":"Bijna gelijk aan",Angle:"Hoek","Approximately equal to":"Ongeveer gelijk aan","Asterisk operator":"Asterisk teken","Austral sign":"Austral teken","back with leftwards arrow above":"back met linkswijzende pijl erboven","Bitcoin sign":"Bitcoin teken","Cedi sign":"Cedi teken","Cent sign":"Cent teken","Character categories":"Karakter categorieën","Colon sign":"Colón teken","Contains as member":"Bevat als onderdeel","Copyright sign":"","Cruzeiro sign":"Cruzeiro teken","Currency sign":"Valuta teken","Degree sign":"Graden teken","Division sign":"Deel teken","Dollar sign":"Dollar teken","Dong sign":"Dong teken","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"","downwards arrow to bar":"benedenwijzende pijl naar streep","downwards dashed arrow":"benedenwijzende gestreepte pijl","downwards double arrow":"benedenwijzende dubbele pijl","Drachma sign":"Drachme teken","Element of":"Onderdeel van","Em dash":"Kastlijntje","Empty set":"Lege set","En dash":"Half kastlijntje","end with leftwards arrow above":"end met linkswijzende pijl erboven","Euro sign":"Euro teken","Euro-currency sign":"Euro-valuta teken","Exclamation question mark":"","For all":"Voor alles","Fraction slash":"Breuk teken","French franc sign":"Franse frank teken","German penny sign":"Duitse penny teken","Greater-than or equal to":"Groter-dan of gelijk aan","Greater-than sign":"Groter-dan teken","Guarani sign":"Guarani teken","Horizontal ellipsis":"","Hryvnia sign":"Grivna teken","Identical to":"Gelijk aan","Indian rupee sign":"Indiaanse roepie teken",Infinity:"Infinity",Integral:"Integraal",Intersection:"Kruispunt","Inverted exclamation mark":"","Inverted question mark":"","Kip sign":"Kip teken","Latin capital letter a with breve":"Latijnse hoofdletter a met breve","Latin capital letter a with macron":"Latijnse hoofdletter a met macron","Latin capital letter a with ogonek":"Latijnse hoofdletter a met ogonek","Latin capital letter c with acute":"Latijnse hoofdletter c met acute","Latin capital letter c with caron":"Latijnse hoofdletter c met caron","Latin capital letter c with circumflex":"Latijnse hoofdletter c met circumflex","Latin capital letter c with dot above":"Latijnse hoofdletter c met punt erboven","Latin capital letter d with caron":"Latijnse hoofdletter d met caron","Latin capital letter d with stroke":"","Latin capital letter e with breve":"","Latin capital letter e with caron":"","Latin capital letter e with dot above":"","Latin capital letter e with macron":"","Latin capital letter e with ogonek":"","Latin capital letter eng":"","Latin capital letter g with breve":"","Latin capital letter g with cedilla":"","Latin capital letter g with circumflex":"","Latin capital letter g with dot above":"","Latin capital letter h with circumflex":"","Latin capital letter h with stroke":"","Latin capital letter i with breve":"","Latin capital letter i with dot above":"","Latin capital letter i with macron":"","Latin capital letter i with ogonek":"","Latin capital letter i with tilde":"","Latin capital letter j with circumflex":"","Latin capital letter k with cedilla":"","Latin capital letter l with acute":"","Latin capital letter l with caron":"","Latin capital letter l with cedilla":"","Latin capital letter l with middle dot":"","Latin capital letter l with stroke":"","Latin capital letter n with acute":"","Latin capital letter n with caron":"","Latin capital letter n with cedilla":"","Latin capital letter o with breve":"","Latin capital letter o with double acute":"","Latin capital letter o with macron":"","Latin capital letter r with acute":"","Latin capital letter r with caron":"","Latin capital letter r with cedilla":"","Latin capital letter s with acute":"","Latin capital letter s with caron":"","Latin capital letter s with cedilla":"","Latin capital letter s with circumflex":"","Latin capital letter t with caron":"","Latin capital letter t with cedilla":"","Latin capital letter t with stroke":"","Latin capital letter u with breve":"","Latin capital letter u with double acute":"","Latin capital letter u with macron":"","Latin capital letter u with ogonek":"","Latin capital letter u with ring above":"","Latin capital letter u with tilde":"","Latin capital letter w with circumflex":"","Latin capital letter y with circumflex":"","Latin capital letter y with diaeresis":"","Latin capital letter z with acute":"","Latin capital letter z with caron":"","Latin capital letter z with dot above":"","Latin capital ligature ij":"","Latin capital ligature oe":"","Latin small letter a with breve":"Latijnse kleine letter a met breve","Latin small letter a with macron":"Latijnse kleine letter a met macron","Latin small letter a with ogonek":"Latijnse kleine letter a met ogonek","Latin small letter c with acute":"Latijnse kleine letter c met acute","Latin small letter c with caron":"Latijnse kleine letter c met caron","Latin small letter c with circumflex":"Latijnse kleine letter c met circumflex","Latin small letter c with dot above":"Latijnse kleine letter met punt erboven","Latin small letter d with caron":"Latijnse kleine letter d met caron","Latin small letter d with stroke":"","Latin small letter dotless i":"","Latin small letter e with breve":"","Latin small letter e with caron":"","Latin small letter e with dot above":"","Latin small letter e with macron":"","Latin small letter e with ogonek":"","Latin small letter eng":"","Latin small letter f with hook":"Latijnse kleine letter f met hoek","Latin small letter g with breve":"","Latin small letter g with cedilla":"","Latin small letter g with circumflex":"","Latin small letter g with dot above":"","Latin small letter h with circumflex":"","Latin small letter h with stroke":"","Latin small letter i with breve":"","Latin small letter i with macron":"","Latin small letter i with ogonek":"","Latin small letter i with tilde":"","Latin small letter j with circumflex":"","Latin small letter k with cedilla":"","Latin small letter kra":"","Latin small letter l with acute":"","Latin small letter l with caron":"","Latin small letter l with cedilla":"","Latin small letter l with middle dot":"","Latin small letter l with stroke":"","Latin small letter long s":"","Latin small letter n preceded by apostrophe":"","Latin small letter n with acute":"","Latin small letter n with caron":"","Latin small letter n with cedilla":"","Latin small letter o with breve":"","Latin small letter o with double acute":"","Latin small letter o with macron":"","Latin small letter r with acute":"","Latin small letter r with caron":"","Latin small letter r with cedilla":"","Latin small letter s with acute":"","Latin small letter s with caron":"","Latin small letter s with cedilla":"","Latin small letter s with circumflex":"","Latin small letter t with caron":"","Latin small letter t with cedilla":"","Latin small letter t with stroke":"","Latin small letter u with breve":"","Latin small letter u with double acute":"","Latin small letter u with macron":"","Latin small letter u with ogonek":"","Latin small letter u with ring above":"","Latin small letter u with tilde":"","Latin small letter w with circumflex":"","Latin small letter y with circumflex":"","Latin small letter z with acute":"","Latin small letter z with caron":"","Latin small letter z with dot above":"","Latin small ligature ij":"","Latin small ligature oe":"","Left double quotation mark":"","Left single quotation mark":"","Left-pointing double angle quotation mark":"","leftwards arrow to bar":"linkswijzende pijl naar streep","leftwards dashed arrow":"linkswijzende gestreepte pijl","leftwards double arrow":"linkswijzende dubbele pijl","Less-than or equal to":"Kleiner-dan of gelijk aan","Less-than sign":"Kleiner-dan teken","Lira sign":"Lira teken","Livre tournois sign":"Livre tournois teken","Logical and":"Logische en","Logical or":"Logische of",Macron:"Makron","Manat sign":"Manat teken","Mill sign":"Mill teken","Minus sign":"Min teken","Multiplication sign":"Vermenigvuldigingsteken","N-ary product":"N-ary product","N-ary summation":"N-ary sommatie",Nabla:"Nabla","Naira sign":"Naira teken","New sheqel sign":"Nieuwe sjekel teken","Nordic mark sign":"Noorse mark teken","Not an element of":"Geen onderdeel van","Not equal to":"Niet gelijk aan","Not sign":"Niet teken","on with exclamation mark with left right arrow above":"on met uitroepteken met links rechts pijl erboven",Overline:"Overline","Paragraph sign":"Paragraaf teken","Partial differential":"Gedeeltelijk differentieel","Per mille sign":"","Per ten thousand sign":"","Peseta sign":"Peseta teken","Peso sign":"Peso teken","Plus-minus sign":"Plus-minus teken","Pound sign":"Pond teken","Proportional to":"Verhoudend tot","Question exclamation mark":"","Registered sign":"","Reversed paragraph sign":"Omgekeerd paragraaf teken","Right double quotation mark":"","Right single quotation mark":"","Right-pointing double angle quotation mark":"","rightwards arrow to bar":"rechtswijzende pijl naar streep","rightwards dashed arrow":"rechtswijzende gestreepte pijl","rightwards double arrow":"rechtswijzende dubbele pijl","Ruble sign":"Roebel teken","Rupee sign":"Roepie teken","Section sign":"","Single left-pointing angle quotation mark":"","Single low-9 quotation mark":"","Single right-pointing angle quotation mark":"","soon with rightwards arrow above":"soon met rechtswijzende pijl erboven","Special characters":"Speciale karakters","Spesmilo sign":"Spesmilo teken","Square root":"Vierkantswortel","Tenge sign":"Tenge teken","There exists":"Er bestaat","Tilde operator":"Tidle teken","top with upwards arrow above":"top met bovenwijzende pijl erboven","Trade mark sign":"","Tugrik sign":"Tugrik teken","Turkish lira sign":"Turkse lira teken","Two dot leader":"",Union:"Unie","up down arrow with base":"boven beneden pijl met streep","upwards arrow to bar":"bovenwijzende pijl naar streep","upwards dashed arrow":"bovenwijzende gestreepte pijl","upwards double arrow":"bovenwijzende dubbele pijl","Vulgar fraction one half":"Gewone breuk een half","Vulgar fraction one quarter":"Gewone breuk een kwart","Vulgar fraction three quarters":"Gewone breuk driekwart","Won sign":"Won teken","Yen sign":"Yen teken"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.nl=e.nl||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"0% van 1%",Aquamarine:"Aquamarijn",Black:"Zwart",Blue:"Blauw",Cancel:"Annuleren","Dim grey":"Gedimd grijs","Dropdown toolbar":"Drop-down werkbalk","Edit block":"Blok aanpassen","Editor toolbar":"Editor welkbalk",Green:"Groen",Grey:"Grijs","Insert paragraph after block":"Voeg paragraaf toe na blok","Insert paragraph before block":"Voeg paragraaf toe voor blok","Light blue":"Lichtblauw","Light green":"Lichtgroen","Light grey":"Lichtgrijs",Next:"Volgende",Orange:"Oranje",Previous:"Vorige",Purple:"Paars",Red:"Rood",Redo:"Opnieuw","Remove color":"Verwijder kleur","Restore default":"Standaardinstellingen terugzetten","Rich Text Editor":"Tekstbewerker","Rich Text Editor, %0":"Tekstbewerker, 0%",Save:"Opslaan","Select all":"Selecteer alles","Show more items":"Meer items weergeven",Turquoise:"Turquoise",Undo:"Ongedaan maken","Upload in progress":"Bezig met uploaden",White:"Wit","Widget toolbar":"Widget werkbalk",Yellow:"Geel"}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/no.js b/core/assets/vendor/ckeditor5/translations/no.js
new file mode 100644
index 0000000000000000000000000000000000000000..f6e1e70875de65fb6077cb5fad858ad56ef6450e
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/no.js
@@ -0,0 +1 @@
+!function(t){const n=t.no=t.no||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Midtstill","Align left":"Venstrejuster","Align right":"Høyrejuster",Justify:"Blokkjuster","Text alignment":"Tekstjustering","Text alignment toolbar":"Verktøylinje for tekstjustering"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const e=t.no=t.no||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Fet",Code:"Kode",Italic:"Kursiv",Strikethrough:"Gjennomstreket",Subscript:"Senket skrift",Superscript:"Hevet skrift",Underline:"Understreket"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const n=o.no=o.no||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Blokksitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i.no=i.no||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Velg overskrift",Heading:"Overskrift","Heading 1":"Overskrift 1","Heading 2":"Overskrift 2","Heading 3":"Overskrift 3","Heading 4":"Overskrift 4","Heading 5":"Overskrift 5","Heading 6":"Overskrift 6",Paragraph:"Avsnitt","Type or paste your content here.":"Skriv eller lim inn ditt innhold her","Type your title":"Skriv inn tittel"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.no=n.no||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Horisontal linje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.no=e.no||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Midtstilt bilde","Change image text alternative":"Endre tekstalternativ til bildet","Enter image caption":"Skriv inn bildetekst","Full size image":"Bilde i full størrelse","Image resize list":"","Image toolbar":"Verktøylinje for bilde","image widget":"Bilde-widget","In line":"",Insert:"","Insert image":"Sett inn bilde","Insert image via URL":"","Left aligned image":"Venstrejustert bilde",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Høyrejustert bilde","Side image":"Sidestilt bilde","Text alternative":"Tekstalternativ",Update:"","Update image URL":"","Upload failed":"Kunne ikke laste opp","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.no=n.no||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Reduser innrykk","Increase indent":"Øk innrykk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.no=n.no||{};e.dictionary=Object.assign(e.dictionary||{},{Downloadable:"Nedlastbar","Edit link":"Rediger lenke",Link:"Lenke","Link image":"","Link URL":"Lenke-URL","Open in a new tab":"Åpne i ny fane","Open link in new tab":"Åpne lenke i ny fane","This link has no URL":"Denne lenken mangler en URL",Unlink:"Fjern lenke"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.no=e.no||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Punktliste","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Nummerert liste","Numbered list styles toolbar":"",Square:"","To-do List":"Oppgaveliste","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.no=n.no||{};o.dictionary=Object.assign(o.dictionary||{},{"Remove Format":"Fjern formatering"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.no=e.no||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Juster celletekst til bunn ","Align cell text to the center":"Juster celletekst til midten ","Align cell text to the left":"Juster celletekst til venstre ","Align cell text to the middle":"Juster celletekst til midten","Align cell text to the right":"Juster celletekst til høyre ","Align cell text to the top":"Juster celletekst til topp","Align table to the left":"Juster tabell til venstre ","Align table to the right":"Juster tabell til høyre ",Alignment:"Justering",Background:"Bakgrunn ",Border:"Kantlinje ","Cell properties":"Celleegenskaper ","Center table":"Sentrer tabell ",Color:"Farge","Color picker":"Fargevalg ",Column:"Kolonne",Dashed:"Stiplet","Delete column":"Slett kolonne","Delete row":"Slett rad",Dimensions:"Dimensjoner",Dotted:"Stiplede",Double:"Dobbel ","Enter table caption":"",Groove:"Grov","Header column":"Overskriftkolonne","Header row":"Overskriftrad",Height:"Høyde","Horizontal text alignment toolbar":"Verktøylinje for justering av tekst horisontalt ","Insert column left":"Sett inn kolonne til venstre","Insert column right":"Sett inn kolonne til høyre","Insert row above":"Sett inn rad over","Insert row below":"Sett inn rad under","Insert table":"Sett inn tabell",Inset:"Innover","Justify cell text":"Rett celletekst ","Merge cell down":"Slå sammen celle under","Merge cell left":"Slå sammen celle til venstre","Merge cell right":"Slå sammen celle til høyre","Merge cell up":"Slå sammen celle over","Merge cells":"Slå sammen celler",None:"Ingen",Outset:"Utover",Padding:"Fylling",Ridge:"Kjede",Row:"Rad","Select column":"Velg kolonne ","Select row":"Velg rad",Solid:"Hel","Split cell horizontally":"Del opp celle horisontalt","Split cell vertically":"Del opp celle vertikalt",Style:"Stil ","Table alignment toolbar":"Verktøylinje for justering av tabell ","Table cell text alignment":"Celle tekstjustering ","Table properties":"Egenskaper for tabell","Table toolbar":"Tabell verktøylinje ",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"Ugyldig farge ",'The value is invalid. Try "10px" or "2em" or simply "2".':"Ugyldig verdi ","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Verktøylinje for justering av tekst vertikalt ",Width:"Bredde"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.no=e.no||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 av %1",Aquamarine:"Akvamarin",Black:"Svart",Blue:"Blå",Cancel:"Avbryt","Dim grey":"Svak grå","Dropdown toolbar":"Verktøylinje for nedtrekksliste","Edit block":"Rediger blokk","Editor toolbar":"Verktøylinje for redigeringsverktøy",Green:"Grønn",Grey:"Grå","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Lyseblå","Light green":"Lysegrønn","Light grey":"Lysegrå",Next:"Neste",Orange:"Oransje",Previous:"Forrige",Purple:"Lilla",Red:"Rød",Redo:"Gjør om","Remove color":"Fjern farge","Restore default":"Tilbakestill til standard","Rich Text Editor":"Tekstredigeringsverktøy for rik tekst","Rich Text Editor, %0":"Tekstredigeringsverktøy for rik tekst, %0",Save:"Lagre","Select all":"Velg alt ","Show more items":"Vis flere elementer",Turquoise:"Turkis",Undo:"Angre","Upload in progress":"Laster opp fil",White:"Hvit","Widget toolbar":"Widget verktøylinje ",Yellow:"Gul"}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/oc.js b/core/assets/vendor/ckeditor5/translations/oc.js
new file mode 100644
index 0000000000000000000000000000000000000000..7d662342f2eb9a0b1b80a79907690c83bceef629
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/oc.js
@@ -0,0 +1 @@
+!function(i){const c=i.oc=i.oc||{};c.dictionary=Object.assign(c.dictionary||{},{Bold:"Gras",Code:"",Italic:"Italica",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const n=o.oc=o.oc||{};n.dictionary=Object.assign(n.dictionary||{},{"%0 of %1":"",Cancel:"Anullar","Remove color":"","Restore default":"",Save:"Enregistrar","Show more items":""}),n.getPluralForm=function(o){return o>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/pl.js b/core/assets/vendor/ckeditor5/translations/pl.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f0331f91389a5bdc70bf2dc388f24da9e8c5219
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/pl.js
@@ -0,0 +1 @@
+!function(n){const i=n.pl=n.pl||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Wyrównaj do środka","Align left":"Wyrównaj do lewej","Align right":"Wyrównaj do prawej",Justify:"Wyrównaj obustronnie","Text alignment":"Wyrównanie tekstu","Text alignment toolbar":"Pasek narzędzi wyrównania tekstu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.pl=e.pl||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Pogrubienie",Code:"Kod",Italic:"Kursywa",Strikethrough:"Przekreślenie",Subscript:"Indeks dolny",Superscript:"Indeks górny",Underline:"Podkreślenie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.pl=o.pl||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Cytat blokowy"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.pl=e.pl||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"Wybierz nagłówek",Heading:"Nagłówek","Heading 1":"Nagłówek 1","Heading 2":"Nagłówek 2","Heading 3":"Nagłówek 3","Heading 4":"Nagłówek 4","Heading 5":"Nagłówek 5","Heading 6":"Nagłówek 6",Paragraph:"Akapit","Type or paste your content here.":"Wpisz lub wklej tutaj treść dokumentu.","Type your title":"Podaj tytuł"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.pl=i.pl||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Linia pozioma"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.pl=a.pl||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"","Centered image":"Obraz wyrównany do środka","Change image text alternative":"Zmień tekst zastępczy obrazka","Enter image caption":"Wstaw tytuł obrazka","Full size image":"Obraz w pełnym rozmiarze","Image resize list":"","Image toolbar":"Pasek narzędzi obrazka","image widget":"Obraz","In line":"",Insert:"Wstaw","Insert image":"Wstaw obraz","Insert image via URL":"Wstaw obraz z adresu URL","Left aligned image":"Obraz wyrównany do lewej",Original:"Oryginalny","Resize image":"Zmień rozmiar obrazka","Resize image to %0":"Zmień rozmiar do %0","Resize image to the original size":"Przywróć oryginalny rozmiar obrazu","Right aligned image":"Obraz wyrównany do prawej","Side image":"Obraz dosunięty do brzegu, oblewany tekstem","Text alternative":"Tekst zastępczy obrazka",Update:"Zaktualizuj","Update image URL":"Uaktualnij obraz z adresu URL","Upload failed":"Przesyłanie obrazu nie powiodło się","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.pl=i.pl||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Zmniejsz wcięcie","Increase indent":"Zwiększ wcięcie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.pl=n.pl||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Wybierz język",Language:"Język","Remove language":"Usuń język"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.pl=n.pl||{};o.dictionary=Object.assign(o.dictionary||{},{Downloadable:"Do pobrania","Edit link":"Edytuj odnośnik",Link:"Wstaw odnośnik","Link image":"Wstaw odnośnik do obrazka","Link URL":"Adres URL","Open in a new tab":"Otwórz w nowej zakładce","Open link in new tab":"Otwórz odnośnik w nowej zakładce","This link has no URL":"Nie podano adresu URL odnośnika",Unlink:"Usuń odnośnik"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.pl=e.pl||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Lista wypunktowana","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Lista numerowana","Numbered list styles toolbar":"",Square:"","To-do List":"Lista rzeczy do zrobienia","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.pl=o.pl||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"Usuń formatowanie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.pl=i.pl||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"Źródło"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.pl=e.pl||{};o.dictionary=Object.assign(o.dictionary||{},{"Align cell text to the bottom":"Wyrównaj tekst w komórce do dołu","Align cell text to the center":"Wyrównaj tekst w komórce do środka","Align cell text to the left":"Wyrównaj tekst w komórce do lewej","Align cell text to the middle":"Wyrównaj tekst w komórce do środka","Align cell text to the right":"Wyrównaj tekst w komórce do prawej","Align cell text to the top":"Wyrównaj tekst w komórce do góry","Align table to the left":"Wyrównaj tabelę do lewej","Align table to the right":"Wyrównaj tabelę do prawej",Alignment:"Wyrównanie",Background:"Tło",Border:"Obramowanie","Cell properties":"Właściwości komórki","Center table":"Wyrównaj tabelę do środka",Color:"Kolor","Color picker":"Wybór koloru",Column:"Kolumna",Dashed:"Kreskowane","Delete column":"Usuń kolumnę","Delete row":"Usuń wiersz",Dimensions:"Wymiary",Dotted:"Kropkowane",Double:"Podwójne","Enter table caption":"Wprowadź podpis tabeli",Groove:"Wklęsłe","Header column":"Kolumna nagłówka","Header row":"Wiersz nagłówka",Height:"Wysokość","Horizontal text alignment toolbar":"Pasek narzędzi wyrównania tekstu w poziomie","Insert column left":"Wstaw kolumnę z lewej","Insert column right":"Wstaw kolumnę z prawej","Insert row above":"Wstaw wiersz ponad","Insert row below":"Wstaw wiersz poniżej","Insert table":"Wstaw tabelę",Inset:"Zapadnięte","Justify cell text":"Wyjustuj tekst komórki","Merge cell down":"Scal komórkę w dół","Merge cell left":"Scal komórkę w lewo","Merge cell right":"Scal komórkę w prawo","Merge cell up":"Scal komórkę w górę","Merge cells":"Scal komórki",None:"Brak",Outset:"Wysunięte",Padding:"Dopełnienie",Ridge:"Wypukłe",Row:"Wiersz","Select column":"Zaznacz kolumnę","Select row":"Zaznacz wiersz",Solid:"Ciągłe","Split cell horizontally":"Podziel komórkę poziomo","Split cell vertically":"Podziel komórkę pionowo",Style:"Styl","Table alignment toolbar":"Pasek narzędzi wyrównania tabeli","Table cell text alignment":"Wyrównanie tekstu komórki tabeli","Table properties":"Właściwości tabeli","Table toolbar":"Pasek narzędzi tabel",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Kolor jest niepoprawny. Spróbuj wpisać "#FF0000", "rgb(255,0,0)" lub "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Wartość jest niepoprawna. Spróbuj  wpisać "10px", "2em" lub po prostu "2".',"Toggle caption off":"Ukryj podpis tabeli","Toggle caption on":"Pokaż podpis tabeli","Vertical text alignment toolbar":"Pasek narzędzi wyrównania tekstu w pionie",Width:"Szerokość"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.pl=i.pl||{};n.dictionary=Object.assign(n.dictionary||{},{"HTML object":"Obiekt HTML"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t.pl=t.pl||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"",Angle:"","Approximately equal to":"","Asterisk operator":"","Austral sign":"Znak australa","back with leftwards arrow above":"","Bitcoin sign":"Znak bitcoina","Cedi sign":"Znak cedi","Cent sign":"Znak centa","Character categories":"Kategorie znaków","Colon sign":"Znak colona","Contains as member":"","Copyright sign":"","Cruzeiro sign":"Znak cruzeiro","Currency sign":"Znak waluty","Degree sign":"","Division sign":"","Dollar sign":"Znak dolara","Dong sign":"Znak donga","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","Drachma sign":"Znak drachmy","Element of":"","Em dash":"","Empty set":"","En dash":"","end with leftwards arrow above":"","Euro sign":"Znak euro","Euro-currency sign":"Znak euro","Exclamation question mark":"","For all":"","Fraction slash":"","French franc sign":"Znak franka francuskiego","German penny sign":"Znak feniga","Greater-than or equal to":"","Greater-than sign":"","Guarani sign":"Znak guarani","Horizontal ellipsis":"","Hryvnia sign":"Znak hrywny","Identical to":"","Indian rupee sign":"Znak rupii indyjskiej",Infinity:"",Integral:"",Intersection:"","Inverted exclamation mark":"","Inverted question mark":"","Kip sign":"Znak kipa","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin capital letter c with caron":"","Latin capital letter c with circumflex":"","Latin capital letter c with dot above":"","Latin capital letter d with caron":"","Latin capital letter d with stroke":"","Latin capital letter e with breve":"","Latin capital letter e with caron":"","Latin capital letter e with dot above":"","Latin capital letter e with macron":"","Latin capital letter e with ogonek":"","Latin capital letter eng":"","Latin capital letter g with breve":"","Latin capital letter g with cedilla":"","Latin capital letter g with circumflex":"","Latin capital letter g with dot above":"","Latin capital letter h with circumflex":"","Latin capital letter h with stroke":"","Latin capital letter i with breve":"","Latin capital letter i with dot above":"","Latin capital letter i with macron":"","Latin capital letter i with ogonek":"","Latin capital letter i with tilde":"","Latin capital letter j with circumflex":"","Latin capital letter k with cedilla":"","Latin capital letter l with acute":"","Latin capital letter l with caron":"","Latin capital letter l with cedilla":"","Latin capital letter l with middle dot":"","Latin capital letter l with stroke":"","Latin capital letter n with acute":"","Latin capital letter n with caron":"","Latin capital letter n with cedilla":"","Latin capital letter o with breve":"","Latin capital letter o with double acute":"","Latin capital letter o with macron":"","Latin capital letter r with acute":"","Latin capital letter r with caron":"","Latin capital letter r with cedilla":"","Latin capital letter s with acute":"","Latin capital letter s with caron":"","Latin capital letter s with cedilla":"","Latin capital letter s with circumflex":"","Latin capital letter t with caron":"","Latin capital letter t with cedilla":"","Latin capital letter t with stroke":"","Latin capital letter u with breve":"","Latin capital letter u with double acute":"","Latin capital letter u with macron":"","Latin capital letter u with ogonek":"","Latin capital letter u with ring above":"","Latin capital letter u with tilde":"","Latin capital letter w with circumflex":"","Latin capital letter y with circumflex":"","Latin capital letter y with diaeresis":"","Latin capital letter z with acute":"","Latin capital letter z with caron":"","Latin capital letter z with dot above":"","Latin capital ligature ij":"","Latin capital ligature oe":"","Latin small letter a with breve":"","Latin small letter a with macron":"","Latin small letter a with ogonek":"","Latin small letter c with acute":"","Latin small letter c with caron":"","Latin small letter c with circumflex":"","Latin small letter c with dot above":"","Latin small letter d with caron":"","Latin small letter d with stroke":"","Latin small letter dotless i":"","Latin small letter e with breve":"","Latin small letter e with caron":"","Latin small letter e with dot above":"","Latin small letter e with macron":"","Latin small letter e with ogonek":"","Latin small letter eng":"","Latin small letter f with hook":"","Latin small letter g with breve":"","Latin small letter g with cedilla":"","Latin small letter g with circumflex":"","Latin small letter g with dot above":"","Latin small letter h with circumflex":"","Latin small letter h with stroke":"","Latin small letter i with breve":"","Latin small letter i with macron":"","Latin small letter i with ogonek":"","Latin small letter i with tilde":"","Latin small letter j with circumflex":"","Latin small letter k with cedilla":"","Latin small letter kra":"","Latin small letter l with acute":"","Latin small letter l with caron":"","Latin small letter l with cedilla":"","Latin small letter l with middle dot":"","Latin small letter l with stroke":"","Latin small letter long s":"","Latin small letter n preceded by apostrophe":"","Latin small letter n with acute":"","Latin small letter n with caron":"","Latin small letter n with cedilla":"","Latin small letter o with breve":"","Latin small letter o with double acute":"","Latin small letter o with macron":"","Latin small letter r with acute":"","Latin small letter r with caron":"","Latin small letter r with cedilla":"","Latin small letter s with acute":"","Latin small letter s with caron":"","Latin small letter s with cedilla":"","Latin small letter s with circumflex":"","Latin small letter t with caron":"","Latin small letter t with cedilla":"","Latin small letter t with stroke":"","Latin small letter u with breve":"","Latin small letter u with double acute":"","Latin small letter u with macron":"","Latin small letter u with ogonek":"","Latin small letter u with ring above":"","Latin small letter u with tilde":"","Latin small letter w with circumflex":"","Latin small letter y with circumflex":"","Latin small letter z with acute":"","Latin small letter z with caron":"","Latin small letter z with dot above":"","Latin small ligature ij":"","Latin small ligature oe":"","Left double quotation mark":"","Left single quotation mark":"","Left-pointing double angle quotation mark":"","leftwards arrow to bar":"","leftwards dashed arrow":"","leftwards double arrow":"","Less-than or equal to":"","Less-than sign":"","Lira sign":"Znak liry","Livre tournois sign":"","Logical and":"","Logical or":"",Macron:"","Manat sign":"Znak manata","Mill sign":"","Minus sign":"","Multiplication sign":"","N-ary product":"","N-ary summation":"",Nabla:"","Naira sign":"Znak nairy","New sheqel sign":"Znak nowego szekla","Nordic mark sign":"Znak marki nordyckiej","Not an element of":"","Not equal to":"","Not sign":"","on with exclamation mark with left right arrow above":"",Overline:"","Paragraph sign":"","Partial differential":"","Per mille sign":"","Per ten thousand sign":"","Peseta sign":"Znak pesety","Peso sign":"Znak peso","Plus-minus sign":"","Pound sign":"Znak funta","Proportional to":"","Question exclamation mark":"","Registered sign":"","Reversed paragraph sign":"","Right double quotation mark":"","Right single quotation mark":"","Right-pointing double angle quotation mark":"","rightwards arrow to bar":"","rightwards dashed arrow":"","rightwards double arrow":"","Ruble sign":"Znak rubla","Rupee sign":"Znak rupii","Section sign":"","Single left-pointing angle quotation mark":"","Single low-9 quotation mark":"","Single right-pointing angle quotation mark":"","soon with rightwards arrow above":"","Special characters":"Znaki specjalne","Spesmilo sign":"","Square root":"","Tenge sign":"Znak tenge","There exists":"","Tilde operator":"","top with upwards arrow above":"","Trade mark sign":"","Tugrik sign":"Znak tugrika","Turkish lira sign":"Znak liry tureckiej","Two dot leader":"",Union:"","up down arrow with base":"","upwards arrow to bar":"","upwards dashed arrow":"","upwards double arrow":"","Vulgar fraction one half":"","Vulgar fraction one quarter":"","Vulgar fraction three quarters":"","Won sign":"Znak wona","Yen sign":"Znak jena"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const e=o.pl=o.pl||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 z %1",Aquamarine:"Akwamaryna",Black:"Czarny",Blue:"Niebieski",Cancel:"Anuluj","Dim grey":"Ciemnoszary","Dropdown toolbar":"Rozwijany pasek narzędzi","Edit block":"Edytuj blok","Editor toolbar":"Pasek narzędzi edytora",Green:"Zielony",Grey:"Szary","Insert paragraph after block":"Wstaw akapit po bloku","Insert paragraph before block":"Wstaw akapit przed blokiem","Light blue":"Jasnoniebieski","Light green":"Jasnozielony","Light grey":"Jasnoszary",Next:"Następny",Orange:"Pomarańczowy",Previous:"Poprzedni",Purple:"Purpurowy",Red:"Czerwony",Redo:"Ponów","Remove color":"Usuń kolor","Restore default":"Przywróć domyślne","Rich Text Editor":"Edytor tekstu sformatowanego","Rich Text Editor, %0":"Edytor tekstu sformatowanego, %0",Save:"Zapisz","Select all":"Zaznacz wszystko","Show more items":"Pokaż więcej",Turquoise:"Turkusowy",Undo:"Cofnij","Upload in progress":"Trwa przesyłanie",White:"Biały","Widget toolbar":"Pasek widgetów",Yellow:"Żółty"}),e.getPluralForm=function(o){return 1==o?0:o%10>=2&&o%10<=4&&(o%100<12||o%100>14)?1:1!=o&&o%10>=0&&o%10<=1||o%10>=5&&o%10<=9||o%100>=12&&o%100<=14?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/pt-br.js b/core/assets/vendor/ckeditor5/translations/pt-br.js
new file mode 100644
index 0000000000000000000000000000000000000000..6603bb870fe9681f13cbc7d800e83cdf81d79e36
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/pt-br.js
@@ -0,0 +1 @@
+!function(t){const i=t["pt-br"]=t["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Centralizar","Align left":"Alinhar à esquerda","Align right":"Alinhar à direita",Justify:"Justificar","Text alignment":"Alinhamento do texto","Text alignment toolbar":"Ferramentas de alinhamento de texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i["pt-br"]=i["pt-br"]||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Negrito",Code:"Código",Italic:"Itálico",Strikethrough:"Tachado",Subscript:"Subscrito",Superscript:"Sobrescrito",Underline:"Sublinhado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o["pt-br"]=o["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Bloco de citação"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const t=o["pt-br"]=o["pt-br"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Choose heading":"Escolha o título",Heading:"Titulo","Heading 1":"Título 1","Heading 2":"Título 2","Heading 3":"Título 3","Heading 4":"Título 4","Heading 5":"Título 5","Heading 6":"Título 6",Paragraph:"Parágrafo","Type or paste your content here.":"Digite ou cole o conteúdo aqui.","Type your title":"Digite o título"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i["pt-br"]=i["pt-br"]||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Linha horizontal"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e["pt-br"]=e["pt-br"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Imagem centralizada","Change image text alternative":"Alterar texto alternativo da imagem","Enter image caption":"Inserir legenda da imagem","Full size image":"Imagem completa","Image resize list":"Lista de redimensionamento de imagem","Image toolbar":"Ferramentas de Imagem","image widget":"Ferramenta de imagem","In line":"",Insert:"Inserir","Insert image":"Inserir imagem","Insert image via URL":"Inserir imagem via URL","Left aligned image":"Imagem alinhada à esquerda",Original:"Original","Resize image":"Redimensionar imagem","Resize image to %0":"Redimensionar a imagem para 0%","Resize image to the original size":"Redimensionar a imagem para o tamanho original","Right aligned image":"Imagem alinhada à direita","Side image":"Imagem lateral","Text alternative":"Texto alternativo",Update:"Atualizar","Update image URL":"","Upload failed":"Falha ao subir arquivo","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["pt-br"]=n["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Diminuir indentação","Increase indent":"Aumentar indentação"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["pt-br"]=n["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Pode ser baixado","Edit link":"Editar link",Link:"Link","Link image":"Link da imagem","Link URL":"URL","Open in a new tab":"Abrir em nova aba","Open link in new tab":"Abrir link em nova aba","This link has no URL":"Este link não possui uma URL",Unlink:"Remover link"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e["pt-br"]=e["pt-br"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Lista com marcadores","Bulleted list styles toolbar":"Barra de ferramentas de estilos de lista com marcador",Circle:"Círculo",Decimal:"Decimal","Decimal with leading zero":"Decimal com zero à esquerda",Disc:"Disco","Lower-latin":"Latim inferior","Lower–roman":"Romano inferior","Numbered List":"Lista numerada","Numbered list styles toolbar":"Barra de ferramentas de estilos de lista numerada",Square:"Quadrado","To-do List":"Lista de Tarefas","Toggle the circle list style":"Alternar o estilo da lista de círculo","Toggle the decimal list style":"Alternar o estilo de lista decimal","Toggle the decimal with leading zero list style":"Alternar o decimal com estilo de lista zero à esquerda","Toggle the disc list style":"Alternar o estilo da lista de disco","Toggle the lower–latin list style":"Alternar o estilo de lista latina inferior","Toggle the lower–roman list style":"Alternar o estilo de lista romana inferior","Toggle the square list style":"Alternar o estilo de lista quadrada","Toggle the upper–latin list style":"Alternar o estilo de lista latino superior","Toggle the upper–roman list style":"Alternar o estilo de lista romana superior","Upper-latin":"Latim superior","Upper-roman":"Romano superior"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const t=o["pt-br"]=o["pt-br"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Remove Format":"Remover Formatação"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e["pt-br"]=e["pt-br"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Align cell text to the bottom":"Alinhar texto da célula para baixo","Align cell text to the center":"Alinhar texto da célula centralizado","Align cell text to the left":"Alinhar texto da célula para a esquerda","Align cell text to the middle":"Alinhar texto da célula para o meio","Align cell text to the right":"Alinhar texto da célula para a direita","Align cell text to the top":"Alinhar texto da célula para o topo","Align table to the left":"Alinhar tabela para esquerda","Align table to the right":"Alinhar tabela para direita",Alignment:"Alinhamento",Background:"Cor de fundo",Border:"Borda","Cell properties":"Propriedades da célula","Center table":"Centralizar tabela",Color:"Cor","Color picker":"Seletor de cor",Column:"Coluna",Dashed:"Tracejada","Delete column":"Excluir coluna","Delete row":"Excluir linha",Dimensions:"Dimensões",Dotted:"Pontilhada",Double:"Dupla","Enter table caption":"",Groove:"Ranhura","Header column":"Coluna de cabeçalho","Header row":"Linha de cabeçalho",Height:"Altura","Horizontal text alignment toolbar":"Ferramentas de alinhamento horizontal do texto","Insert column left":"Inserir coluna à esquerda","Insert column right":"Inserir coluna à direita","Insert row above":"Inserir linha acima","Insert row below":"Inserir linha abaixo","Insert table":"Inserir tabela",Inset:"Baixo relevo","Justify cell text":"Justificar texto da célula","Merge cell down":"Mesclar abaixo","Merge cell left":"Mesclar à esquerda","Merge cell right":"Mesclar à direita","Merge cell up":"Mesclar acima","Merge cells":"Mesclar células",None:"Sem borda",Outset:"Alto relevo",Padding:"Margem interna",Ridge:"Crista",Row:"Linha","Select column":"Selecionar coluna","Select row":"Selecionar linha",Solid:"Sólida","Split cell horizontally":"Dividir horizontalmente","Split cell vertically":"Dividir verticalmente",Style:"Estilo","Table alignment toolbar":"Ferramentas de alinhamento da tabela","Table cell text alignment":"Alinhamento do texto na célula","Table properties":"Propriedades da tabela","Table toolbar":"Ferramentas de Tabela",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Cor inválida. Tente "#FF0000" ou "rgb(255,0,0)" ou "red"','The value is invalid. Try "10px" or "2em" or simply "2".':'Valor inválido. Tente "10px" ou "2em" ou apenas "2"',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Ferramentas de alinhamento vertical do texto",Width:"Largura"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const o=a["pt-br"]=a["pt-br"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Almost equal to":"Quase igual a",Angle:"Ângulo","Approximately equal to":"Aproximadamente igual a","Asterisk operator":"Operador asterisco","Austral sign":"Símbolo de Austral","back with leftwards arrow above":"volta com a seta esquerda acima","Bitcoin sign":"Símbolo do Bitcoin","Cedi sign":"Símbolo de Cedi","Cent sign":"Símbolo de Centavo","Character categories":"Categoria de caracteres","Colon sign":"Sinal de dois pontos","Contains as member":"Contém como membro","Copyright sign":"Símbolo de direitos reservados","Cruzeiro sign":"Símbolo do Cruzeiro","Currency sign":"Símbolo de moeda","Degree sign":"Sinal de grau","Division sign":"Sinal de divisão","Dollar sign":"Símbolo do dólar","Dong sign":"Símbolo do Dong","Double dagger":"Adaga dupla","Double exclamation mark":"Sinal do ponto de exclamação duplo","Double low-9 quotation mark":"Aspas duplas baixas simples","Double question mark":"Ponto de interrogação duplo","downwards arrow to bar":"seta para baixo para barra","downwards dashed arrow":"Seta tracejada para baixo","downwards double arrow":"Seta dupla para baixo","Drachma sign":"Sinal de Dracma","Element of":"Elemento de","Em dash":"Travessão","Empty set":"Conjunto vazio","En dash":"Traço","end with leftwards arrow above":"termina com a seta esquerda acima","Euro sign":"Símbolo do Euro","Euro-currency sign":"Símbolo da Moeda do Euro","Exclamation question mark":"Ponto de exclamação","For all":"Para todos","Fraction slash":"Barra de fração","French franc sign":"Símbolo do Franco Francês","German penny sign":"Símbolo do Centavo Alemão","Greater-than or equal to":"Maior que ou igual a","Greater-than sign":"Sinal maior que","Guarani sign":"Símbolo de Guarani","Horizontal ellipsis":"Elipse horizontal","Hryvnia sign":"Símbolo de Hryvnia","Identical to":"Idêntico a","Indian rupee sign":"Símbolo da Rupia Indiana",Infinity:"Infinito",Integral:"Integral",Intersection:"Interseção","Inverted exclamation mark":"Ponto de exclamação invertido","Inverted question mark":"Ponto de interrogação invertido","Kip sign":"Símbolo do Kip","Latin capital letter a with breve":"Símbolo latim maiúsculo A com breve","Latin capital letter a with macron":"Símbolo latim maiúsculo A com macron","Latin capital letter a with ogonek":"Símbolo latim maiúsculo A com ogonek","Latin capital letter c with acute":"Símbolo latim maiúsculo C com acento agudo","Latin capital letter c with caron":"Símbolo latim maiúsculo C com caron","Latin capital letter c with circumflex":"Símbolo latim maiúsculo C com acento circunflexo","Latin capital letter c with dot above":"Símbolo latim maiúsculo C com ponto acima","Latin capital letter d with caron":"Símbolo latim maiúsculo D com caron","Latin capital letter d with stroke":"Símbolo latin maiúsculo D com um traçado vertical","Latin capital letter e with breve":"Símbolo latim maiúsculo E com breve","Latin capital letter e with caron":"Símbolo latim maiúsculo E com caron","Latin capital letter e with dot above":"Símbolo latim maiúsculo E com ponto acima","Latin capital letter e with macron":"Símbolo latim maiúsculo E com macron","Latin capital letter e with ogonek":"Símbolo latim maiúsculo E com ogonek","Latin capital letter eng":"Símbolo latim maiúsculo Eng","Latin capital letter g with breve":"Símbolo latim maiúsculo G com breve","Latin capital letter g with cedilla":"Símbolo latim maiúsculo G com cedilha","Latin capital letter g with circumflex":"Símbolo latim maiúsculo G com acento circunflexo","Latin capital letter g with dot above":"Símbolo latim maiúsculo G com ponto acima","Latin capital letter h with circumflex":"Símbolo latim maiúsculo H com acento circunflexo","Latin capital letter h with stroke":"Símbolo latin maiúsculo H com um traçado vertical","Latin capital letter i with breve":"Símbolo latim maiúsculo I com breve","Latin capital letter i with dot above":"Símbolo latim maiúsculo I com ponto acima","Latin capital letter i with macron":"Símbolo latim maiúsculo I com macron","Latin capital letter i with ogonek":"Símbolo latim maiúsculo I com ogonek","Latin capital letter i with tilde":"Símbolo latim maiúsculo I com til","Latin capital letter j with circumflex":"Símbolo latim maiúsculo J com acento circunflexo","Latin capital letter k with cedilla":"Símbolo latim maiúsculo K com cedilha","Latin capital letter l with acute":"Símbolo latim maiúsculo l com acento agudo","Latin capital letter l with caron":"Símbolo latim maiúsculo I com caron","Latin capital letter l with cedilla":"Símbolo latim maiúsculo L com cedilha","Latin capital letter l with middle dot":"Símbolo latin maiúsculo L com ponto no meio","Latin capital letter l with stroke":"Símbolo latin maiúsculo L com um traçado vertical","Latin capital letter n with acute":"Símbolo latim maiúsculo N com acento agudo","Latin capital letter n with caron":"Símbolo latim maiúsculo N com caron","Latin capital letter n with cedilla":"Símbolo latim maiúsculo N com cedilha","Latin capital letter o with breve":"Símbolo latim maiúsculo O com breve","Latin capital letter o with double acute":"Símbolo latim maiúsculo O com acento agudo duplo","Latin capital letter o with macron":"Símbolo latim maiúsculo I com macron","Latin capital letter r with acute":"Símbolo latim maiúsculo R com acento agudo","Latin capital letter r with caron":"Símbolo latim maiúsculo R com caron","Latin capital letter r with cedilla":"Símbolo latim maiúsculo R com cedilha","Latin capital letter s with acute":"Símbolo latim maiúsculo S com acento agudo","Latin capital letter s with caron":"Símbolo latim maiúsculo S com caron","Latin capital letter s with cedilla":"Símbolo latim maiúsculo S com cedilha","Latin capital letter s with circumflex":"Símbolo latim maiúsculo S com acento circunflexo","Latin capital letter t with caron":"Símbolo latim maiúsculo T com caron","Latin capital letter t with cedilla":"Símbolo latim maiúsculo T com cedilha","Latin capital letter t with stroke":"Símbolo latin maiúsculo T com um traçado vertical","Latin capital letter u with breve":"Símbolo latim maiúsculo U com breve","Latin capital letter u with double acute":"Símbolo latim maiúsculo U com acento agudo duplo","Latin capital letter u with macron":"Símbolo latim maiúsculo I com macron","Latin capital letter u with ogonek":"Símbolo latim maiúsculo U com ogonek","Latin capital letter u with ring above":"Símbolo latim maiúsculo U com anel acima","Latin capital letter u with tilde":"Símbolo latim maiúsculo U com til","Latin capital letter w with circumflex":"Símbolo latim maiúsculo W com acento circunflexo","Latin capital letter y with circumflex":"Símbolo latim maiúsculo Y com acento circunflexo","Latin capital letter y with diaeresis":"Símbolo latim maiúsculo Z com trema","Latin capital letter z with acute":"Símbolo latim maiúsculo Z com acento agudo","Latin capital letter z with caron":"Símbolo latim maiúsculo Z com caron","Latin capital letter z with dot above":"Símbolo latim maiúsculo Z com ponto acima","Latin capital ligature ij":"Símbolo latin maiúsculo ligadura IJ","Latin capital ligature oe":"Símbolo latin maiúsculo ligadura OE","Latin small letter a with breve":"Símbolo latim minúsculo A com breve","Latin small letter a with macron":"Símbolo latim minúsculo A com macron","Latin small letter a with ogonek":"Símbolo latim minúsculo A com ogonek","Latin small letter c with acute":"Símbolo latim minúsculo C com acento agudo","Latin small letter c with caron":"Símbolo latim minúsculo C com caron","Latin small letter c with circumflex":"Símbolo latim minúsculo C com acento circunflexo","Latin small letter c with dot above":"Símbolo latim minúsculo C com ponto acima","Latin small letter d with caron":"Símbolo latim minúsculo D com caron","Latin small letter d with stroke":"Símbolo latin minúsculo D com um traçado vertical","Latin small letter dotless i":"Símbolo latin sem ponto I","Latin small letter e with breve":"Símbolo latim minúsculo E com breve","Latin small letter e with caron":"Símbolo latim minúsculo E com caron","Latin small letter e with dot above":"Símbolo latim minúsculo E com ponto acima","Latin small letter e with macron":"Símbolo latim minúsculo E com macron","Latin small letter e with ogonek":"Símbolo latim minúsculo E com ogonek","Latin small letter eng":"Símbolo latim minúsculo Eng","Latin small letter f with hook":"Símbolo latim minúsculo F com gancho","Latin small letter g with breve":"Símbolo latim minúsculo G com breve","Latin small letter g with cedilla":"Símbolo latim minúsculo G com cedilha","Latin small letter g with circumflex":"Símbolo latim minúsculo G com acento circunflexo","Latin small letter g with dot above":"Símbolo latim minúsculo G com ponto acima","Latin small letter h with circumflex":"Símbolo latim minúsculo H com acento circunflexo","Latin small letter h with stroke":"Símbolo latin minúsculo H com um traçado vertical","Latin small letter i with breve":"Símbolo latim minúsculo I com breve","Latin small letter i with macron":"Símbolo latim minúsculo I com macron","Latin small letter i with ogonek":"Símbolo latim minúsculo I com ogonek","Latin small letter i with tilde":"Símbolo latim minúsculo I com til","Latin small letter j with circumflex":"Símbolo latim minúsculo J com acento circunflexo","Latin small letter k with cedilla":"Símbolo latim minúsculo K com cedilha","Latin small letter kra":"Símbolo latin minúsculo K","Latin small letter l with acute":"Símbolo latim minúsculo I com acento agudo","Latin small letter l with caron":"Símbolo latim minúsculo I com caron","Latin small letter l with cedilla":"Símbolo latim minúsculo L com cedilha","Latin small letter l with middle dot":"Símbolo latin minúsculo L com ponto no meio","Latin small letter l with stroke":"Símbolo latin minúsculo L com um traçado vertical","Latin small letter long s":"Símbolo latim minúsculo long s","Latin small letter n preceded by apostrophe":"Símbolo latim minúsculo N precedido por apóstrofe","Latin small letter n with acute":"Símbolo latim minúsculo N com acento agudo","Latin small letter n with caron":"Símbolo latim minúsculo N com caron","Latin small letter n with cedilla":"Símbolo latim minúsculo N com cedilha","Latin small letter o with breve":"Símbolo latim minúsculo O com breve","Latin small letter o with double acute":"Símbolo latim minúsculo O com acento agudo duplo","Latin small letter o with macron":"Símbolo latim minúsculo O com macron","Latin small letter r with acute":"Símbolo latim minúsculo R com acento agudo","Latin small letter r with caron":"Símbolo latim minúsculo R com caron","Latin small letter r with cedilla":"Símbolo latim minúsculo R com cedilha","Latin small letter s with acute":"Símbolo latim minúsculo S com acento agudo","Latin small letter s with caron":"Símbolo latim minúsculo S com caron","Latin small letter s with cedilla":"Símbolo latim minúsculo S com cedilha","Latin small letter s with circumflex":"Símbolo latim minúsculo S com acento circunflexo","Latin small letter t with caron":"Símbolo latim minúsculo T com caron","Latin small letter t with cedilla":"Símbolo latim minúsculo T com cedilha","Latin small letter t with stroke":"Símbolo latin minúsculo T com um traçado vertical","Latin small letter u with breve":"Símbolo latim minúsculo U com breve","Latin small letter u with double acute":"Símbolo latim minúsculo U com acento agudo","Latin small letter u with macron":"Símbolo latim minúsculo U com macron","Latin small letter u with ogonek":"Símbolo latim minúsculo U com ogonek","Latin small letter u with ring above":"Símbolo latim minúsculo U com anel acima","Latin small letter u with tilde":"Símbolo latim minúsculo U com til","Latin small letter w with circumflex":"Símbolo latim minúsculo W com acento circunflexo","Latin small letter y with circumflex":"Símbolo latim minúsculo Y com acento circunflexo","Latin small letter z with acute":"Símbolo latim minúsculo Z com acento agudo","Latin small letter z with caron":"Símbolo latim minúsculo Z com caron","Latin small letter z with dot above":"Símbolo latim minúsculo Z com ponto acima","Latin small ligature ij":"Símbolo latin minúsculo ligadura IJ","Latin small ligature oe":"Símbolo latin minúsculo ligadura OE","Left double quotation mark":"Aspas dupla esquerda","Left single quotation mark":"Aspas simples esquerda","Left-pointing double angle quotation mark":"Aspas angulares duplas esquerda","leftwards arrow to bar":"seta para a esquerda para barra","leftwards dashed arrow":"Seta tracejada para esquerda","leftwards double arrow":"Seta dupla para esquerda","Less-than or equal to":"Menor que ou igual a","Less-than sign":"Sinal menor que","Lira sign":"Símbolo da Lira","Livre tournois sign":"Símbolo de Livre tournois","Logical and":"Operador lógico AND","Logical or":"Operador lógico OR",Macron:"Macron","Manat sign":"Símbolo do Manat","Mill sign":"Símbolo de Mill","Minus sign":"Sinal de menos","Multiplication sign":"Sinal de multiplicação","N-ary product":"Símbolo Produto N-ário","N-ary summation":"Somatório",Nabla:"Nabla","Naira sign":"Símbolo de Naira","New sheqel sign":"Símbolo do Novo Sheqel","Nordic mark sign":"Símbolo da Marca Nórdica","Not an element of":"Não é um elemento de","Not equal to":"Diferente de","Not sign":"Sinal de não","on with exclamation mark with left right arrow above":"com ponto de exclamação com a seta esquerda direita acima",Overline:"Sobrepor","Paragraph sign":"Símbolo de parágrafo","Partial differential":"Diferencial parcial","Per mille sign":"Símbolo de por 1 mil","Per ten thousand sign":"Símbolo de por 10 mil","Peseta sign":"Símbolo de Peseta","Peso sign":"Sinal de Peso","Plus-minus sign":"Sinal de mais ou menos","Pound sign":"Símbolo de Libra","Proportional to":"Proporcional a","Question exclamation mark":"Ponto de interrogação","Registered sign":"Símbolo de registrado","Reversed paragraph sign":"Símbolo de parágrafo reverso","Right double quotation mark":"Aspas dupla direita","Right single quotation mark":"Aspas simples direita","Right-pointing double angle quotation mark":"Aspas angulares duplas direita","rightwards arrow to bar":"seta para a direita para barra","rightwards dashed arrow":"Seta tracejada para direita","rightwards double arrow":"Seta dupla para direita","Ruble sign":"Símbolo do Rublo Russo","Rupee sign":"Símbolo da Rupia","Section sign":"Símbolo de seleção","Single left-pointing angle quotation mark":"Aspas angulares simples esquerda","Single low-9 quotation mark":"Aspas baixas simples","Single right-pointing angle quotation mark":"Aspas angulares simples direita","soon with rightwards arrow above":"Símbolo soon com a seta para a direita acima","Special characters":"Caracteres especiais","Spesmilo sign":"Símbolo do Spesmilo","Square root":"Raiz quadrada","Tenge sign":"Símbolo do Tenge","There exists":"Existe","Tilde operator":"Operador til","top with upwards arrow above":"Símbolo topo com a seta para cima acima","Trade mark sign":"Símbolo de marca registrada","Tugrik sign":"Símbolo de Tugrik","Turkish lira sign":"Símbolo da Lira Turca","Two dot leader":"Dois pontos",Union:"União","up down arrow with base":"seta para baixo com base","upwards arrow to bar":"seta para cima para barra","upwards dashed arrow":"Seta tracejada para cima","upwards double arrow":"Seta dupla para cima","Vulgar fraction one half":"Fração um meio","Vulgar fraction one quarter":"Fração um quarto","Vulgar fraction three quarters":"Fração três quartos","Won sign":"Símbolo do Won","Yen sign":"Símbolo do Yen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(r){const e=r["pt-br"]=r["pt-br"]||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 de %1",Aquamarine:"Água-marinha",Black:"Preto",Blue:"Azul",Cancel:"Cancelar","Dim grey":"Cinza escuro","Dropdown toolbar":"Barra de Ferramentas da Lista Suspensa","Edit block":"Editor de bloco","Editor toolbar":"Ferramentas do Editor",Green:"Verde",Grey:"Cinza","Insert paragraph after block":"Inserir parágrafo após o bloco","Insert paragraph before block":"Inserir parágrafo antes do bloco","Light blue":"Azul claro","Light green":"Verde claro","Light grey":"Cinza claro",Next:"Próximo",Orange:"Laranja",Previous:"Anterior",Purple:"Púrpura",Red:"Vermelho",Redo:"Refazer","Remove color":"Remover cor","Restore default":"","Rich Text Editor":"Editor de Formatação","Rich Text Editor, %0":"Editor de Formatação, %0",Save:"Salvar","Select all":"Selecionar tudo","Show more items":"Exibir mais itens",Turquoise:"Turquesa",Undo:"Desfazer","Upload in progress":"Enviando dados",White:"Branco","Widget toolbar":"Ferramentas de Widgets",Yellow:"Amarelo"}),e.getPluralForm=function(r){return r>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/pt.js b/core/assets/vendor/ckeditor5/translations/pt.js
new file mode 100644
index 0000000000000000000000000000000000000000..9339e80932db1f02b9ed129b6336c626cbfb1b9d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/pt.js
@@ -0,0 +1 @@
+!function(t){const n=t.pt=t.pt||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Alinhar ao centro","Align left":"Alinhar à esquerda","Align right":"Alinhar à direita",Justify:"Justificar","Text alignment":"Alinhamento de texto","Text alignment toolbar":"Ferramentas de alinhamento de texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.pt=i.pt||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Negrito",Code:"Código",Italic:"Itálico",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.pt=a.pt||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"",Heading:"Cabeçalho","Heading 1":"Cabeçalho 1","Heading 2":"Cabeçalho 2","Heading 3":"Cabeçalho 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Parágrafo","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.pt=e.pt||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Imagem centrada","Change image text alternative":"","Enter image caption":"Indicar legenda da imagem","Full size image":"Imagem em tamanho completo","Image resize list":"","Image toolbar":"","image widget":"módulo de imagem","In line":"",Insert:"","Insert image":"Inserir imagem","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"Imagem lateral","Text alternative":"Texto alternativo",Update:"","Update image URL":"","Upload failed":"Falha ao carregar","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.pt=i.pt||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"","Edit link":"",Link:"Hiperligação","Link image":"","Link URL":"URL da ligação","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"Desligar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.pt=e.pt||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Lista não ordenada","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Lista ordenada","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.pt=e.pt||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Cancelar","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Refazer","Remove color":"","Restore default":"","Rich Text Editor":"Editor de texto avançado","Rich Text Editor, %0":"Editor de texto avançado, %0",Save:"Guardar","Show more items":"",Turquoise:"",Undo:"Desfazer",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/ro.js b/core/assets/vendor/ckeditor5/translations/ro.js
new file mode 100644
index 0000000000000000000000000000000000000000..82d9e6e35fc4261d6d5ef9b0bf73f4dfa40a7665
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/ro.js
@@ -0,0 +1 @@
+!function(i){const n=i.ro=i.ro||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Aliniază la centru","Align left":"Aliniază la stânga","Align right":"Aliniază la dreapta",Justify:"Aliniază stânga-dreapta","Text alignment":"Aliniere text","Text alignment toolbar":"Bara aliniere text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ro=i.ro||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Îngroșat",Code:"Cod",Italic:"Cursiv",Strikethrough:"Tăiere text cu o linie",Subscript:"Indice",Superscript:"Exponent",Underline:"Subliniat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.ro=o.ro||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Bloc citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.ro=i.ro||{};t.dictionary=Object.assign(t.dictionary||{},{"Choose heading":"Alege titlu",Heading:"Titlu","Heading 1":"Titlu 1","Heading 2":"Titlu 2","Heading 3":"Titlu 3","Heading 4":"Titlu 4","Heading 5":"Titlu 5","Heading 6":"Titlu 6",Paragraph:"Paragraf","Type or paste your content here.":"Scrie sau inserează aici conținutul tău","Type your title":"Scrie titlul tău"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ro=i.ro||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Linie orizontală"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i.ro=i.ro||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"","Centered image":"Imagine aliniată pe centru","Change image text alternative":"Schimbă textul alternativ al imaginii","Enter image caption":"Introdu titlul descriptiv al imaginii","Full size image":"Imagine mărime completă","Image resize list":"Lista cu mărimi de redimensionare","Image toolbar":"Bară imagine","image widget":"widget imagine","In line":"",Insert:"Inserează","Insert image":"Inserează imagine","Insert image via URL":"Inserează o imagine via URL","Left aligned image":"Imagine aliniată la stânga",Original:"Original","Resize image":"Redimensionează imaginea","Resize image to %0":"Redimensionează imaginea la %0","Resize image to the original size":"Redimensionează imaginea la mărimea originală","Right aligned image":"Imagine aliniată la dreapta","Side image":"Imagine laterală","Text alternative":"Text alternativ",Update:"Actualizează","Update image URL":"Actualizează o imagine via URL","Upload failed":"Încărcare eșuată","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ro=n.ro||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Micșorează indent","Increase indent":"Mărește indent"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.ro=a.ro||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose language":"Alege limba",Language:"Limbă","Remove language":"Șterge limba"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ro=n.ro||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Descărcabil","Edit link":"Modifică link",Link:"Link","Link image":"Link imagine","Link URL":"Link URL","Open in a new tab":"Deschide în tab nou","Open link in new tab":"Deschide link în tab nou","This link has no URL":"Acest link nu are niciun URL",Unlink:"Șterge link"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const i=t.ro=t.ro||{};i.dictionary=Object.assign(i.dictionary||{},{"Bulleted List":"Listă cu puncte","Bulleted list styles toolbar":"Toolbar Listă cu puncte",Circle:"Cerc",Decimal:"Număr","Decimal with leading zero":"Număr cu zero la început ",Disc:"Disc","Lower-latin":"Litere mici latine","Lower–roman":"Litere mici romane","Numbered List":"Listă numerotată","Numbered list styles toolbar":"Toolbar Listă numerotată",Square:"Pătrat","To-do List":"Listă cu activități","Toggle the circle list style":"Comutați stilul la lista cu cercuri","Toggle the decimal list style":"Comutați stilul la lista cu numere","Toggle the decimal with leading zero list style":"Comutați stilul la lista cu numere cu zero la început","Toggle the disc list style":"Comutați stilul la lista cu discuri","Toggle the lower–latin list style":"Comutați stilul la lista cu litere mici latine","Toggle the lower–roman list style":"Comutați stilul la lista cu litere mici romane","Toggle the square list style":"Comutați stilul la lista cu pătrate","Toggle the upper–latin list style":"Comutați stilul la lista cu litere mari latine","Toggle the upper–roman list style":"Comutați stilul la lista cu litere mari romane","Upper-latin":"Litere mari latine","Upper-roman":"Litere mari romane"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.ro=o.ro||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"Șterge formatare"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ro=e.ro||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Alinează textul celulei jos","Align cell text to the center":"Alinează textul celulei la centru","Align cell text to the left":"Alinează textul celulei la stânga","Align cell text to the middle":"Alinează textul celulei la mijloc","Align cell text to the right":"Alinează textul celulei la dreapta","Align cell text to the top":"Alinează textul celulei sus","Align table to the left":"Alinează tabela la stânga","Align table to the right":"Alinează tabela la dreapta",Alignment:"Aliniere",Background:"Fundal",Border:"Bordură","Cell properties":"Proprietățile celulei","Center table":"Tabelă centrată",Color:"Culoare","Color picker":"Alegere culoare",Column:"Coloană",Dashed:"Linii întrerupte","Delete column":"Șterge coloană","Delete row":"Șterge rând",Dimensions:"Dimensiuni",Dotted:"Punctată",Double:"Dublă","Enter table caption":"Adaugă subtitlul tabelei",Groove:"Groove","Header column":"Antet coloană","Header row":"Rând antet",Height:"Înălțime","Horizontal text alignment toolbar":"Toolbar aliniere text orizontală","Insert column left":"Inserează coloană la stânga","Insert column right":"Inserează coloană la dreapta","Insert row above":"Inserează rând deasupra","Insert row below":"Inserează rând dedesubt","Insert table":"Inserează tabel",Inset:"Inserează","Justify cell text":"Textul celulei justify","Merge cell down":"Îmbină celula în jos","Merge cell left":"Îmbină celula la stânga","Merge cell right":"Îmbină celula la dreapta","Merge cell up":"Îmbină celula în sus","Merge cells":"Îmbină celulele",None:"Nimic",Outset:"Elimină",Padding:"Spațiere",Ridge:"Crestată",Row:"Rând","Select column":"Selectează coloana","Select row":"Selectează linia",Solid:"Solidă","Split cell horizontally":"Scindează celula pe orizontală","Split cell vertically":"Scindează celula pe verticală",Style:"Stil","Table alignment toolbar":"Toolbar aliniere tabelă","Table cell text alignment":"Alinierea textului celulei tabelei","Table properties":"Proprietățile tabelei","Table toolbar":"Bară tabel",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Culoarea este invalidă. Încearcă "#FF0000" sau "rgb(255,0,0)" sau "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Valoarea este invalidă. Încearcă "10px" sau "2em" sau simplu "2".',"Toggle caption off":"Dezactivați subtitlul","Toggle caption on":"Activați subtitlul","Vertical text alignment toolbar":"Toolbar aliniere text verticală",Width:"Lungime"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.ro=e.ro||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 din %1",Aquamarine:"Acvamarin",Black:"Negru",Blue:"Albastru",Cancel:"Anulare","Dim grey":"Gri slab","Dropdown toolbar":"Bară listă opțiuni","Edit block":"Editează bloc","Editor toolbar":"Bară editor",Green:"Verde",Grey:"Gri","Insert paragraph after block":"Inserează un paragraf după bloc","Insert paragraph before block":"Inserează un paragraf înaintea blocului","Light blue":"Albastru deschis","Light green":"Verde deschis","Light grey":"Gri deschis",Next:"Înainte",Orange:"Portocaliu",Previous:"Înapoi",Purple:"Violet",Red:"Roșu",Redo:"Revenire","Remove color":"Șterge culoare","Restore default":"Reface la default","Rich Text Editor":"Editor de text","Rich Text Editor, %0":"Editor de text, %0",Save:"Salvare","Select all":"Selectează-le pe toate","Show more items":"Arată mai multe elemente",Turquoise:"Turcoaz",Undo:"Anulare","Upload in progress":"Încărcare în curs",White:"Alb","Widget toolbar":"Bară widget",Yellow:"Galben"}),r.getPluralForm=function(e){return 1==e?0:e%100>19||e%100==0&&0!=e?2:1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/ru.js b/core/assets/vendor/ckeditor5/translations/ru.js
new file mode 100644
index 0000000000000000000000000000000000000000..d894fd48bbd6a8332773661be12fb9d16056be99
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/ru.js
@@ -0,0 +1 @@
+!function(n){const i=n.ru=n.ru||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Выравнивание по центру","Align left":"Выравнивание по левому краю","Align right":"Выравнивание по правому краю",Justify:"Выравнивание по ширине","Text alignment":"Выравнивание текста","Text alignment toolbar":"Выравнивание"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Жирный",Code:"Исходный код",Italic:"Курсив",Strikethrough:"Зачеркнутый",Subscript:"Подстрочный",Superscript:"Надстрочный",Underline:"Подчеркнутый"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитата"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ru=n.ru||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Выбор стиля",Heading:"Стиль","Heading 1":"Заголовок 1","Heading 2":"Заголовок 2","Heading 3":"Заголовок 3","Heading 4":"Заголовок 4","Heading 5":"Заголовок 5","Heading 6":"Заголовок 6",Paragraph:"Параграф","Type or paste your content here.":"Введите или вставьте сюда ваш текст","Type your title":"Введите заголовок"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Горизонтальная линия"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ru=e.ru||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"Разрывать текст","Centered image":"Выравнивание по центру","Change image text alternative":"Редактировать альтернативный текст","Enter image caption":"Подпись к изображению","Full size image":"Оригинальный размер изображения","Image resize list":"Список размеров","Image toolbar":"Панель инструментов изображения","image widget":"Виджет изображений","In line":"В тексте",Insert:"Вставить","Insert image":"Вставить изображение","Insert image via URL":"Вставить изображение по URL","Left aligned image":"Выравнивание по левому краю",Original:"Оригинальный","Resize image":"Изменить размер изображения","Resize image to %0":"Изменить размер изображения до %0","Resize image to the original size":"Вернуть размер изображения к оригинальному","Right aligned image":"Выравнивание по правому краю","Side image":"Боковое изображение","Text alternative":"Альтернативный текст",Update:"Изменить","Update image URL":"Изменить URL изображения","Upload failed":"Загрузка не выполнена","Wrap text":"Обтекать текст"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ru=n.ru||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Уменьшить отступ","Increase indent":"Увеличить отступ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.ru=n.ru||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Выбрать язык",Language:"Язык","Remove language":"Убрать язык"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ru=n.ru||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Загружаемые","Edit link":"Редактировать ссылку",Link:"Ссылка","Link image":"Ссылка на изображение","Link URL":"Ссылка URL","Open in a new tab":"Открыть в новой вкладке","Open link in new tab":"Открыть ссылку в новой вкладке","This link has no URL":"Для этой ссылки не установлен адрес URL",Unlink:"Убрать ссылку"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ru=e.ru||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Маркированный список","Bulleted list styles toolbar":"Стили маркированного списка",Circle:"Окружность",Decimal:"Десятичный","Decimal with leading zero":"Десятичный с ведущим нулем",Disc:"Диск","Lower-latin":"Малые латинские","Lower–roman":"Малые римские","Numbered List":"Нумерованный список","Numbered list styles toolbar":"Стили нумерованного списка",Square:"Квадрат","To-do List":"Список задач","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"Большие латинские","Upper-roman":"Большие римские"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"Убрать форматирование"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"HTML редактор"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ru=e.ru||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Выровнять текст ячейки по нижнему краю","Align cell text to the center":"Выровнять текст по центру","Align cell text to the left":"Выровнять текст по левому краю","Align cell text to the middle":"Выровнять текст ячейки по центру","Align cell text to the right":"Выровнять текст по правому краю","Align cell text to the top":"Выровнять текст ячейки по верхнему краю","Align table to the left":"Выровнять таблицу по левому краю","Align table to the right":"Выровнять таблицу по правому краю",Alignment:"Выравнивание",Background:"Фон",Border:"Граница","Cell properties":"Свойства ячейки","Center table":"Выровнять таблицу по центру",Color:"Цвет","Color picker":"Выбор цвета",Column:"Столбец",Dashed:"Пунктирная","Delete column":"Удалить столбец","Delete row":"Удалить строку",Dimensions:"Размеры",Dotted:"Точечная",Double:"Двойная","Enter table caption":"Подпись таблицы",Groove:"Желобчатая","Header column":"Столбец заголовков","Header row":"Строка заголовков",Height:"Высота","Horizontal text alignment toolbar":"Панель инструментов горизонтального выравнивания текста","Insert column left":"Вставить столбец слева","Insert column right":"Вставить столбец справа","Insert row above":"Вставить строку выше","Insert row below":"Вставить строку ниже","Insert table":"Вставить таблицу",Inset:"Вдавленная","Justify cell text":"Выровнять текст по ширине","Merge cell down":"Объединить с ячейкой снизу","Merge cell left":"Объединить с ячейкой слева","Merge cell right":"Объединить с ячейкой справа","Merge cell up":"Объединить с ячейкой сверху","Merge cells":"Объединить ячейки",None:"Нет",Outset:"Выпуклая",Padding:"Отступ",Ridge:"Ребристая",Row:"Строка","Select column":"Выбрать столбец","Select row":"Выбрать строку",Solid:"Сплошная","Split cell horizontally":"Разделить ячейку горизонтально","Split cell vertically":"Разделить ячейку вертикально",Style:"Стиль","Table alignment toolbar":"Панель инструментов выравнивания таблицы","Table cell text alignment":"Выравнивание текста в ячейке таблицы","Table properties":"Свойства таблицы","Table toolbar":"Панель инструментов таблицы",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Неверный цвет. Попробуйте "#FF0000" или "rgb(255,0,0)" или "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Неверное значение. Попробуйте "10px" или "2em" или просто "2".',"Toggle caption off":"Выключить описание","Toggle caption on":"Включить описание","Vertical text alignment toolbar":"Панель инструментов вертикального выравнивания текста",Width:"Ширина"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{"HTML object":"HTML объект"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t.ru=t.ru||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"",Angle:"","Approximately equal to":"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"","Bitcoin sign":"","Cedi sign":"","Cent sign":"","Character categories":"Категории","Colon sign":"","Contains as member":"","Copyright sign":"","Cruzeiro sign":"","Currency sign":"","Degree sign":"","Division sign":"","Dollar sign":"","Dong sign":"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","Drachma sign":"","Element of":"","Em dash":"","Empty set":"","En dash":"","end with leftwards arrow above":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","For all":"","Fraction slash":"","French franc sign":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"","Guarani sign":"","Horizontal ellipsis":"","Hryvnia sign":"","Identical to":"","Indian rupee sign":"",Infinity:"",Integral:"",Intersection:"","Inverted exclamation mark":"","Inverted question mark":"","Kip sign":"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin capital letter c with caron":"","Latin capital letter c with circumflex":"","Latin capital letter c with dot above":"","Latin capital letter d with caron":"","Latin capital letter d with stroke":"","Latin capital letter e with breve":"","Latin capital letter e with caron":"","Latin capital letter e with dot above":"","Latin capital letter e with macron":"","Latin capital letter e with ogonek":"","Latin capital letter eng":"","Latin capital letter g with breve":"","Latin capital letter g with cedilla":"","Latin capital letter g with circumflex":"","Latin capital letter g with dot above":"","Latin capital letter h with circumflex":"","Latin capital letter h with stroke":"","Latin capital letter i with breve":"","Latin capital letter i with dot above":"","Latin capital letter i with macron":"","Latin capital letter i with ogonek":"","Latin capital letter i with tilde":"","Latin capital letter j with circumflex":"","Latin capital letter k with cedilla":"","Latin capital letter l with acute":"","Latin capital letter l with caron":"","Latin capital letter l with cedilla":"","Latin capital letter l with middle dot":"","Latin capital letter l with stroke":"","Latin capital letter n with acute":"","Latin capital letter n with caron":"","Latin capital letter n with cedilla":"","Latin capital letter o with breve":"","Latin capital letter o with double acute":"","Latin capital letter o with macron":"","Latin capital letter r with acute":"","Latin capital letter r with caron":"","Latin capital letter r with cedilla":"","Latin capital letter s with acute":"","Latin capital letter s with caron":"","Latin capital letter s with cedilla":"","Latin capital letter s with circumflex":"","Latin capital letter t with caron":"","Latin capital letter t with cedilla":"","Latin capital letter t with stroke":"","Latin capital letter u with breve":"","Latin capital letter u with double acute":"","Latin capital letter u with macron":"","Latin capital letter u with ogonek":"","Latin capital letter u with ring above":"","Latin capital letter u with tilde":"","Latin capital letter w with circumflex":"","Latin capital letter y with circumflex":"","Latin capital letter y with diaeresis":"","Latin capital letter z with acute":"","Latin capital letter z with caron":"","Latin capital letter z with dot above":"","Latin capital ligature ij":"","Latin capital ligature oe":"","Latin small letter a with breve":"","Latin small letter a with macron":"","Latin small letter a with ogonek":"","Latin small letter c with acute":"","Latin small letter c with caron":"","Latin small letter c with circumflex":"","Latin small letter c with dot above":"","Latin small letter d with caron":"","Latin small letter d with stroke":"","Latin small letter dotless i":"","Latin small letter e with breve":"","Latin small letter e with caron":"","Latin small letter e with dot above":"","Latin small letter e with macron":"","Latin small letter e with ogonek":"","Latin small letter eng":"","Latin small letter f with hook":"","Latin small letter g with breve":"","Latin small letter g with cedilla":"","Latin small letter g with circumflex":"","Latin small letter g with dot above":"","Latin small letter h with circumflex":"","Latin small letter h with stroke":"","Latin small letter i with breve":"","Latin small letter i with macron":"","Latin small letter i with ogonek":"","Latin small letter i with tilde":"","Latin small letter j with circumflex":"","Latin small letter k with cedilla":"","Latin small letter kra":"","Latin small letter l with acute":"","Latin small letter l with caron":"","Latin small letter l with cedilla":"","Latin small letter l with middle dot":"","Latin small letter l with stroke":"","Latin small letter long s":"","Latin small letter n preceded by apostrophe":"","Latin small letter n with acute":"","Latin small letter n with caron":"","Latin small letter n with cedilla":"","Latin small letter o with breve":"","Latin small letter o with double acute":"","Latin small letter o with macron":"","Latin small letter r with acute":"","Latin small letter r with caron":"","Latin small letter r with cedilla":"","Latin small letter s with acute":"","Latin small letter s with caron":"","Latin small letter s with cedilla":"","Latin small letter s with circumflex":"","Latin small letter t with caron":"","Latin small letter t with cedilla":"","Latin small letter t with stroke":"","Latin small letter u with breve":"","Latin small letter u with double acute":"","Latin small letter u with macron":"","Latin small letter u with ogonek":"","Latin small letter u with ring above":"","Latin small letter u with tilde":"","Latin small letter w with circumflex":"","Latin small letter y with circumflex":"","Latin small letter z with acute":"","Latin small letter z with caron":"","Latin small letter z with dot above":"","Latin small ligature ij":"","Latin small ligature oe":"","Left double quotation mark":"","Left single quotation mark":"","Left-pointing double angle quotation mark":"","leftwards arrow to bar":"","leftwards dashed arrow":"","leftwards double arrow":"","Less-than or equal to":"","Less-than sign":"","Lira sign":"","Livre tournois sign":"","Logical and":"","Logical or":"",Macron:"","Manat sign":"","Mill sign":"","Minus sign":"","Multiplication sign":"","N-ary product":"","N-ary summation":"",Nabla:"","Naira sign":"","New sheqel sign":"","Nordic mark sign":"","Not an element of":"","Not equal to":"","Not sign":"","on with exclamation mark with left right arrow above":"",Overline:"","Paragraph sign":"","Partial differential":"","Per mille sign":"","Per ten thousand sign":"","Peseta sign":"","Peso sign":"","Plus-minus sign":"","Pound sign":"","Proportional to":"","Question exclamation mark":"","Registered sign":"","Reversed paragraph sign":"","Right double quotation mark":"","Right single quotation mark":"","Right-pointing double angle quotation mark":"","rightwards arrow to bar":"","rightwards dashed arrow":"","rightwards double arrow":"","Ruble sign":"","Rupee sign":"","Section sign":"","Single left-pointing angle quotation mark":"","Single low-9 quotation mark":"","Single right-pointing angle quotation mark":"","soon with rightwards arrow above":"","Special characters":"Спецсимволы","Spesmilo sign":"","Square root":"","Tenge sign":"","There exists":"","Tilde operator":"","top with upwards arrow above":"","Trade mark sign":"","Tugrik sign":"","Turkish lira sign":"","Two dot leader":"",Union:"","up down arrow with base":"","upwards arrow to bar":"","upwards dashed arrow":"","upwards double arrow":"","Vulgar fraction one half":"","Vulgar fraction one quarter":"","Vulgar fraction three quarters":"","Won sign":"","Yen sign":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.ru=e.ru||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 из %1",Aquamarine:"Аквамариновый",Black:"Чёрный",Blue:"Синий",Cancel:"Отмена","Dim grey":"Тёмно-серый","Dropdown toolbar":"Выпадающая панель инструментов","Edit block":"Редактировать блок","Editor toolbar":"Панель инструментов редактора",Green:"Зелёный",Grey:"Серый","Insert paragraph after block":"Вставить параграф после блока","Insert paragraph before block":"Вставить параграф перед блоком","Light blue":"Голубой","Light green":"Салатовый","Light grey":"Светло-серый",Next:"Следующий",Orange:"Оранжевый",Previous:"Предыдущий",Purple:"Фиолетовый",Red:"Красный",Redo:"Повторить","Remove color":"Убрать цвет","Restore default":"По умолчанию","Rich Text Editor":"Редактор","Rich Text Editor, %0":"Редактор, %0",Save:"Сохранить","Select all":"Выбрать все","Show more items":"Другие инструменты",Turquoise:"Бирюзовый",Undo:"Отменить","Upload in progress":"Идёт загрузка",White:"Белый","Widget toolbar":"Панель инструментов виджета",Yellow:"Жёлтый"}),r.getPluralForm=function(e){return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?1:e%10==0||e%10>=5&&e%10<=9||e%100>=11&&e%100<=14?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/si.js b/core/assets/vendor/ckeditor5/translations/si.js
new file mode 100644
index 0000000000000000000000000000000000000000..e6af8b2a9d833d5d2deb474337aa675cc9e796cb
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/si.js
@@ -0,0 +1 @@
+!function(i){const n=i.si=i.si||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"තදකුරු",Code:"",Italic:"ඇලකුරු",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.si=e.si||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"","Enter image caption":"","Full size image":"","Image resize list":"","Image toolbar":"","image widget":"","In line":"",Insert:"","Insert image":"පින්තූරය ඇතුල් කරන්න","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"","Text alternative":"",Update:"","Update image URL":"","Upload failed":"උඩුගත කිරීම අසාර්ථක විය","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.si=e.si||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"බුලටිත ලැයිස්තුව","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"අංකිත ලැයිස්තුව","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.si=n.si||{};i.dictionary=Object.assign(i.dictionary||{},{Redo:"නැවත කරන්න",Undo:"අහෝසි කරන්න"}),i.getPluralForm=function(n){return 1!=n}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/sk.js b/core/assets/vendor/ckeditor5/translations/sk.js
new file mode 100644
index 0000000000000000000000000000000000000000..dc3ddbac9037ab08a06d77a88554e7e7598fd8dc
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/sk.js
@@ -0,0 +1 @@
+!function(n){const a=n.sk=n.sk||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Zarovnať na stred","Align left":"Zarovnať vľavo","Align right":"Zarovnať vpravo",Justify:"Do bloku","Text alignment":"Zarovnanie textu","Text alignment toolbar":"Panel nástrojov zarovnania textu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sk=n.sk||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Tučné",Code:"Kód",Italic:"Kurzíva",Strikethrough:"Preškrtnuté",Subscript:"Dolný index",Superscript:"Horný index",Underline:"Podčiarknuté"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sk=i.sk||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citát"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const a=i.sk=i.sk||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"Vyberte nadpis",Heading:"Nadpis","Heading 1":"Nadpis 1","Heading 2":"Nadpis 2","Heading 3":"Nadpis 3","Heading 4":"Nadpis 4","Heading 5":"Nadpis 5","Heading 6":"Nadpis 6",Paragraph:"Odsek","Type or paste your content here.":"Vložte obsah","Type your title":"Vložte nadpis"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sk=i.sk||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Vodorovná čiara"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.sk=e.sk||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Zarovnať na stred","Change image text alternative":"Zmeňte alternatívny text obrázka","Enter image caption":"Vložte popis obrázka","Full size image":"Obrázok v plnej veľkosti","Image resize list":"Zoznam možností zmeny veľkosti","Image toolbar":"Panel nástrojov obrázka","image widget":"widget obrázka","In line":"",Insert:"Vložiť","Insert image":"Vložiť obrázok","Insert image via URL":"Vložiť obrázok pomocou URL","Left aligned image":"Zarovnať vľavo",Original:"Originál","Resize image":"Zmeniť veľkosť obrázka","Resize image to %0":"Zmeniť veľkosť na %0","Resize image to the original size":"Zmeniť veľkosť na pôvodnú","Right aligned image":"Zarovnať vpravo","Side image":"Bočný obrázok","Text alternative":"Alternatívny text",Update:"Aktualizovať","Update image URL":"Aktualizovať URL obrázka","Upload failed":"Nahrávanie zlyhalo","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sk=n.sk||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Zmenšiť odsadenie","Increase indent":"Zväčšiť odsadenie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const n=a.sk=a.sk||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Vybrať jazyk",Language:"Jazyk","Remove language":"Odstrániť jazyk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sk=n.sk||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Na stiahnutie","Edit link":"Upraviť odkaz",Link:"Odkaz","Link image":"Adresa obrázku","Link URL":"URL adresa","Open in a new tab":"Otvoriť v novej záložke","Open link in new tab":"Otvoriť odkaz v novom okne","This link has no URL":"Tento odkaz nemá nastavenú URL adresu",Unlink:"Zrušiť odkaz"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.sk=e.sk||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Zoznam s odrážkami","Bulleted list styles toolbar":"Panel zoznamu s odrážkami",Circle:"Kruh",Decimal:"Čísla","Decimal with leading zero":"Čísla s nulou na začiatku",Disc:"Plný kruh","Lower-latin":"Malé písmená","Lower–roman":"Malé rímske čísla","Numbered List":"Číslovaný zoznam","Numbered list styles toolbar":"Panel so štýlmi číslovaného zoznamu",Square:"Štvorec","To-do List":"To-do zoznam","Toggle the circle list style":"Prepnúť na zoznam s kruhovým označením","Toggle the decimal list style":"Prepnúť na číselný zoznam","Toggle the decimal with leading zero list style":"Prepnúť na číselný zoznam s nulou na začiatku","Toggle the disc list style":"Prepnúť na zoznam s označením plného kruhu","Toggle the lower–latin list style":"Prepnúť na zoznam s malými písmenami","Toggle the lower–roman list style":"Prepnúť na zoznam s malými rímskymi číslami","Toggle the square list style":"Prepnúť na zoznam so štvorcovým označením","Toggle the upper–latin list style":"Prepnúť na zoznam s veľkými písmenami","Toggle the upper–roman list style":"Prepnúť na zoznam s veľkými rímskymi číslami","Upper-latin":"Veľké písmená","Upper-roman":"Veľké rímske čísla"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.sk=i.sk||{};o.dictionary=Object.assign(o.dictionary||{},{"Remove Format":"Vyčistiť formátovanie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.sk=e.sk||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Zarovnať text bunky nadol","Align cell text to the center":"Zarovnať text bunky na stred","Align cell text to the left":"Zarovnať text bunky doľava","Align cell text to the middle":"Zarovnať text bunky na stred","Align cell text to the right":"Zarovnať text bunky doprava","Align cell text to the top":"Zarovnať text bunky nahor","Align table to the left":"Zarovnať tabuľku doľava","Align table to the right":"Zarovnať tabuľku doprava",Alignment:"Zarovnanie",Background:"Pozadie",Border:"Orámovanie","Cell properties":"Vlastnosti bunky","Center table":"Centrovať tabuľku",Color:"Farba","Color picker":"Vybrať farbu",Column:"Stĺpec",Dashed:"Čiarkovaná","Delete column":"Odstrániť stĺpec","Delete row":"Odstrániť riadok",Dimensions:"Rozmery",Dotted:"Bodkovaná",Double:"Dvojitá","Enter table caption":"",Groove:"Drážkovaná","Header column":"Stĺpec hlavičky","Header row":"Riadok hlavičky",Height:"Výška","Horizontal text alignment toolbar":"Horizontálne zarovnanie textu v panely","Insert column left":"Vložiť stĺpec vľavo","Insert column right":"Vložiť stĺpec vpravo","Insert row above":"Vložiť riadok nad","Insert row below":"Vložiť riadok pod","Insert table":"Vložiť tabuľku",Inset:"Vložená z vnútra","Justify cell text":"Zarovnať text bunky z oboch strán","Merge cell down":"Zlúčiť bunku dole","Merge cell left":"Zlúčiť bunku vľavo","Merge cell right":"Zlúčiť bunku vpravo","Merge cell up":"Zlúčiť bunku hore","Merge cells":"Zlúčiť bunky",None:"Žiadna",Outset:"Vložená zvonku",Padding:"Vnútorný okraj",Ridge:"Rámovaná",Row:"Riadok","Select column":"Vybrať stĺpec","Select row":"Vybrať riadok",Solid:"Plná","Split cell horizontally":"Rozdeliť bunku vodorovne","Split cell vertically":"Rozdeliť bunku zvislo",Style:"Štýl","Table alignment toolbar":"Panel zarovnania tabuľky","Table cell text alignment":"Zarovnanie textu v bunke","Table properties":"Vlastnosti tabuľky","Table toolbar":"Panel nástrojov tabuľky",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Farba má nesprávny formát. Skúste "#FF0000", "rgb(255,0,0)" alebo "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Hodnota je nesprávna. Skúste "10px", "2em" alebo jednoducho "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Vertikálne zarovnanie textu v panely",Width:"Šírka"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const t=a.sk=a.sk||{};t.dictionary=Object.assign(t.dictionary||{},{"Almost equal to":"Čiastočne rovný",Angle:"Uhol","Approximately equal to":"Aproximácia","Asterisk operator":"Hviezdička / násobenie","Austral sign":"Znak Austral","back with leftwards arrow above":"Šípka späť","Bitcoin sign":"Mena Bitcoin","Cedi sign":"Znak Cedi","Cent sign":"Znak cent","Character categories":"Kategórie znakov","Colon sign":"Dvojbodka","Contains as member":"Obsahuje prvok","Copyright sign":"Copyright","Cruzeiro sign":"Mena Cruzeiro","Currency sign":"Znak meny","Degree sign":"Znak stupeň","Division sign":"Delenie","Dollar sign":"Znak Dolár","Dong sign":"Znak Dong","Double dagger":"Dvojkríž","Double exclamation mark":"Dvojitý výkričník","Double low-9 quotation mark":"Dvojitá spodná uvodzovka","Double question mark":"Dvojitý otáznik","downwards arrow to bar":"šípka nadol do zvislej čiary","downwards dashed arrow":"prerušovaná šípka nadol","downwards double arrow":"dvojitá šípka nadol","Drachma sign":"Znak Drachma","Element of":"Patrí / Je súčasťou","Em dash":"Dlhá pomĺčka","Empty set":"Prázdna množina","En dash":"Pomĺčka","end with leftwards arrow above":"Šípka koniec","Euro sign":"Znak Euro","Euro-currency sign":"Mena Euro","Exclamation question mark":"Výkričník a otáznik","For all":"Pre všetky prvky v množine","Fraction slash":"Lomítko / Delenie","French franc sign":"Mena Francúzsky Frank","German penny sign":"Nemecká penny","Greater-than or equal to":"Väčší alebo rovný","Greater-than sign":"Väčší ako","Guarani sign":"Znak Guarani","Horizontal ellipsis":"Trojbodka","Hryvnia sign":"Znak Hryvnia","Identical to":"Identický k","Indian rupee sign":"Znak Indická rupia",Infinity:"Nekonečno",Integral:"Integrál",Intersection:"Priesečník / Prienik","Inverted exclamation mark":"Obrátený výkričník","Inverted question mark":"Obrátený otáznik","Kip sign":"Znak Kip","Latin capital letter a with breve":"Latinské veľké písmeno a s mäkčeňom","Latin capital letter a with macron":"Latinské veľké písmeno a s čiarou","Latin capital letter a with ogonek":"Latinské veľké písmeno a s háčikom","Latin capital letter c with acute":"Latinské veľké písmeno c s dĺžňom","Latin capital letter c with caron":"Latinské veľké písmeno c s mäkčeňom","Latin capital letter c with circumflex":"Latinské veľké písmeno c s obráteným mäkčeňom","Latin capital letter c with dot above":"Latinské veľké písmeno c s bodkou nad znakom","Latin capital letter d with caron":"Latinské veľké písmeno d s mäkčeňom","Latin capital letter d with stroke":"Latinské veľké písmeno d s prečiarknutím","Latin capital letter e with breve":"Latinské veľké písmeno e s mäkčeňom","Latin capital letter e with caron":"Latinské veľké písmeno e s mäkčeňom","Latin capital letter e with dot above":"Latinské veľké písmeno e s bodkou nad znakom","Latin capital letter e with macron":"Latinské veľké písmeno e s čiarou","Latin capital letter e with ogonek":"Latinské veľké písmeno e s háčikom","Latin capital letter eng":"Latinské veľké písmeno Eng","Latin capital letter g with breve":"Latinské veľké písmeno g s mäkčeňom","Latin capital letter g with cedilla":"Latinské veľké písmeno g s háčikom","Latin capital letter g with circumflex":"Latinské veľké písmeno g s obráteným mäkčeňom","Latin capital letter g with dot above":"Latinské veľké písmeno g s bodkou nad znakom","Latin capital letter h with circumflex":"Latinské veľké písmeno h s obráteným mäkčeňom","Latin capital letter h with stroke":"Latinské veľké písmeno h s prečiarknutím","Latin capital letter i with breve":"Latinské veľké písmeno i s mäkčeňom","Latin capital letter i with dot above":"Latinské veľké písmeno i s bodkou nad znakom","Latin capital letter i with macron":"Latinské veľké písmeno i s čiarou","Latin capital letter i with ogonek":"Latinské veľké písmeno i s háčikom","Latin capital letter i with tilde":"Latinské veľké písmeno i s vlnovkou","Latin capital letter j with circumflex":"Latinské veľké písmeno j s obráteným mäkčeňom","Latin capital letter k with cedilla":"Latinské veľké písmeno k s háčikom","Latin capital letter l with acute":"Latinské veľké písmeno l s dĺžňom","Latin capital letter l with caron":"Latinské veľké písmeno l s mäkčeňom","Latin capital letter l with cedilla":"Latinské veľké písmeno l s háčikom","Latin capital letter l with middle dot":"Latinské veľké písmeno l s bodkou uprostred","Latin capital letter l with stroke":"Latinské veľké písmeno l s prečiarknutím","Latin capital letter n with acute":"Latinské veľké písmeno n s dĺžňom","Latin capital letter n with caron":"Latinské veľké písmeno n s mäkčeňom","Latin capital letter n with cedilla":"Latinské veľké písmeno n s háčikom","Latin capital letter o with breve":"Latinské veľké písmeno o s mäkčeňom","Latin capital letter o with double acute":"Latinské veľké písmeno o s dĺžňom","Latin capital letter o with macron":"Latinské veľké písmeno o s čiarou","Latin capital letter r with acute":"Latinské veľké písmeno r s dĺžňom","Latin capital letter r with caron":"Latinské veľké písmeno r s mäkčeňom","Latin capital letter r with cedilla":"Latinské veľké písmeno r s háčikom","Latin capital letter s with acute":"Latinské veľké písmeno s s dĺžňom","Latin capital letter s with caron":"Latinské veľké písmeno s s mäkčeňom","Latin capital letter s with cedilla":"Latinské veľké písmeno s s háčikom","Latin capital letter s with circumflex":"Latinské veľké písmeno s s obráteným mäkčeňom","Latin capital letter t with caron":"Latinské veľké písmeno t s mäkčeňom","Latin capital letter t with cedilla":"Latinské veľké písmeno t s háčikom","Latin capital letter t with stroke":"Latinské veľké písmeno t s prečiarknutím","Latin capital letter u with breve":"Latinské veľké písmeno u s mäkčeňom","Latin capital letter u with double acute":"Latinské veľké písmeno u s dvojitým dĺžňom","Latin capital letter u with macron":"Latinské veľké písmeno u s čiarou","Latin capital letter u with ogonek":"Latinské veľké písmeno u s háčikom","Latin capital letter u with ring above":"Latinské veľké písmeno u s krúžkom nad znakom","Latin capital letter u with tilde":"Latinské veľké písmeno u s vlnovkou","Latin capital letter w with circumflex":"Latinské veľké písmeno w s obráteným mäkčeňom","Latin capital letter y with circumflex":"Latinské veľké písmeno y s obráteným mäkčeňom","Latin capital letter y with diaeresis":"Latinské veľké písmeno y s dvojbodkou nad znakom","Latin capital letter z with acute":"Latinské veľké písmeno z s dĺžňom","Latin capital letter z with caron":"Latinské veľké písmeno z s mäkčeňom","Latin capital letter z with dot above":"Latinské veľké písmeno z s bodkou nad znakom","Latin capital ligature ij":"Latinský veľký znak ligatúry ij","Latin capital ligature oe":"Latinský veľký znak ligatúry oe","Latin small letter a with breve":"Latinské malé písmeno a s mäkčeňom","Latin small letter a with macron":"Latinské malé písmeno a s čiarou","Latin small letter a with ogonek":"Latinské malé písmeno a s háčikom","Latin small letter c with acute":"Latinské malé písmeno c s dĺžňom","Latin small letter c with caron":"Latinské malé písmeno c s mäkčeňom","Latin small letter c with circumflex":"Latinské malé písmeno c s obráteným mäkčeňom","Latin small letter c with dot above":"Latinské malé písmeno c s bodkou nad znakom","Latin small letter d with caron":"Latinské malé písmeno d s mäkčeňom","Latin small letter d with stroke":"Latinské malé písmeno d s prečiarknutím","Latin small letter dotless i":"Latinské malé písmeno i bez bodky","Latin small letter e with breve":"Latinské malé písmeno e s mäkčeňom","Latin small letter e with caron":"Latinské malé písmeno e s mäkčeňom","Latin small letter e with dot above":"Latinské malé písmeno e s bodkou nad znakom","Latin small letter e with macron":"Latinské malé písmeno e s čiarou","Latin small letter e with ogonek":"Latinské malé písmeno e s háčikom","Latin small letter eng":"Latinské malé písmeno Eng","Latin small letter f with hook":"Funkcia","Latin small letter g with breve":"Latinské malé písmeno g s mäkčeňom","Latin small letter g with cedilla":"Latinské malé písmeno g s háčikom","Latin small letter g with circumflex":"Latinské malé písmeno g s obráteným mäkčeňom","Latin small letter g with dot above":"Latinské malé písmeno g s bodkou nad znakom","Latin small letter h with circumflex":"Latinské malé písmeno h s obráteným mäkčeňom","Latin small letter h with stroke":"Latinské malé písmeno h s prečiarknutím","Latin small letter i with breve":"Latinské malé písmeno i s mäkčeňom","Latin small letter i with macron":"Latinské malé písmeno i s čiarou","Latin small letter i with ogonek":"Latinské malé písmeno i s háčikom","Latin small letter i with tilde":"Latinské malé písmeno i s vlnovkou","Latin small letter j with circumflex":"Latinské malé písmeno j s obráteným mäkčeňom","Latin small letter k with cedilla":"Latinské malé písmeno k s háčikom","Latin small letter kra":"latinský malý znak Kra","Latin small letter l with acute":"Latinské malé písmeno l s dĺžňom","Latin small letter l with caron":"Latinské malé písmeno l s mäkčeňom","Latin small letter l with cedilla":"Latinské malé písmeno l s háčikom","Latin small letter l with middle dot":"Latinské malé písmeno l s bodkou uprostred","Latin small letter l with stroke":"Latinské malé písmeno l s prečiarknutím","Latin small letter long s":"Malé dlhé písmeno s","Latin small letter n preceded by apostrophe":"Latinské malé písmeno n s apostrofom","Latin small letter n with acute":"Latinské malé písmeno n s dĺžňom","Latin small letter n with caron":"Latinské malé písmeno n s mäkčeňom","Latin small letter n with cedilla":"Latinské malé písmeno n s háčikom","Latin small letter o with breve":"Latinské malé písmeno o s mäkčeňom","Latin small letter o with double acute":"Latinské malé písmeno o s dĺžňom","Latin small letter o with macron":"Latinské malé písmeno o s čiarou","Latin small letter r with acute":"Latinské malé písmeno r s dĺžňom","Latin small letter r with caron":"Latinské malé písmeno r s mäkčeňom","Latin small letter r with cedilla":"Latinské malé písmeno r s háčikom","Latin small letter s with acute":"Latinské malé písmeno s s dĺžňom","Latin small letter s with caron":"Latinské malé písmeno s s mäkčeňom","Latin small letter s with cedilla":"Latinské malé písmeno s s háčikom","Latin small letter s with circumflex":"Latinské malé písmeno s s obráteným mäkčeňom","Latin small letter t with caron":"Latinské malé písmeno t s mäkčeňom","Latin small letter t with cedilla":"Latinské malé písmeno t s háčikom","Latin small letter t with stroke":"Latinské malé písmeno t s prečiarknutím","Latin small letter u with breve":"Latinské malé písmeno u s mäkčeňom","Latin small letter u with double acute":"Latinské malé písmeno u s dvojitým dĺžňom","Latin small letter u with macron":"Latinské malé písmeno o s čiarou","Latin small letter u with ogonek":"Latinské malé písmeno u s háčikom","Latin small letter u with ring above":"Latinské malé písmeno u s krúžkom nad znakom","Latin small letter u with tilde":"Latinské malé písmeno u s vlnovkou","Latin small letter w with circumflex":"Latinské malé písmeno w s obráteným mäkčeňom","Latin small letter y with circumflex":"Latinské malé písmeno y s obráteným mäkčeňom","Latin small letter z with acute":"Latinské malé písmeno z s dĺžňom","Latin small letter z with caron":"Malé písmeno s z mäkčeňom","Latin small letter z with dot above":"Latinské malé písmeno z s bodkou nad znakom","Latin small ligature ij":"Latinský malý znak ligatúry ij","Latin small ligature oe":"Latinský malý znak ligatúry oe","Left double quotation mark":"Ľavá dvojitá uvodzovka","Left single quotation mark":"Ľavá uvodzovka","Left-pointing double angle quotation mark":"Dvojitá šípka ukazujúca doľava","leftwards arrow to bar":"šípka doľava do zvislej čiary","leftwards dashed arrow":"prerušovaná šípka doľava","leftwards double arrow":"dvojitá šípka doľava","Less-than or equal to":"Menší alebo rovný","Less-than sign":"Menší ako","Lira sign":"Mena Líra","Livre tournois sign":"Znak Livre tournois","Logical and":"Logický AND","Logical or":"Logický OR",Macron:"Horná čiara","Manat sign":"Znak Manat","Mill sign":"Znak Mill","Minus sign":"Znak mínus","Multiplication sign":"Násobenie","N-ary product":"Znak cyklického násobenia","N-ary summation":"Znak cyklického sčítania",Nabla:"Nabla","Naira sign":"Znak Naira","New sheqel sign":"Nový znak šekelu","Nordic mark sign":"Znak Nórska marka","Not an element of":"Nepatrí / Nie je súčasťou","Not equal to":"Nerovná sa","Not sign":"Nie je rovný","on with exclamation mark with left right arrow above":"ON s výkričníkom so šípkou doľava doprava hore",Overline:"Preškrtnutie","Paragraph sign":"Odsek","Partial differential":"Parciálna diferencia","Per mille sign":"Promile","Per ten thousand sign":"Na desaťtisíc","Peseta sign":"Znak Peseta","Peso sign":"Znak Peso","Plus-minus sign":"Znak plus-mínus","Pound sign":"Znak Libra","Proportional to":"Úmerný k","Question exclamation mark":"Otáznik a výkričník","Registered sign":"Registrovaný","Reversed paragraph sign":"Obrátený znak odseku","Right double quotation mark":"Pravá dvojitá uvodzovka","Right single quotation mark":"Pravá uvodzovka","Right-pointing double angle quotation mark":"Dvojitá šípka ukazujúca doprava","rightwards arrow to bar":"šípka doprava do zvislej čiary","rightwards dashed arrow":"čiarkovaná šípka doprava","rightwards double arrow":"dvojitá šípka doprava","Ruble sign":"Znak Ruble","Rupee sign":"Znak Rupee","Section sign":"Sekcia","Single left-pointing angle quotation mark":"Šípka ukazujúca doľava","Single low-9 quotation mark":"Spodná uvodzovka","Single right-pointing angle quotation mark":"Šípka ukazujúca doprava","soon with rightwards arrow above":"čoskoro so šípkou doprava hore","Special characters":"Špeciálne znaky","Spesmilo sign":"Znak Spesmilo","Square root":"Odmocnina","Tenge sign":"Znak Tenge","There exists":"Existuje v množine","Tilde operator":"Vlnovka","top with upwards arrow above":"TOP so šípkou hore","Trade mark sign":"Ochranná známka","Tugrik sign":"Znak Tugrik","Turkish lira sign":"Znak Turecká líra","Two dot leader":"Horizontálna dvojbodka",Union:"Zjednotenie","up down arrow with base":"Šípka hore-dole od základne","upwards arrow to bar":"šípka nahor do zvislej čiary","upwards dashed arrow":"čiarkovaná šípka nahor","upwards double arrow":"dvojitá šípka nahor","Vulgar fraction one half":"Polovica","Vulgar fraction one quarter":"Jedna štvrtina","Vulgar fraction three quarters":"Tri štvrtiny","Won sign":"Znak Won","Yen sign":"Znak Jen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const e=o.sk=o.sk||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 z %1",Aquamarine:"Akvamarínová",Black:"Čierna",Blue:"Modrá",Cancel:"Zrušiť","Dim grey":"Tmavosivá","Dropdown toolbar":"Panel nástrojov roletového menu","Edit block":"Upraviť odsek","Editor toolbar":"Panel nástrojov editora",Green:"Zelená",Grey:"Sivá","Insert paragraph after block":"Vložiť odstavec za blok","Insert paragraph before block":"Vložiť odstavec pred blok","Light blue":"Bledomodrá","Light green":"Bledozelená","Light grey":"Bledosivá",Next:"Ďalšie",Orange:"Oranžová",Previous:"Predchádzajúce",Purple:"Fialová",Red:"Červená",Redo:"Znova","Remove color":"Zrušiť farbu","Restore default":"","Rich Text Editor":"Editor s formátovaním","Rich Text Editor, %0":"Editor s formátovaním, %0",Save:"Uložiť","Select all":"Označiť všetko","Show more items":"Zobraziť viac položiek",Turquoise:"Tyrkysová",Undo:"Späť","Upload in progress":"Prebieha nahrávanie",White:"Biela","Widget toolbar":"Panel nástrojov ovládacieho prvku",Yellow:"Žltá"}),e.getPluralForm=function(o){return o%1==0&&1==o?0:o%1==0&&o>=2&&o<=4?1:o%1!=0?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/sl.js b/core/assets/vendor/ckeditor5/translations/sl.js
new file mode 100644
index 0000000000000000000000000000000000000000..60bc2569f0eed1243ba21f2f229bc13fcf35e4d8
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/sl.js
@@ -0,0 +1 @@
+!function(a){const n=a.sl=a.sl||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Sredinska poravnava","Align left":"Poravnava levo","Align right":"Poravnava desno",Justify:"Postavi na sredino","Text alignment":"Poravnava besedila","Text alignment toolbar":"Orodna vrstica besedila"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.sl=o.sl||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Krepko",Code:"Koda",Italic:"Poševno",Strikethrough:"Prečrtano",Subscript:"Naročnik",Superscript:"Nadpis",Underline:"Podčrtaj"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.sl=i.sl||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blokiraj citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const i=a.sl=a.sl||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Izberi naslov",Heading:"Naslov","Heading 1":"Naslov 1","Heading 2":"Naslov 2","Heading 3":"Naslov 3","Heading 4":"Naslov 4","Heading 5":"Naslov 5","Heading 6":"Naslov 6",Paragraph:"Odstavek","Type or paste your content here.":"Vnesi ali prilepi vsebino","Type your title":"Vnesi naslov"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sl=n.sl||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Vodoravna črta"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.sl=e.sl||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"Akvamarin",Black:"Črna",Blue:"Modra",Cancel:"Prekliči","Dim grey":"Temno siva","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"Zelena",Grey:"Siva","Light blue":"Svetlo modra","Light green":"Svetlo zelena","Light grey":"Svetlo siva",Next:"",Orange:"Oranžna",Previous:"",Purple:"Vijolična",Red:"Rdeča","Remove color":"Odstrani barvo","Restore default":"","Rich Text Editor":"","Rich Text Editor, %0":"",Save:"Shrani","Show more items":"",Turquoise:"Turkizna",White:"Bela",Yellow:"Rumena"}),o.getPluralForm=function(e){return e%100==1?0:e%100==2?1:e%100==3||e%100==4?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/sq.js b/core/assets/vendor/ckeditor5/translations/sq.js
new file mode 100644
index 0000000000000000000000000000000000000000..9e3a0a94aba5973be16bbbc213268eaa3a600e54
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/sq.js
@@ -0,0 +1 @@
+!function(t){const i=t.sq=t.sq||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Radhit në mes","Align left":"Radhit majtas","Align right":"Radhit djathtas",Justify:"Plotësim","Text alignment":"Radhitja e tekstit","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sq=i.sq||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Trash",Code:"Kod",Italic:"Pjerrtë",Strikethrough:"Vi në mes",Subscript:"",Superscript:"",Underline:"Nënvizuar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.sq=n.sq||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Thonjëzat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sq=i.sq||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Përzgjidh nëntitullin",Heading:"Nëntitulli","Heading 1":"Nëntitulli 1","Heading 2":"Nëntitulli 2","Heading 3":"Nëntitulli 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Paragrafi","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.sq=e.sq||{};t.dictionary=Object.assign(t.dictionary||{},{"Break text":"","Centered image":"Foto e vendosur në mes","Change image text alternative":"Ndrysho tekstin zgjedhor të fotos","Enter image caption":"Shto përshkrimin e fotos","Full size image":"Foto me madhësi të plotë","Image resize list":"","Image toolbar":"","image widget":"Vegla e fotos","In line":"",Insert:"","Insert image":"Shto Foto","Insert image via URL":"","Left aligned image":"Foto e vendosur majtas",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Foto e vendosur djathtas","Side image":"Foto anësore","Text alternative":"Teksti zgjedhor",Update:"","Update image URL":"","Upload failed":"Ngarkimi dështoi","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sq=n.sq||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"Redakto nyjën",Link:"Shto nyjën","Link image":"","Link URL":"Nyja e URL-së","Open in a new tab":"","Open link in new tab":"Hap nyjën në faqe të re","This link has no URL":"Kjo nyje nuk ka URL",Unlink:"Largo nyjën"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.sq=e.sq||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Listë me Pika","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Listë me Numra","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const e=t.sq=t.sq||{};e.dictionary=Object.assign(e.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Kolona",Dashed:"","Delete column":"Gris kolonën","Delete row":"Grish rreshtin",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Kolona e kokës","Header row":"Rreshti i kokës",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"Shto rresht sipër","Insert row below":"Shto rresht poshtë","Insert table":"Shto tabelë",Inset:"","Justify cell text":"","Merge cell down":"Bashko kutizat poshtë","Merge cell left":"Bashko kutizat majtas","Merge cell right":"Bashko kutizat djathtas","Merge cell up":"Bashko kutizat sipër","Merge cells":"Bashko kutizat",None:"",Outset:"",Padding:"",Ridge:"",Row:"Rreshti","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Ndaj kutizat horizontalisht","Split cell vertically":"Ndajë kutizat vertikalisht",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.sq=e.sq||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Anulo","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Ribëj","Remove color":"","Restore default":"","Rich Text Editor":"Redaktues i Tekstit të Pasur","Rich Text Editor, %0":"Redaktues i Tekstit të Pasur, %0",Save:"Ruaj","Show more items":"",Turquoise:"",Undo:"Rikthe","Upload in progress":"Duke ngarkuar",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/sr-latn.js b/core/assets/vendor/ckeditor5/translations/sr-latn.js
new file mode 100644
index 0000000000000000000000000000000000000000..8f01a2c44c614614314c557c2d9f9fff1562d9a5
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/sr-latn.js
@@ -0,0 +1 @@
+!function(n){const a=n["sr-latn"]=n["sr-latn"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Centralno ravnanje","Align left":"Levo ravnanje","Align right":"Desno ravnanje",Justify:"Obostrano ravnanje","Text alignment":"Ravnanje teksta","Text alignment toolbar":"Alatke za ravnanje teksta"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n["sr-latn"]=n["sr-latn"]||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Podebljano",Code:"Kod",Italic:"Kurziv",Strikethrough:"Precrtan",Subscript:"Index dole",Superscript:"Index gore",Underline:"Podvučen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const t=n["sr-latn"]=n["sr-latn"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const i=a["sr-latn"]=a["sr-latn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Odredi stil",Heading:"Stilovi","Heading 1":"Naslov 1","Heading 2":"Naslov 2","Heading 3":"Naslov 3","Heading 4":"Naslov 4","Heading 5":"Naslov 5","Heading 6":"Naslov 6",Paragraph:"Pasus","Type or paste your content here.":"Upišite ili nalepite naslov","Type your title":"Odredite naslov"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["sr-latn"]=n["sr-latn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Horizontalna razdelna linija"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e["sr-latn"]=e["sr-latn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"Prelom teksta","Centered image":"Slika u sredini","Change image text alternative":"Izmena alternativnog teksta","Enter image caption":"Odredi tekst ispod slike","Full size image":"Slika u punoj veličini","Image resize list":"Lista veličine slike","Image toolbar":"Slika traka sa alatkama","image widget":"modul sa slikom","In line":"U redu",Insert:"Ubaci","Insert image":"Dodaj sliku","Insert image via URL":"Ubaci sliku preko URL-a","Left aligned image":"Leva slika",Original:"Original","Resize image":"Promenite veličinu slike","Resize image to %0":"Promenite veličinu slike na% 0","Resize image to the original size":"Promenite veličinu slike do originalne veličine","Right aligned image":"Desna slika","Side image":"Bočna slika","Text alternative":"Alternativni tekst",Update:"Ažuriraj","Update image URL":"Ažuriraj URL slike","Upload failed":"Postavljanje neuspešno","Wrap text":"Prelomiti tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["sr-latn"]=n["sr-latn"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Smanji uvlačenje","Increase indent":"Povećaj uclačenje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n["sr-latn"]=n["sr-latn"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Izaberi jezik",Language:"Jezik","Remove language":"Odstrani jezik"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["sr-latn"]=n["sr-latn"]||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Moguće preuzimanje","Edit link":"Ispravi link",Link:"Link","Link image":"Link slike","Link URL":"URL link","Open in a new tab":"Otvori u novoj kartici","Open link in new tab":"Otvori link u novom prozoru","This link has no URL":"Link ne sadrži URL",Unlink:"Оtkloni link"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i["sr-latn"]=i["sr-latn"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Bulleted List":"Nabrajane liste","Bulleted list styles toolbar":"Traka sa alatkama za nabrajane liste",Circle:"Krug",Decimal:"Decimala","Decimal with leading zero":"Decimalni broj sa nulom na početku",Disc:"Disk","Lower-latin":"Donji - latinski","Lower–roman":"Donji - rimski","Numbered List":"Lista sa brojevima","Numbered list styles toolbar":"Traka sa altakama za liste sa brojevima",Square:"Kvadrat","To-do List":"Lista obaveza","Toggle the circle list style":"Uključite / isključite stil liste krugova","Toggle the decimal list style":"Uključi / isključi stil dekadne liste","Toggle the decimal with leading zero list style":"Prebaci decimalni znak sa vodećim stilom liste nula","Toggle the disc list style":"Uključite / isključite stil liste diskova","Toggle the lower–latin list style":"Uključite / isključite stil donje liste latinice","Toggle the lower–roman list style":"Uključite / isključite stil donje rimske liste","Toggle the square list style":"Uključite / isključite stil liste kvadrata","Toggle the upper–latin list style":"Uključite / isključite stil gornje liste latinice","Toggle the upper–roman list style":"Uključite / isključite stil gornje rimske liste","Upper-latin":"Gornji - latinski","Upper-roman":"Gornji - rimski"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["sr-latn"]=n["sr-latn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"Ukloni formatiranje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["sr-latn"]=n["sr-latn"]||{};i.dictionary=Object.assign(i.dictionary||{},{Source:"Izvor"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e["sr-latn"]=e["sr-latn"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Align cell text to the bottom":"Poravnajte tekst ćelije prema dole","Align cell text to the center":"Poravnajte tekst ćelije u sredinu","Align cell text to the left":"Poravnajte tekst ćelije levo","Align cell text to the middle":"Poravnajte tekst ćelije u sredinu","Align cell text to the right":"Poravnajte tekst ćelije desno","Align cell text to the top":"Poravnajte tekst ćelije prema gore","Align table to the left":"Poravnajte tabelu na levu stranu","Align table to the right":"Poravnajte tabelu na desnu stranu",Alignment:"Poravnanje",Background:"Pozadina",Border:"Granica","Cell properties":"Svojstva ćelije","Center table":"Centar tabele",Color:"Boja","Color picker":"Birač boja",Column:"Kolona",Dashed:"Razbijeno","Delete column":"Briši kolonu","Delete row":"Briši red",Dimensions:"Dimenzija",Dotted:"Sa tačkama",Double:"Dvostruki","Enter table caption":"Unesite naslov tabele",Groove:"Kolosek","Header column":"Kolona za zaglavlje","Header row":"Red za zaglavlje",Height:"Visina","Horizontal text alignment toolbar":"Horizontalna traka sa alatkama za  poravnavanje teksta","Insert column left":"Dodaj kolonu levo","Insert column right":"Dodaj kolonu desno","Insert row above":"Dodaj red iznad","Insert row below":"Dodaj red ispod","Insert table":"Dodaj tabelu",Inset:"Prilog","Justify cell text":"Opravdajte tekst ćelije","Merge cell down":"Spoj ćelije na dole","Merge cell left":"Spoj ćelije na levo","Merge cell right":"Spoj ćelije na desno","Merge cell up":"Spoj ćelije na gore","Merge cells":"Spoj ćelije",None:"Nijedan",Outset:"Početak",Padding:"Postavljanje",Ridge:"Greben",Row:"Red","Select column":"Odaberi kolonu","Select row":"Odaberi red",Solid:"Čvrst","Split cell horizontally":"Deli ćelije vodoravno","Split cell vertically":"Deli ćelije uspravno",Style:"Stil","Table alignment toolbar":"Traka sa alatkama za poravnavanje tabele","Table cell text alignment":"Poravnaj tekst u tabeli","Table properties":"Svojstva tabele","Table toolbar":"Tabela traka sa alatkama",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Boja je nevažeća. Pokušajte sa "# FF0000" ili "rgb (255,0,0)" ili "crvena".','The value is invalid. Try "10px" or "2em" or simply "2".':"Vrednost je nevažeća. Pokušajte sa „10pk“ ili „2em“ ili jednostavno „2“.","Toggle caption off":"Isključivanje natpisa","Toggle caption on":"Uključite naslov","Vertical text alignment toolbar":"Vertikalna traka sa alatkama za poravnavanje teksta",Width:"Širina"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const t=n["sr-latn"]=n["sr-latn"]||{};t.dictionary=Object.assign(t.dictionary||{},{"HTML object":"HTML objеkat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const t=a["sr-latn"]=a["sr-latn"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Almost equal to":"Skoro jednako",Angle:"Ugao","Approximately equal to":"Otprilike jednako","Asterisk operator":"Asterisk operator","Austral sign":"Australni znak","back with leftwards arrow above":"Nazad sa strelicom levo","Bitcoin sign":"Znak bitcoina","Cedi sign":"Znak cedi","Cent sign":"Znak centа","Character categories":"Kategorija karaktera","Colon sign":"Dvotačka","Contains as member":"Sadrži kao član","Copyright sign":"Simbol autorskog prava","Cruzeiro sign":"Znak cruzeiro","Currency sign":"Znak valute","Degree sign":"Znak stepena","Division sign":"Znak divizije","Dollar sign":"Znak dolara","Dong sign":"Znak dong","Double dagger":"Dvostruki bodež","Double exclamation mark":"Dvosrtuki uzvičnik","Double low-9 quotation mark":"Dvostruki niski-9 navodnik","Double question mark":"Dvostruki upitnik","downwards arrow to bar":"Strelica prema dole ka traci","downwards dashed arrow":"Prekidana strelica prema dole","downwards double arrow":"Dupla strelica prema dole","Drachma sign":"Znak drahma","Element of":"Element od","Em dash":"Em crtica","Empty set":"Prazan set","En dash":"En crtica","end with leftwards arrow above":"Završite strelicom levo","Euro sign":"Znak eura","Euro-currency sign":"Znak valute eura","Exclamation question mark":"Znak uzvičnika upitnika","For all":"Za sve","Fraction slash":"Crta frakcije","French franc sign":"Znak francuskog franaka","German penny sign":"Znak nemački peni","Greater-than or equal to":"Znak veće od ili jednako","Greater-than sign":"Znak veće od","Guarani sign":"Znak guarani","Horizontal ellipsis":"Horizontalna elipsa","Hryvnia sign":"Znak grivna","Identical to":"Identičan","Indian rupee sign":"Znak indijske rupije",Infinity:"Beskonačnost",Integral:"Integral",Intersection:"Raskrsnica","Inverted exclamation mark":"Obrnuti uzvičnik","Inverted question mark":"Obrnuti upitnik","Kip sign":"Znak kip","Latin capital letter a with breve":"Latinsko veliko slovo a sa brevom","Latin capital letter a with macron":"Latinsko veliko slovo a sa makronom","Latin capital letter a with ogonek":"Latinsko veliko slovo a sa ogonek","Latin capital letter c with acute":"Latinsko veliko slovo c sa akutom","Latin capital letter c with caron":"Latinsko veliko slovo c sa caronom","Latin capital letter c with circumflex":"Latinsko veliko slovo c sa circumflex","Latin capital letter c with dot above":"Latinsko veliko slovo c sa tačkom iznad","Latin capital letter d with caron":"Latinsko veliko slovo d sa caronom","Latin capital letter d with stroke":"Latinsko veliko slovo d sa stroke","Latin capital letter e with breve":"Latinsko veliko slovo e sa breve","Latin capital letter e with caron":"Latinsko veliko slovo e sa caron","Latin capital letter e with dot above":"Latinsko veliko slovo e sa tačkom iznad","Latin capital letter e with macron":"Latinsko veliko slovo e sa macron","Latin capital letter e with ogonek":"Latinsko veliko slovo e sa ogonek","Latin capital letter eng":"Latinsko veliko slovo eng","Latin capital letter g with breve":"Latinsko veliko slovo g sa breve","Latin capital letter g with cedilla":"Latinsko veliko slovo g sa cedillom","Latin capital letter g with circumflex":"Latinsko veliko slovo g sa circumflex","Latin capital letter g with dot above":"Latinsko veliko slovo g sa tačkom iznad","Latin capital letter h with circumflex":"Latinsko veliko slovo h sa circumflex","Latin capital letter h with stroke":"Latinsko veliko slovo h sa stroke","Latin capital letter i with breve":"Latinsko veloko slovo i sa breve","Latin capital letter i with dot above":"Latinsko veliko slovo i sa tackom iznad","Latin capital letter i with macron":"Latinsko veliko slovo i sa macron","Latin capital letter i with ogonek":"Latinsko veliko slovo i sa ogonek","Latin capital letter i with tilde":"Latinsko veliko slovo i sa tildom","Latin capital letter j with circumflex":"Latinsko veliko slovo j sa circumflex","Latin capital letter k with cedilla":"Latinsko veliko slovo k sa cedila","Latin capital letter l with acute":"Latinsko veloko slovo l sa akutom","Latin capital letter l with caron":"Latinsko veliko slovo l sa caron","Latin capital letter l with cedilla":"Latinsko veliko slovo l sa cedila","Latin capital letter l with middle dot":"Latinsko veliko slovo l sa srednjom tačkom","Latin capital letter l with stroke":"Latinsko veliko slovo l sa stroke","Latin capital letter n with acute":"Latinsko veliko slovo n sa akutom ","Latin capital letter n with caron":"Latinsko veliko slovo n sa caron","Latin capital letter n with cedilla":"Latinsko veliko slovo n sa cedilom","Latin capital letter o with breve":"Latinsko veliko slovo o sa breve","Latin capital letter o with double acute":"Latinsko veliko slovo o sa dvostrukom akutom","Latin capital letter o with macron":"Latinsko veliko slovo o sa macron","Latin capital letter r with acute":"Latinsko veliko slovo r sa akutom","Latin capital letter r with caron":"Latinsko veliko slovo r sa caron","Latin capital letter r with cedilla":"Latinsko veliko slovo r sa cedila","Latin capital letter s with acute":"Latinsko veliko slovo s sa akutom","Latin capital letter s with caron":"Latinsko veliko slovo s sa caron","Latin capital letter s with cedilla":"Latinsko veliko slovo s sa cedila","Latin capital letter s with circumflex":"Latinsko veliko slovo s sa circumflex","Latin capital letter t with caron":"Latinsko veliko slovo t sa caron","Latin capital letter t with cedilla":"Latinsko veliko slovo t sa cedila","Latin capital letter t with stroke":"Latinsko veliko slovo t sa stroke","Latin capital letter u with breve":"Latinsko veliko slovo u sa breve","Latin capital letter u with double acute":"Latinsko veliko slovo u s dvostrukom akutom","Latin capital letter u with macron":"Latinsko veliko slovo u sa macron","Latin capital letter u with ogonek":"Latinsko veliko slovo u sa ogonek","Latin capital letter u with ring above":"Latinsko veliko slovo u s prstenom iznad","Latin capital letter u with tilde":"Latinsko veliko slovo u sa tildom","Latin capital letter w with circumflex":"Latinsko veliko slovo w sa circumflex","Latin capital letter y with circumflex":"Latinsko veliko slovo y sa circumflex","Latin capital letter y with diaeresis":"Latinsko veliko slovo y sa dijarezom","Latin capital letter z with acute":"Latinsko veliko slovo z sa akutom","Latin capital letter z with caron":"Latinsko veliko slovo z sa caron","Latin capital letter z with dot above":"Latinsko veliko slovo z sa tačkom iznad","Latin capital ligature ij":"Latinska velika ligatura ij","Latin capital ligature oe":"Latinska velika ligatura oe","Latin small letter a with breve":"Latinsko malo slovo a sa  brevom","Latin small letter a with macron":"Latinsko malo slovo a sa makronom","Latin small letter a with ogonek":"Latinsko malo slovo a sa ogonek","Latin small letter c with acute":"Latinsko malo slovo c sa akutom","Latin small letter c with caron":"Latinsko malo slovo c sa caronom","Latin small letter c with circumflex":"Latino malo slovo c sa circumflex","Latin small letter c with dot above":"Latinsko malo slovo c sa tačkom iznad","Latin small letter d with caron":"Latinsko malo slovo d sa caronom","Latin small letter d with stroke":"Latinsko malo slovo d sa stroke","Latin small letter dotless i":"Latinsko malo slovo i bez tačke","Latin small letter e with breve":"Latinsko malo slovo e sa breve","Latin small letter e with caron":"Latinsko malo slovo e sa caron","Latin small letter e with dot above":"Latinsko malo slovo e sa tačkom iznad","Latin small letter e with macron":"Latinsko malo slovo e sa macron","Latin small letter e with ogonek":"Latinsko malo slovo e sa ogonek","Latin small letter eng":"Latinsko malo slovo eng","Latin small letter f with hook":"Latinsko malo slovo f sa kukom","Latin small letter g with breve":"Latinsko malo slovo g sa breve","Latin small letter g with cedilla":"Latinsko malo slovo g sa cedillom","Latin small letter g with circumflex":"Latinsko malo slovo g sa circumflex","Latin small letter g with dot above":"Latinsko malo slovo g sa tačkom iznad","Latin small letter h with circumflex":"Latinsko malo slovo h sa circumflex","Latin small letter h with stroke":"Latinsko malo slovo h sa stroke","Latin small letter i with breve":"Latinsko malo slovo i sa breve","Latin small letter i with macron":"Latinsko malo slovo i sa macron","Latin small letter i with ogonek":"Latinsko malo slovo i sa ogonek","Latin small letter i with tilde":"Latinsko malo slovo i sa tildom","Latin small letter j with circumflex":"Latinsko malo slovo j sa circumflex","Latin small letter k with cedilla":"Latinsko malo slovo k sa cedila","Latin small letter kra":"Latinsko malo slovo kra","Latin small letter l with acute":"Latinsko malo slovo l sa akutom","Latin small letter l with caron":"Latinsko malo slovo l sa caron","Latin small letter l with cedilla":"Latinsko malo slovo l sa cedila","Latin small letter l with middle dot":"Latinsko malo slovo l sa srednjom tačkom","Latin small letter l with stroke":"Latinsko malo slovo l sa stroke","Latin small letter long s":"Latinsko malo slovo dugačko s","Latin small letter n preceded by apostrophe":"Latinsko malo slovo n koje prethodi apostrof","Latin small letter n with acute":"Latinsko malo slovo n sa akutom ","Latin small letter n with caron":"Latinsko malo slovo n sa caron ","Latin small letter n with cedilla":"Latinsko malo slovo n sa cedilom","Latin small letter o with breve":"Latinsko malo slovo o sa breve","Latin small letter o with double acute":"Latinsko malo slovo o sa dvostrukom akutom","Latin small letter o with macron":"Latinsko malo slovo o sa macron","Latin small letter r with acute":"Latinsko malo slovo r sa akutom","Latin small letter r with caron":"Latinsko malo slovo r sa caron","Latin small letter r with cedilla":"Latinsko malo slovo r sa cedila","Latin small letter s with acute":"Latinsko malo slovo s sa akutom","Latin small letter s with caron":"Latinsko malo slovo s sa caron","Latin small letter s with cedilla":"Latinsko malo slovo s sa cedila","Latin small letter s with circumflex":"Latinsko malo slovo s sa circumflex","Latin small letter t with caron":"Latinsko malo slovo t sa caron","Latin small letter t with cedilla":"Latinsko malo slovo t sa cedila","Latin small letter t with stroke":"Latinsko malo slovo t sa stroke","Latin small letter u with breve":"Latinsko malo slovo u sa breve","Latin small letter u with double acute":"Latinsko malo slovo u s dvostrukom akutom","Latin small letter u with macron":"Latinsko malo slovo u sa macron","Latin small letter u with ogonek":"Latinsko malo slovo u sa ogonek","Latin small letter u with ring above":"Latinsko malo slovo u s prstenom iznad","Latin small letter u with tilde":"Latinsko malo slovo u sa tildom","Latin small letter w with circumflex":"Latinsko malo slovo w sa circumflex","Latin small letter y with circumflex":"Latinsko malo slovo y sa circumflex","Latin small letter z with acute":"Latinsko malo slovo z sa akutom","Latin small letter z with caron":"Latinsko malo slovo z sa caron","Latin small letter z with dot above":"Latinsko malo slovo z sa tačkom iznad","Latin small ligature ij":"Latinska mala ligatura ij","Latin small ligature oe":"Latinska mala ligatura oe","Left double quotation mark":"Levi dvostruki navodnik","Left single quotation mark":"Levi pojedinačni navodnik","Left-pointing double angle quotation mark":"Levi dvostrani navodnik dvostrukog ugla","leftwards arrow to bar":"Strelica nalevo ka traci","leftwards dashed arrow":"Prekidana strelica levo","leftwards double arrow":"Dupla strlica levo","Less-than or equal to":"Znak manje od ili jednako","Less-than sign":"Znak manje od","Lira sign":"Znak lire","Livre tournois sign":"Znak livre tournois","Logical and":"Logički i","Logical or":"Logički ili",Macron:"Macron","Manat sign":"Znak manat","Mill sign":"Znak mlina","Minus sign":"Znak minus","Multiplication sign":"Znak množenja","N-ary product":"N-ari proizvod","N-ary summation":"N-ari zbir",Nabla:"Nabla","Naira sign":"Znak naira","New sheqel sign":"Znak novi šekel","Nordic mark sign":"Nordijski znak","Not an element of":"Nije element","Not equal to":"Nejednako sa","Not sign":"Nije znak","on with exclamation mark with left right arrow above":"Uključeno sa uzvičnikom sa strelicom levo desno",Overline:"Overline","Paragraph sign":"Znak paragraf","Partial differential":"Delimični diferencijal","Per mille sign":"Znak per mile","Per ten thousand sign":"Znak za deset hiljada","Peseta sign":"Znak pezeta","Peso sign":"Znak peso","Plus-minus sign":"Znak plus-minus","Pound sign":"Znak funti","Proportional to":"Srazmerno","Question exclamation mark":"Znak upitnika uzvičnika","Registered sign":"Registrovani znak","Reversed paragraph sign":"Obrnuti znak paragrafa","Right double quotation mark":"Desni dvostruki navodnik","Right single quotation mark":"Desni pojedinačni navodnik","Right-pointing double angle quotation mark":"Desni dvostrani navodnik dvostrukog ugla","rightwards arrow to bar":"Strelica nadesno ka traci","rightwards dashed arrow":"Prekidana strelica desno","rightwards double arrow":"Dupla strelica desno","Ruble sign":"Znak ruble","Rupee sign":"Znak rupia","Section sign":"Znak sekcija","Single left-pointing angle quotation mark":"Pojedinačni navodnik ugla levog pokazivanja","Single low-9 quotation mark":"Jedan niski-9 navodnik","Single right-pointing angle quotation mark":"Pojedinačni navodnik ugla desnog pokazivanja","soon with rightwards arrow above":"Uskoro sa strelicom nadesno","Special characters":"Specijalni karakteri","Spesmilo sign":"Znak spesmilio","Square root":"Kvadratni koren","Tenge sign":"Znak tenge","There exists":"Postoji","Tilde operator":"Tilde operator","top with upwards arrow above":"Na vrhu sa strelicom prema gore","Trade mark sign":"Znak brenda","Tugrik sign":"Znak tugrik","Turkish lira sign":"Znak turskih lira","Two dot leader":"Vodja sa dve tačke",Union:"Unija","up down arrow with base":"Strelica nadole sa bazom","upwards arrow to bar":"Strelica prema gore ka traci","upwards dashed arrow":"Prekidana strelica prema gore","upwards double arrow":"Dupla strelica prema gore","Vulgar fraction one half":"Vulgarna frakcija jedna polovina","Vulgar fraction one quarter":"Vulgarna frakcija jedna četvrtina","Vulgar fraction three quarters":"Vulgarna frakcija tri četvrtine","Won sign":"Znak von","Yen sign":"Znak jena"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a["sr-latn"]=a["sr-latn"]||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Zelenkastoplava",Black:"Crna",Blue:"Plava",Cancel:"Odustani","Dim grey":"Bledo siva","Dropdown toolbar":"Padajuća traka sa alatkama","Edit block":"Blok uređivač","Editor toolbar":"Uređivač traka sa alatkama",Green:"Zelena",Grey:"Siva","Insert paragraph after block":"Уметните одломак после блока","Insert paragraph before block":"Уметните одломак пре блока","Light blue":"Svetloplava","Light green":"Svetlo zelena","Light grey":"Svetlo siva",Next:"Sledeći",Orange:"Narandžasta",Previous:"Prethodni",Purple:"Ljubičasta",Red:"Crvena",Redo:"Ponovo","Remove color":"Otkloni boju","Restore default":"Vrati podrazumevano","Rich Text Editor":"Prošireni uređivač teksta","Rich Text Editor, %0":"Prošireni uređivač teksta, %0",Save:"Sačuvaj","Select all":"Označi sve","Show more items":"Prikaži još stavki",Turquoise:"Tirkizna",Undo:"Povlačenje","Upload in progress":"Postavljanje u toku",White:"Bela","Widget toolbar":"Видгет трака са алаткама",Yellow:"Žuta"}),e.getPluralForm=function(a){return a%10==1&&a%100!=11?0:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?1:2}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/sr.js b/core/assets/vendor/ckeditor5/translations/sr.js
new file mode 100644
index 0000000000000000000000000000000000000000..d334aa32f29efffca22c446a87e4251bd663c859
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/sr.js
@@ -0,0 +1 @@
+!function(n){const i=n.sr=n.sr||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Централно равнанје","Align left":"Лево равнање","Align right":"Десно равнање",Justify:"Обострано равнање","Text alignment":"Равнање текста","Text alignment toolbar":"Алатке за равнање текста"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sr=i.sr||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Подебљано",Code:"Код",Italic:"Курзив",Strikethrough:"Прецртан",Subscript:"Индекс доле",Superscript:"Индекс горе",Underline:"Подвучен"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sr=i.sr||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитат"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.sr=n.sr||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Одреди стил",Heading:"Стилови","Heading 1":"Наслов 1","Heading 2":"Наслов 2","Heading 3":"Наслов 3","Heading 4":"Наслов 4","Heading 5":"Наслов 5","Heading 6":"Наслов 6",Paragraph:"Пасус","Type or paste your content here.":"Упишите или налепите наслов","Type your title":"Одредите наслов"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sr=i.sr||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Хоризонтална разделна линија"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.sr=e.sr||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"Прелом текста","Centered image":"Слика у средини","Change image text alternative":"Измена алтернативног текста","Enter image caption":"Одреди текст испод слике","Full size image":"Слика у пуној величини","Image resize list":"Листа величине слике","Image toolbar":"Слика трака са алтакама","image widget":"модул са сликом","In line":"У реду",Insert:"Убаци","Insert image":"Додај слику","Insert image via URL":"Убаци слику преко УРЛ-а","Left aligned image":"Лева слика",Original:"Оригинал","Resize image":"Промените величину слике","Resize image to %0":"Промените величину слике на% 0","Resize image to the original size":"Промените величину слике до оригиналне величине","Right aligned image":"Десна слика","Side image":"Бочна слика","Text alternative":"Алтернативни текст",Update:"Ажурирај","Update image URL":"Ажурирај УРЛ слике","Upload failed":"Постављање неуспешно","Wrap text":"Преломити текст"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sr=n.sr||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Смањи увлачење","Increase indent":"Повећај увлачење"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.sr=n.sr||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Изабери језик",Language:"Језик","Remove language":"Одстрани језик"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sr=n.sr||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Могуће преузимање","Edit link":"Исправи линк",Link:"Линк","Link image":"Линк слике","Link URL":"УРЛ линк","Open in a new tab":"Отвори у новој картици","Open link in new tab":"Отвори линк у новом прозору","This link has no URL":"Линк не садржи УРЛ",Unlink:"Отклони линк"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.sr=e.sr||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Набрајане листе","Bulleted list styles toolbar":"Трака са алаткама за набрајане листе",Circle:"Круг",Decimal:"Децимала","Decimal with leading zero":"Децимала са нулом на почетку",Disc:"Диск","Lower-latin":"Доњи - латински","Lower–roman":"Доњи - римски","Numbered List":"Листа са бројевима","Numbered list styles toolbar":"Трака са алаткама за листе са бројевима",Square:"Квадрат","To-do List":"Листа обавеза","Toggle the circle list style":"Укључи / искључи стил листе кругова","Toggle the decimal list style":"Укључи / искључи стил декадне листе","Toggle the decimal with leading zero list style":"Пребаци децимални знак са водећим стилом листе нула","Toggle the disc list style":"Укључите / искључите стил листе дискова","Toggle the lower–latin list style":"Укључите / искључите стил доње листе латинице","Toggle the lower–roman list style":"Укључите/ искључите стил доње римске листе","Toggle the square list style":"Укључи / искључи стил листе квадрата","Toggle the upper–latin list style":"Укључите / искључите стил горње листе латинице","Toggle the upper–roman list style":"Укључите / искључите стил горње римске листе","Upper-latin":"Горњи - латински","Upper-roman":"Горњи - римски"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sr=i.sr||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"Уклони форматирање"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sr=i.sr||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"Извор"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.sr=e.sr||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Поравнајте текст ћелије према доле","Align cell text to the center":"Поравнајте текст ћелије у средину","Align cell text to the left":"Поравнајте текст ћелије лево","Align cell text to the middle":"Поравнајте текст ћелије у средину","Align cell text to the right":"Поравнајте текст ћелије десно","Align cell text to the top":"Поравнајте текст ћелије према горе","Align table to the left":"Поравнајте табелу на леву страну","Align table to the right":"Поравнајте табелу на десну страну",Alignment:"Поравнање",Background:"Позадина",Border:"Граница","Cell properties":"Својства ћелије","Center table":"Центар табеле",Color:"Боја","Color picker":"Бирач боја",Column:"Колона",Dashed:"Разбијено","Delete column":"Бриши колону","Delete row":"Бриши ред",Dimensions:"Димензија",Dotted:"Са тачкама",Double:"Двоструко","Enter table caption":"Унесите наслов табеле ",Groove:"Колосек","Header column":"Колона за заглавље","Header row":"Ред за заглавлје",Height:"Висина","Horizontal text alignment toolbar":"Хоризонтална трака са алаткама за поравнање текста","Insert column left":"Додај колону лево","Insert column right":"Додај колону десно","Insert row above":"Додај ред изнад","Insert row below":"Додај ред испод","Insert table":"Додај табелу",Inset:"Прилог","Justify cell text":"Оправдајте текст ћелије","Merge cell down":"Спој ћелије на доле","Merge cell left":"Cпој ћелије на лево","Merge cell right":"Спој ћелије на десно","Merge cell up":"Спој ћелије на горе","Merge cells":"Спој ћелије",None:"Ниједан",Outset:"Почетак",Padding:"Постављање",Ridge:"Гребен",Row:"Ред","Select column":"Изабери колону","Select row":"Изабери ред",Solid:"Чврст","Split cell horizontally":"Дели ћелије водоравно","Split cell vertically":"Дели ћелије усправно",Style:"Стил","Table alignment toolbar":"Трака са алаткама за поравнање табеле","Table cell text alignment":"Поравнај тексту табели","Table properties":"Својства табеле","Table toolbar":"Табела трака са алаткама",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Боја је неважећа. Покушајте са "#FF0000" или "rgb(255,0,0)" или "црвена".','The value is invalid. Try "10px" or "2em" or simply "2".':'Вредност је неважећа. Покушајте са "10px" или "2em" или једноставно "2".',"Toggle caption off":"Искључивање натписа ","Toggle caption on":"Укључите наслов ","Vertical text alignment toolbar":"Вертикална трака са алаткама за поравнање текста",Width:"Ширина"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sr=i.sr||{};n.dictionary=Object.assign(n.dictionary||{},{"HTML object":"ХТМЛ објекат "})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t.sr=t.sr||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"Скоро једнако",Angle:"Угао","Approximately equal to":"Отприлике једнако","Asterisk operator":"Астерикс оператор","Austral sign":"Аустрални знак","back with leftwards arrow above":"Назад са стрелицом лево","Bitcoin sign":"Знак биткиона","Cedi sign":"Знак цеди","Cent sign":"Знак цента","Character categories":"Категорија карактера","Colon sign":"Двотачка","Contains as member":"Садржи као члан","Copyright sign":"Симбол ауторског права","Cruzeiro sign":"Знак црузеиро","Currency sign":"Знак валуте","Degree sign":"Знак степена","Division sign":"Знак дивизије","Dollar sign":"Знак долара","Dong sign":"Знак донг","Double dagger":"Двоструки бодеж","Double exclamation mark":"Двоструки узвичник","Double low-9 quotation mark":"Двоструки ниски -9 наводник","Double question mark":"Двоструки упитник","downwards arrow to bar":"Стрелица према доле ка траци","downwards dashed arrow":"Прекидана стрелица према доле","downwards double arrow":"Дупла стрелица према доле","Drachma sign":"Знак драхма","Element of":"Елемент од","Em dash":"Ем цртица","Empty set":"Празан сет","En dash":"Ен цртица","end with leftwards arrow above":"Завршите стрелицом лево","Euro sign":"Знак еура","Euro-currency sign":"Знак валуте еура","Exclamation question mark":"Знак узвичника упитника","For all":"За све","Fraction slash":"Црта фракције","French franc sign":"Знак француског франака","German penny sign":"Знак немачки пени","Greater-than or equal to":"Знак веће од или једнако","Greater-than sign":"Знак веће од","Guarani sign":"Знак гуарани","Horizontal ellipsis":"Хоризонтална елипса","Hryvnia sign":"Знак гривна","Identical to":"Идентичан","Indian rupee sign":"Знак индијске рупије",Infinity:"Бесконачност",Integral:"Интеграл",Intersection:"Раскрсница","Inverted exclamation mark":"Обрнути узвичник","Inverted question mark":"Обрнути упитник","Kip sign":"Знак кип","Latin capital letter a with breve":"Латинско велико слово а  са бревом ","Latin capital letter a with macron":"Латинско белико слово а са макроном","Latin capital letter a with ogonek":"Латинско велико слово а са огонек","Latin capital letter c with acute":"Латинско велико слово ц са акутом","Latin capital letter c with caron":"Латинско велико слово ц са цароном","Latin capital letter c with circumflex":"Латинско велико слово ц са цирцумфлекс","Latin capital letter c with dot above":"Латинско велико слово ц са тачком изнад","Latin capital letter d with caron":"Латинско велико слово д са цароном","Latin capital letter d with stroke":"Латинско велико слово д са строке","Latin capital letter e with breve":"Латинско велико слово е са бреве","Latin capital letter e with caron":"Латинско велико слово е са царон","Latin capital letter e with dot above":"Латинско велико слово е са тачком изнад","Latin capital letter e with macron":"Латинско велико слово е са мацрон","Latin capital letter e with ogonek":"Латинско велико слово е са огонек","Latin capital letter eng":"Латинско велико слово енг","Latin capital letter g with breve":"Латинск велико слово г са бреве","Latin capital letter g with cedilla":"Латинско велико слово г са цедилом","Latin capital letter g with circumflex":"Латинско велико слово г са цирцумфлекс","Latin capital letter g with dot above":"Латинско велико слово г са тачком изнад","Latin capital letter h with circumflex":"Латинско велико слово х са цирцумфлекс","Latin capital letter h with stroke":"Латинско велико слово х са строке","Latin capital letter i with breve":"Латинско велико слово и са бреве","Latin capital letter i with dot above":"Латинско велико слово и са тачком изнад","Latin capital letter i with macron":"Латинско велико слово и са мацрон","Latin capital letter i with ogonek":"Латинско велоко слово и са огонек","Latin capital letter i with tilde":"Латинско велико слово и са тилдом","Latin capital letter j with circumflex":"Латинско велико слово ј са цирцумфлекс","Latin capital letter k with cedilla":"Латинско велико слово к са цедила","Latin capital letter l with acute":"Лаинско велико слово л са акутом","Latin capital letter l with caron":"Латинско велико слово л са царон","Latin capital letter l with cedilla":"Латинско велико слово л са цедила","Latin capital letter l with middle dot":"Латинско велико слово л са среднјом тачком","Latin capital letter l with stroke":"Латинско велико слово л са строке","Latin capital letter n with acute":"Латинско влико слово н са акутом","Latin capital letter n with caron":"Латинско велико слово н са царон","Latin capital letter n with cedilla":"Латинско велико слово н са цедилом","Latin capital letter o with breve":"Латинско велико слово о са бреве","Latin capital letter o with double acute":"Латинско велико слово о са двоструком акутом","Latin capital letter o with macron":"Латинско велико слово о са мацрон","Latin capital letter r with acute":"Латинско велико слово р са акутом","Latin capital letter r with caron":"Латинско велико слово р са царон","Latin capital letter r with cedilla":"Латинско велико слово р са цедила","Latin capital letter s with acute":"Латинско велоко слово с са акутом","Latin capital letter s with caron":"Латинско велико слово с са царон","Latin capital letter s with cedilla":"Латинско велико слово с са цедила","Latin capital letter s with circumflex":"Латинско велико слово с са цирцумфлекс","Latin capital letter t with caron":"Латинско велико слово т са царон","Latin capital letter t with cedilla":"Латинско велико слово т са цедила","Latin capital letter t with stroke":"Латинско велико слово т са строке","Latin capital letter u with breve":"Латинско велико слово у са бреве","Latin capital letter u with double acute":"Латинско велико слово у с двоструким акутом","Latin capital letter u with macron":"Латинско велико слово у са мацрон","Latin capital letter u with ogonek":"Латинско велико слово у са огонек","Latin capital letter u with ring above":"Латинско велико слово у с престеном изнад","Latin capital letter u with tilde":"Латинско велико слово у са тилдом","Latin capital letter w with circumflex":"Латинско велико слово дупло в са цирцумфлекс","Latin capital letter y with circumflex":"Латинско велико слово ипсилон са цирцумфлекс","Latin capital letter y with diaeresis":"Латинско велико слово ипсилон са дијарезом","Latin capital letter z with acute":"Латинско велико слово з са акутом","Latin capital letter z with caron":"Латинско велико слово з са царон","Latin capital letter z with dot above":"Латинско велико слово з са тачком изнад","Latin capital ligature ij":"Латинска велика лигатура иј","Latin capital ligature oe":"Латинска велика лигатура ое","Latin small letter a with breve":"Латинско мало слово а са бревом","Latin small letter a with macron":"Латинско мало слово а са макроном","Latin small letter a with ogonek":"Латинско мало слово с са огонек","Latin small letter c with acute":"Латинско мало слово ц са акутом","Latin small letter c with caron":"Латинско мало слово ц са цароном","Latin small letter c with circumflex":"Латинско мало слово ц са цирцумфлекс","Latin small letter c with dot above":"Латинско мало слвово ц са тачком изнад","Latin small letter d with caron":"Латинско мало слово д са цароном","Latin small letter d with stroke":"Латинско мало слово д са строке","Latin small letter dotless i":"Латинско мало слово и без тачке","Latin small letter e with breve":"Латинско мало слово е са бреве","Latin small letter e with caron":"Латинско мало слово е са царон","Latin small letter e with dot above":"Латинско мало слово е са тачком изнад","Latin small letter e with macron":"Латинско мало слово е са мацрон","Latin small letter e with ogonek":"Латинско мало слво е са огонек","Latin small letter eng":"Латинско мало слово енг","Latin small letter f with hook":"Латинско мало слово ф са куком","Latin small letter g with breve":"Латинско мало слово г са бреве","Latin small letter g with cedilla":"Латинско мало слово г са цедилом","Latin small letter g with circumflex":"Латинско мало слобо г са цирцумфлекс","Latin small letter g with dot above":"Латинско мало слово г са тачком изнад","Latin small letter h with circumflex":"Латинско мало слово х са цирцумфлекс","Latin small letter h with stroke":"Латинско мало слово х са строке","Latin small letter i with breve":"Латинско мало слово и са бреве","Latin small letter i with macron":"Латинско мало слово и са мацрон","Latin small letter i with ogonek":"Латинско мало слово и са огонек","Latin small letter i with tilde":"Латинско мало слово и са тилдом","Latin small letter j with circumflex":"Латнцско мало слово ј са цирцумфлекс","Latin small letter k with cedilla":"Латинско мало слово к са цедила","Latin small letter kra":"Латинско мало слово кра","Latin small letter l with acute":"Латинско мало слово л са акутом","Latin small letter l with caron":"Латинско мало слово л са царон","Latin small letter l with cedilla":"Латинско мало слово л са цедила","Latin small letter l with middle dot":"Латинско мало слово са цреднјом тачком","Latin small letter l with stroke":"Латинско мало слово л са строке","Latin small letter long s":"Латинско мало слово дугачко с","Latin small letter n preceded by apostrophe":"Латинско мало слово н које претходи апостроф","Latin small letter n with acute":"Латинско мало слово н са  акутом","Latin small letter n with caron":"Латинско мало слово н са царон","Latin small letter n with cedilla":"Латинско мало слово н са цедилом","Latin small letter o with breve":"Латинско мало слово о са бреве","Latin small letter o with double acute":"Латинско мало слово о са двоструком акутом","Latin small letter o with macron":"Латинско мало слово о са марон","Latin small letter r with acute":"Латинско мало слово р са акутом","Latin small letter r with caron":"Латинско мало слово р са царон","Latin small letter r with cedilla":"Латинско мало слово р са цедила","Latin small letter s with acute":"Латинско мало слово с са акутом","Latin small letter s with caron":"Латинско мало слово с са царон","Latin small letter s with cedilla":"Латинско мало слово с са цедила","Latin small letter s with circumflex":"Латинско мало слово с са цирцумфлекс","Latin small letter t with caron":"Латинско мало слово т са царон","Latin small letter t with cedilla":"Латинско мало слово т са цедила","Latin small letter t with stroke":"Латинско мало слово т са строке","Latin small letter u with breve":"Латинско мало слово у са бреве","Latin small letter u with double acute":"Латинско мало слово у с двоструким акутом","Latin small letter u with macron":"Латинско мало слово у са мацрон","Latin small letter u with ogonek":"Латинско мало слово у са огонек","Latin small letter u with ring above":"Латинско мало слово у с прстеном изнад","Latin small letter u with tilde":"Латинско мало слово у са тилдом","Latin small letter w with circumflex":"Латинско мало слово дупло в са цирцумфлекс","Latin small letter y with circumflex":"Латинско мало слово ипсилон са цирцумфлекс","Latin small letter z with acute":"Латинско мало слово з са акутом","Latin small letter z with caron":"Латинско мало слово з са царон","Latin small letter z with dot above":"Латинско мало слово з са тачком изнад","Latin small ligature ij":"Латинска мала лигатура иј","Latin small ligature oe":"Латинска мала лигатура ое","Left double quotation mark":"Леви двоструки наводник","Left single quotation mark":"Леви појединачни наводник","Left-pointing double angle quotation mark":"Леви двострани наводник двоструког угла ","leftwards arrow to bar":"Стрелица налево ка траци","leftwards dashed arrow":"Прекидана стрелица лево","leftwards double arrow":"Дупла стрелица лево","Less-than or equal to":"Збак мање од или једнако","Less-than sign":"Знак мање од","Lira sign":"Знак лире","Livre tournois sign":"Знак ливре тоурноис","Logical and":"Логички и","Logical or":"Локички или",Macron:"Мацрон","Manat sign":"Знак манат","Mill sign":"Знак млна","Minus sign":"Знак минус","Multiplication sign":"Знак множења","N-ary product":"Н-ари производ","N-ary summation":"Н-ари збир",Nabla:"Набла","Naira sign":"Знак наира","New sheqel sign":"Знак нови шекел","Nordic mark sign":"Нордијски знак","Not an element of":"Није елемент","Not equal to":"Неједнако са","Not sign":"Није знак","on with exclamation mark with left right arrow above":"Укључено са узвичником са стрелицомлево десно",Overline:"Оверлине","Paragraph sign":"Знак параграф","Partial differential":"Делимични диференцијал","Per mille sign":"Знак пер миле","Per ten thousand sign":"Знак за десет хиљада","Peseta sign":"Знак пезета","Peso sign":"Знак песо","Plus-minus sign":"Знак плус-минус","Pound sign":"Знак фунти","Proportional to":"Сразмерно","Question exclamation mark":"Знак упитника узвичника","Registered sign":"Регистровани знак","Reversed paragraph sign":"Обрнути знак параграфа","Right double quotation mark":"Десни двоструки наводник","Right single quotation mark":"Десни појединачни наводник","Right-pointing double angle quotation mark":"Десни двострани наводик двоструког угла ","rightwards arrow to bar":"Стрелица надесно ка траци","rightwards dashed arrow":"Прекидана стрелица десно","rightwards double arrow":"Дупла стрелица десно","Ruble sign":"Знак рубле","Rupee sign":"Знак рупиа","Section sign":"Знак селекција","Single left-pointing angle quotation mark":"Појединачни наводник угла левог показиванја","Single low-9 quotation mark":"Један ниски -9 наводник","Single right-pointing angle quotation mark":"Појединачни наводник угла десног показивања","soon with rightwards arrow above":"Ускоро са стрелицом надесно","Special characters":"Специјални карактери","Spesmilo sign":"Знак спесмилио","Square root":"Квадратни корен","Tenge sign":"Знак тенге","There exists":"Постоји","Tilde operator":"Тилде оператор","top with upwards arrow above":"На врху са стрелицом према горе","Trade mark sign":"Знак бренда","Tugrik sign":"Знак тугрик","Turkish lira sign":"Знак турских лира","Two dot leader":"Вођа са две тачке",Union:"Унија","up down arrow with base":"Стрелица на доле са базом","upwards arrow to bar":"Стрелица према горе ка траци","upwards dashed arrow":"Прекидана стрелица према горе","upwards double arrow":"Дупла стрелица према горе","Vulgar fraction one half":"Вулгарна фракција једна половина","Vulgar fraction one quarter":"Вулгарна фракција једна четвртина","Vulgar fraction three quarters":"Вулгарна фрација три четвртине","Won sign":"Знак вон","Yen sign":"Знак јена"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.sr=e.sr||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Зеленкастоплава",Black:"Црна",Blue:"Плава",Cancel:"Одустани","Dim grey":"Бледо сива","Dropdown toolbar":"Падајућа трака са алаткама","Edit block":"Блок уређивач","Editor toolbar":"Уређивач трака са алаткама",Green:"Зелена",Grey:"Сива","Insert paragraph after block":"Umetnite odlomak posle bloka","Insert paragraph before block":"Umetnite odlomak pre bloka","Light blue":"Светлоплава","Light green":"Светлозелена","Light grey":"Светло сива",Next:"Следећи",Orange:"Нараџаста",Previous:"Претходни",Purple:"Љубичаста",Red:"Црвена",Redo:"Поново","Remove color":"Отклони боју","Restore default":"Врати подразумевано","Rich Text Editor":"Проширен уређивач текста","Rich Text Editor, %0":"Проширени уређивач текста, %0",Save:"Сачувај","Select all":"Означи све.","Show more items":"Прикажи још ставки",Turquoise:"Тиркизна",Undo:"Повлачење","Upload in progress":"Постављање у току",White:"Бела","Widget toolbar":"Widget traka sa alatkama",Yellow:"Жута"}),o.getPluralForm=function(e){return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/sv.js b/core/assets/vendor/ckeditor5/translations/sv.js
new file mode 100644
index 0000000000000000000000000000000000000000..f14a47207a796433b3fb1e76057e2e8250f7c546
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/sv.js
@@ -0,0 +1 @@
+!function(t){const n=t.sv=t.sv||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Centrera","Align left":"Vänsterjustera","Align right":"Högerjustera",Justify:"Justera till marginaler","Text alignment":"Textjustering","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const t=n.sv=n.sv||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Fet",Code:"Kod",Italic:"Kursiv",Strikethrough:"Genomstruken",Subscript:"Nedsänkta tecken",Superscript:"Upphöjda tecken",Underline:"Understrykning"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.sv=i.sv||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blockcitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const r=i.sv=i.sv||{};r.dictionary=Object.assign(r.dictionary||{},{"Choose heading":"Välj rubrik",Heading:"Rubrik","Heading 1":"Rubrik 1","Heading 2":"Rubrik 2","Heading 3":"Rubrik 3","Heading 4":"Rubrik 4","Heading 5":"Rubrik 5","Heading 6":"Rubrik 6",Paragraph:"Paragraf","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.sv=e.sv||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Centrerad bild","Change image text alternative":"Ändra bildens alternativa text","Enter image caption":"Fyll i bildtext","Full size image":"Bild i full storlek","Image resize list":"","Image toolbar":"","image widget":"image widget","In line":"",Insert:"","Insert image":"Infoga bild","Insert image via URL":"","Left aligned image":"Vänsterjusterad bild",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Högerjusterad bild","Side image":"Kantbild","Text alternative":"Alternativ text",Update:"","Update image URL":"","Upload failed":"Uppladdning misslyckades","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sv=n.sv||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"Redigera länk",Link:"Länk","Link image":"","Link URL":"Länkens URL","Open in a new tab":"","Open link in new tab":"Öppna länk i ny flik","This link has no URL":"Denna länk saknar URL",Unlink:"Ta bort länk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.sv=e.sv||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Punktlista","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numrerad lista","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sv=i.sv||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"Radera formatering"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.sv=e.sv||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Kolumn",Dashed:"","Delete column":"Ta bort kolumn","Delete row":"Ta bort rad",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"","Header row":"",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"","Insert row below":"","Insert table":"Lägg in tabell",Inset:"","Justify cell text":"","Merge cell down":"","Merge cell left":"","Merge cell right":"","Merge cell up":"","Merge cells":"",None:"",Outset:"",Padding:"",Ridge:"",Row:"Rad","Select column":"","Select row":"",Solid:"","Split cell horizontally":"","Split cell vertically":"",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.sv=e.sv||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Avbryt","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Gör om","Remove color":"","Restore default":"","Rich Text Editor":"Rich Text-editor","Rich Text Editor, %0":"Rich Text-editor, %0",Save:"Spara","Show more items":"",Turquoise:"",Undo:"Ångra",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/th.js b/core/assets/vendor/ckeditor5/translations/th.js
new file mode 100644
index 0000000000000000000000000000000000000000..5881f41eef4497cccd46beecede37d4594317699
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/th.js
@@ -0,0 +1 @@
+!function(i){const n=i.th=i.th||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"คำพูดบล็อก"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.th=n.th||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"เลือกขนาดหัวข้อ",Heading:"หัวข้อ","Heading 1":"หัวข้อขนาด 1","Heading 2":"","Heading 3":"","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"ย่อหน้า","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.th=i.th||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"เส้นแนวนอน"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.th=e.th||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"จัดแนวรูปกึ่งกลาง","Change image text alternative":"เปลี่ยนข้อความเมื่อไม่พบรูป","Enter image caption":"ระบุคำอธิบายภาพ","Full size image":"รูปขนาดเต็ม","Image resize list":"","Image toolbar":"เครื่องมือรูปภาพ","image widget":"วิดเจ็ตรูปภาพ","In line":"",Insert:"","Insert image":"แทรกรูป","Insert image via URL":"","Left aligned image":"จัดแนวภาพซ้าย",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"จัดแนวภาพขวา","Side image":"รูปด้านข้าง","Text alternative":"ข้อความเมื่อไม่พบรูป",Update:"","Update image URL":"","Upload failed":"อัปโหลดไม่สำเร็จ","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.th=n.th||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"ลดการเยื้อง","Increase indent":"เพิ่มการเยื้อง"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.th=i.th||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"ลบรูปแบบ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.th=e.th||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"คอลัมน์",Dashed:"","Delete column":"ลบคอลัมน์","Delete row":"ลบแถว",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"หัวข้อคอลัมน์","Header row":"ส่วนหัวแถว",Height:"","Horizontal text alignment toolbar":"","Insert column left":"แทรกคอลัมน์ทางซ้าย","Insert column right":"แทรกคอลัมน์ทางขวา","Insert row above":"แทรกส่วนหัวด้านบน","Insert row below":"แทรกส่วนหัวด้านล่าง","Insert table":"แทรกตาราง",Inset:"","Justify cell text":"","Merge cell down":"ผสานเซลล์ด้านล่าง","Merge cell left":"ผสานเซลล์ด้านซ้าย","Merge cell right":"ผสานเซลล์ด้านขวา","Merge cell up":"ผสานเซลล์ด้านบน","Merge cells":"ผสานเซลล์",None:"",Outset:"",Padding:"",Ridge:"",Row:"แถว","Select column":"","Select row":"",Solid:"","Split cell horizontally":"แยกเซลล์แนวนอน","Split cell vertically":"แยกเซลล์แนวตั้ง",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"เครื่องมือตาราง",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.th=e.th||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"พลอยสีฟ้า",Black:"สีดำ",Blue:"สีน้ำเงิน",Cancel:"ยกเลิก","Dim grey":"สีเทาเข้ม","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"สีเขียว",Grey:"สีเทา","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"สีฟ้า","Light green":"สีเขียวอ่อน","Light grey":"สีเทาอ่อน",Next:"",Orange:"สีส้ม",Previous:"",Purple:"สีม่วง",Red:"สีแดง",Redo:"ทำซ้ำ","Remove color":"ลบสี","Restore default":"","Rich Text Editor":"","Rich Text Editor, %0":"",Save:"บันทึก","Show more items":"",Turquoise:"สีเขียวขุ่น",Undo:"ย้อนกลับ","Upload in progress":"กำลังดำเนินการอัปโหลด",White:"สีขาว","Widget toolbar":"แถมเครื่องมือวิดเจ็ต",Yellow:"สีเหลือง"}),o.getPluralForm=function(e){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/tk.js b/core/assets/vendor/ckeditor5/translations/tk.js
new file mode 100644
index 0000000000000000000000000000000000000000..85a2e92ce28c868a765fd42cdeca4777b044b5ef
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/tk.js
@@ -0,0 +1 @@
+!function(e){const i=e.tk=e.tk||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Merkeze deňleşdir","Align left":"Çepe deňleşdiriň","Align right":"Saga deňleşdiriň",Justify:"Akla","Text alignment":"Tekstiň deňleşdirilmegi","Text alignment toolbar":"Teksti deňleşdirmek gurallar paneli"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.tk=i.tk||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Galyň",Code:"Kod",Italic:"Italik",Strikethrough:"Üsti çyzykly",Subscript:"Aşaky ýazgy",Superscript:"Üst ýazgy",Underline:"Aşagy çyzykly"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.tk=i.tk||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Sitata blokirläň"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const y=a.tk=a.tk||{};y.dictionary=Object.assign(y.dictionary||{},{"Choose heading":"Sözbaşy saýlaň",Heading:"Sözbaşy","Heading 1":"Sözbaşy 1","Heading 2":"Sözbaşy 2","Heading 3":"Sözbaşy 3","Heading 4":"Sözbaşy 4","Heading 5":"Sözbaşy 5","Heading 6":"Sözbaşy 6",Paragraph:"Abzas","Type or paste your content here.":"Mazmunyňyzy şu ýere ýazyň ýa-da goýuň.","Type your title":"Sözbaşyny ýazyň"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.tk=i.tk||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Gorizontal çyzyk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.tk=e.tk||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Merkezleşdirilen surat","Change image text alternative":"Surat tekstiniň alternatiwasyny üýtgediň","Enter image caption":"Surat ýazgysyny giriziň","Full size image":"Doly ululykdaky surat","Image resize list":"","Image toolbar":"Surat gurallar paneli","image widget":"surat widjeti","In line":"",Insert:"","Insert image":"Surat goýuň","Insert image via URL":"","Left aligned image":"Çep deňleşdirilen surat",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Sag deňleşdirilen surat","Side image":"Gapdal surat","Text alternative":"Tekstiň alternatiwasy",Update:"","Update image URL":"","Upload failed":"Ýükläp bolmady","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.tk=n.tk||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Indent peseltmek","Increase indent":"Indent köpeltmek"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const a=i.tk=i.tk||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Dili saýlaň",Language:"Dil","Remove language":"Dili pozuň"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const n=a.tk=a.tk||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"Göçürip alyp bolýar","Edit link":"Baglanyşygy üýtget",Link:"Baglanyşyk","Link image":"Surat baglanyşygy","Link URL":"URL baglanyşygy","Open in a new tab":"Täze goýmada açyň","Open link in new tab":"Täze goýmada baglanyşyk açyň","This link has no URL":"Bu baglanyşykda URL ýok",Unlink:"Baglanyşygy aýyr"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.tk=e.tk||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Bullet sanawy","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Sanly sanaw","Numbered list styles toolbar":"",Square:"","To-do List":"Edilmeli işleriň sanawy","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const t=o.tk=o.tk||{};t.dictionary=Object.assign(t.dictionary||{},{"Remove Format":"Formaty aýyryň"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.tk=e.tk||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Öýjük tekstini aşagyna deňleşdiriň","Align cell text to the center":"Öýjük tekstini merkeze deňleşdiriň","Align cell text to the left":"Öýjük tekstini çepe deňleşdiriň","Align cell text to the middle":"Öýjük tekstini ortasyna deňleşdiriň","Align cell text to the right":"Öýjük tekstini saga deňleşdiriň","Align cell text to the top":"Öýjük tekstini ýokarsyna deňleşdiriň","Align table to the left":"Tablisany çepe deňleşdiriň","Align table to the right":"Tablisany sag tarapa deňleşdiriň",Alignment:"Deňleşdirmek",Background:"Arka",Border:"Serhet","Cell properties":"Öýjük aýratynlyklary","Center table":"Tablisany merkezleşdiriň",Color:"Reňk","Color picker":"Reňk saýlaýjy",Column:"Sütün",Dashed:"Çyzykly","Delete column":"Sütüni pozuň","Delete row":"Setiri poz",Dimensions:"Ölçegleri",Dotted:"Nokatly",Double:"Goşa","Enter table caption":"",Groove:"Groove","Header column":"Sözbaşy sütüni","Header row":"Sözbaşy hatary",Height:"Boý","Horizontal text alignment toolbar":"Kese tekst tekizlemek gurallar paneli","Insert column left":"Sütüni çepe goýuň","Insert column right":"Sütüni saga goýuň","Insert row above":"Hatary ýokaryk goýuň","Insert row below":"Hatary aşak goýuň","Insert table":"Tablisa goýuň",Inset:"Inset","Justify cell text":"Öýjük tekstini esaslandyryň","Merge cell down":"Öýjügi aşak birleşdiriň","Merge cell left":"Öýjügi çepe birleşdiriň","Merge cell right":"Öýjügi saga birleşdiriň","Merge cell up":"Öýjügi ýokary birleşdiriň","Merge cells":"Öýjükleri birleşdiriň",None:"Hiç",Outset:"Outset",Padding:"Padding",Ridge:"Kertik",Row:"Setir","Select column":"Sütün saýlaň","Select row":"Setir saýlaň",Solid:"Gaty","Split cell horizontally":"Öýjügi keseligine bölüň","Split cell vertically":"Öýjügi dikligine bölüň",Style:"Stil","Table alignment toolbar":"Tablisa deňleşdirmek gurallar paneli","Table cell text alignment":"Tablisa öýjükleriniň tekstini deňleşdirmek","Table properties":"Tablisa aýratynlyklary","Table toolbar":"Tablisa gurallar paneli",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Reňki nädogry "#FF0000" ýa-da "rgb(255,0,0)" ýa-da "gyzyl" barlap görüň.','The value is invalid. Try "10px" or "2em" or simply "2".':'Baha nädogry "10px" ýa-da "2em" ýa-da diňe "2" barlap görüň.',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Dik tekst tekizlemek gurallar paneli",Width:"Ini"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t.tk=t.tk||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"",Angle:"","Approximately equal to":"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"","Bitcoin sign":"","Cedi sign":"","Cent sign":"","Character categories":"","Colon sign":"Iki nokat nyşany","Contains as member":"","Copyright sign":"","Cruzeiro sign":"","Currency sign":"","Degree sign":"","Division sign":"","Dollar sign":"","Dong sign":"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","Drachma sign":"","Element of":"","Em dash":"","Empty set":"","En dash":"","end with leftwards arrow above":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","For all":"","Fraction slash":"","French franc sign":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"","Guarani sign":"","Horizontal ellipsis":"","Hryvnia sign":"","Identical to":"","Indian rupee sign":"",Infinity:"",Integral:"",Intersection:"","Inverted exclamation mark":"","Inverted question mark":"","Kip sign":"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin capital letter c with caron":"","Latin capital letter c with circumflex":"","Latin capital letter c with dot above":"","Latin capital letter d with caron":"","Latin capital letter d with stroke":"","Latin capital letter e with breve":"","Latin capital letter e with caron":"","Latin capital letter e with dot above":"","Latin capital letter e with macron":"","Latin capital letter e with ogonek":"","Latin capital letter eng":"","Latin capital letter g with breve":"","Latin capital letter g with cedilla":"","Latin capital letter g with circumflex":"","Latin capital letter g with dot above":"","Latin capital letter h with circumflex":"","Latin capital letter h with stroke":"","Latin capital letter i with breve":"","Latin capital letter i with dot above":"","Latin capital letter i with macron":"","Latin capital letter i with ogonek":"","Latin capital letter i with tilde":"","Latin capital letter j with circumflex":"","Latin capital letter k with cedilla":"","Latin capital letter l with acute":"","Latin capital letter l with caron":"","Latin capital letter l with cedilla":"","Latin capital letter l with middle dot":"","Latin capital letter l with stroke":"","Latin capital letter n with acute":"","Latin capital letter n with caron":"","Latin capital letter n with cedilla":"","Latin capital letter o with breve":"","Latin capital letter o with double acute":"","Latin capital letter o with macron":"","Latin capital letter r with acute":"","Latin capital letter r with caron":"","Latin capital letter r with cedilla":"","Latin capital letter s with acute":"","Latin capital letter s with caron":"","Latin capital letter s with cedilla":"","Latin capital letter s with circumflex":"","Latin capital letter t with caron":"","Latin capital letter t with cedilla":"","Latin capital letter t with stroke":"","Latin capital letter u with breve":"","Latin capital letter u with double acute":"","Latin capital letter u with macron":"","Latin capital letter u with ogonek":"","Latin capital letter u with ring above":"","Latin capital letter u with tilde":"","Latin capital letter w with circumflex":"","Latin capital letter y with circumflex":"","Latin capital letter y with diaeresis":"","Latin capital letter z with acute":"","Latin capital letter z with caron":"","Latin capital letter z with dot above":"","Latin capital ligature ij":"","Latin capital ligature oe":"","Latin small letter a with breve":"","Latin small letter a with macron":"","Latin small letter a with ogonek":"","Latin small letter c with acute":"","Latin small letter c with caron":"","Latin small letter c with circumflex":"","Latin small letter c with dot above":"","Latin small letter d with caron":"","Latin small letter d with stroke":"","Latin small letter dotless i":"","Latin small letter e with breve":"","Latin small letter e with caron":"","Latin small letter e with dot above":"","Latin small letter e with macron":"","Latin small letter e with ogonek":"","Latin small letter eng":"","Latin small letter f with hook":"","Latin small letter g with breve":"","Latin small letter g with cedilla":"","Latin small letter g with circumflex":"","Latin small letter g with dot above":"","Latin small letter h with circumflex":"","Latin small letter h with stroke":"","Latin small letter i with breve":"","Latin small letter i with macron":"","Latin small letter i with ogonek":"","Latin small letter i with tilde":"","Latin small letter j with circumflex":"","Latin small letter k with cedilla":"","Latin small letter kra":"","Latin small letter l with acute":"","Latin small letter l with caron":"","Latin small letter l with cedilla":"","Latin small letter l with middle dot":"","Latin small letter l with stroke":"","Latin small letter long s":"","Latin small letter n preceded by apostrophe":"","Latin small letter n with acute":"","Latin small letter n with caron":"","Latin small letter n with cedilla":"","Latin small letter o with breve":"","Latin small letter o with double acute":"","Latin small letter o with macron":"","Latin small letter r with acute":"","Latin small letter r with caron":"","Latin small letter r with cedilla":"","Latin small letter s with acute":"","Latin small letter s with caron":"","Latin small letter s with cedilla":"","Latin small letter s with circumflex":"","Latin small letter t with caron":"","Latin small letter t with cedilla":"","Latin small letter t with stroke":"","Latin small letter u with breve":"","Latin small letter u with double acute":"","Latin small letter u with macron":"","Latin small letter u with ogonek":"","Latin small letter u with ring above":"","Latin small letter u with tilde":"","Latin small letter w with circumflex":"","Latin small letter y with circumflex":"","Latin small letter z with acute":"","Latin small letter z with caron":"","Latin small letter z with dot above":"","Latin small ligature ij":"","Latin small ligature oe":"","Left double quotation mark":"","Left single quotation mark":"","Left-pointing double angle quotation mark":"","leftwards arrow to bar":"","leftwards dashed arrow":"","leftwards double arrow":"çepe tarap goşa ok","Less-than or equal to":"","Less-than sign":"","Lira sign":"","Livre tournois sign":"","Logical and":"","Logical or":"",Macron:"","Manat sign":"","Mill sign":"","Minus sign":"","Multiplication sign":"","N-ary product":"","N-ary summation":"",Nabla:"","Naira sign":"","New sheqel sign":"","Nordic mark sign":"","Not an element of":"","Not equal to":"","Not sign":"","on with exclamation mark with left right arrow above":"",Overline:"","Paragraph sign":"","Partial differential":"","Per mille sign":"","Per ten thousand sign":"","Peseta sign":"","Peso sign":"","Plus-minus sign":"","Pound sign":"","Proportional to":"","Question exclamation mark":"","Registered sign":"","Reversed paragraph sign":"","Right double quotation mark":"","Right single quotation mark":"","Right-pointing double angle quotation mark":"","rightwards arrow to bar":"","rightwards dashed arrow":"","rightwards double arrow":"","Ruble sign":"","Rupee sign":"","Section sign":"","Single left-pointing angle quotation mark":"","Single low-9 quotation mark":"","Single right-pointing angle quotation mark":"","soon with rightwards arrow above":"","Special characters":"Ýörite nyşanlar","Spesmilo sign":"","Square root":"","Tenge sign":"","There exists":"","Tilde operator":"","top with upwards arrow above":"","Trade mark sign":"","Tugrik sign":"","Turkish lira sign":"","Two dot leader":"",Union:"","up down arrow with base":"","upwards arrow to bar":"","upwards dashed arrow":"","upwards double arrow":"","Vulgar fraction one half":"","Vulgar fraction one quarter":"","Vulgar fraction three quarters":"","Won sign":"","Yen sign":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.tk=a.tk||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"1%-iň 0%-i",Aquamarine:"Akuamarin",Black:"Gara",Blue:"Gök",Cancel:"Ýatyr","Dim grey":"Goýy çal","Dropdown toolbar":"Açylýan gurallar paneli","Edit block":"Bloky redaktirläň","Editor toolbar":"Redaktor gurallar paneli",Green:"Ýaşyl",Grey:"Çal","Insert paragraph after block":"Blokdan soň abzas goýuň","Insert paragraph before block":"Blokdan öň abzas goýuň","Light blue":"Açyk gök","Light green":"Açyk ýaşyl","Light grey":"Açyk çal",Next:"Indiki",Orange:"Mämişi",Previous:"Öňki",Purple:"Gyrmyzy",Red:"Gyzyl",Redo:"Öňe gaýtar","Remove color":"Reňki aýyryň","Restore default":"","Rich Text Editor":"Baý Tekst Redaktory","Rich Text Editor, %0":"Baý Tekst Redaktory, %0",Save:"Saklaň","Select all":"Ählisini saýla","Show more items":"Has köp zady görkeziň",Turquoise:"Turkuaz",Undo:"Yza gaýtar","Upload in progress":"Ýüklemek dowam edýär",White:"Ak","Widget toolbar":"Widget gurallar paneli",Yellow:"Sary"}),e.getPluralForm=function(a){return 1!=a}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/tr.js b/core/assets/vendor/ckeditor5/translations/tr.js
new file mode 100644
index 0000000000000000000000000000000000000000..6ae4c4d783bf8b42ff56499959a22a184218be23
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/tr.js
@@ -0,0 +1 @@
+!function(a){const i=a.tr=a.tr||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Ortala","Align left":"Sola hizala","Align right":"Sağa hizala",Justify:"İki yana yasla","Text alignment":"Yazı hizalama","Text alignment toolbar":"Yazı Hizlama Araç Çubuğu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.tr=i.tr||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Kalın",Code:"Kod",Italic:"İtalik",Strikethrough:"Üstü çizili",Subscript:"Alt Simge",Superscript:"Üst Simge",Underline:"Altı Çizgili"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const t=n.tr=n.tr||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Alıntı"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.tr=a.tr||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Başlık tipi seç",Heading:"Başlık","Heading 1":"1. Seviye Başlık","Heading 2":"2. Seviye Başlık","Heading 3":"3. Seviye Başlık","Heading 4":"4. Seviye Başlık","Heading 5":"5. Seviye Başlık","Heading 6":"6. Seviye Başlık",Paragraph:"Paragraf","Type or paste your content here.":"İçeriğinizi buraya yapıştırın yada yazın.","Type your title":"Başlığınızı yazınız"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.tr=i.tr||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Yatay çiizgi"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.tr=e.tr||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Ortalanmış görsel","Change image text alternative":"Görsel alternatif yazısını değiştir","Enter image caption":"Resim açıklaması gir","Full size image":"Tam Boyut Görsel","Image resize list":"","Image toolbar":"Resim araç çubuğu","image widget":"resim aracı","In line":"",Insert:"","Insert image":"Görsel Ekle","Insert image via URL":"","Left aligned image":"Sola hizalı görsel",Original:"Orijinal","Resize image":"Resmi boyutlandır","Resize image to %0":"Resmi %0 ölçülerine boyutlandır","Resize image to the original size":"Resmi orijinal büyüklüğüne al","Right aligned image":"Sağa hizalı görsel","Side image":"Yan Görsel","Text alternative":"Yazı alternatifi",Update:"Güncelle","Update image URL":"","Upload failed":"Yükleme başarsız","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.tr=i.tr||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Girintiyi azalt","Increase indent":"Girintiyi arttır"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.tr=n.tr||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"İndirilebilir","Edit link":"Bağlantıyı değiştir",Link:"Bağlantı","Link image":"","Link URL":"Bağlantı Adresi","Open in a new tab":"Yeni sekmede aç","Open link in new tab":"Yeni sekmede aç","This link has no URL":"Bağlantı adresi yok",Unlink:"Bağlantıyı kaldır"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.tr=e.tr||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Simgeli Liste","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numaralı Liste","Numbered list styles toolbar":"",Square:"","To-do List":"Yapılacaklar Listesi","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.tr=i.tr||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"Biçimlendirmeyi Kaldır"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.tr=e.tr||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Hücre içindeki metni alta hizala","Align cell text to the center":"Hücre içindeki metnini ortaya hizalama","Align cell text to the left":"Hücre içindeki metnini sola hizala","Align cell text to the middle":"Hücre içindeki metni ortaya hizala","Align cell text to the right":"Hücre içindeki metnini sağa hizala","Align cell text to the top":"Hücre içindeki metni üste hizala","Align table to the left":"Tabloyu sola hizala","Align table to the right":"Tabloyu sağa hizala",Alignment:"Hizalama",Background:"Arkaplan",Border:"Kenar","Cell properties":"Hücre özellikleri","Center table":"Tabloyu ortala",Color:"Renk","Color picker":"Renk seçici",Column:"Kolon",Dashed:"Kesik çizgili","Delete column":"Kolonu sil","Delete row":"Satırı sil",Dimensions:"Ölçüler",Dotted:"Noktalı",Double:"Çift","Enter table caption":"",Groove:"Yiv","Header column":"Başlık kolonu","Header row":"Başlık satırı",Height:"Yükseklik","Horizontal text alignment toolbar":"Yatay metin hizalama araç çubuğu","Insert column left":"Sola kolon ekle","Insert column right":"Sağa kolon ekle","Insert row above":"Üste satır ekle","Insert row below":"Alta satır ekle","Insert table":"Tablo Ekle",Inset:"İçe","Justify cell text":"Hücre içindeki metini iki yana yasla","Merge cell down":"Aşağıya doğru birleştir","Merge cell left":"Sola doğru birleştir","Merge cell right":"Sağa doğru birleştir","Merge cell up":"Yukarı doğru birleştir","Merge cells":"Hücreleri birleştir",None:"Yok",Outset:"Dışarıya",Padding:"İç boşluk",Ridge:"Yükselti",Row:"Satır","Select column":"Kolon seç","Select row":"Satır seç",Solid:"Dolu","Split cell horizontally":"Hücreyi yatay böl","Split cell vertically":"Hücreyi dikey böl",Style:"Stil","Table alignment toolbar":"Tablo hizalama araç çubuğu","Table cell text alignment":"Tablo hücresi metin hizalaması","Table properties":"Tablo özellikleri","Table toolbar":"Tablo araç çubuğu",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Geçersiz renk. "#FF0000" veya "rgb(255,0,0)" veya "red" deneyin.','The value is invalid. Try "10px" or "2em" or simply "2".':'Geçersiz değer. "10px" veya "2em" veya sadece "2" deneyin.',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Dikey metin hizalama araç çubuğu",Width:"Genişlik"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const t=a.tr=a.tr||{};t.dictionary=Object.assign(t.dictionary||{},{"Almost equal to":"Neredeyse eşit",Angle:"Açı","Approximately equal to":"Yaklaşık olarak eşit","Asterisk operator":"Yıldız operatörü","Austral sign":"Austral işareti","back with leftwards arrow above":"geri sol ok yukarıda","Bitcoin sign":"Bitcoin işareti","Cedi sign":"Cedi işareti","Cent sign":"Kuruş işareti","Character categories":"Karakter kategorileri","Colon sign":"İki nokta üst üste işareti","Contains as member":"Üye olarak içerir","Copyright sign":"Telif hakkı işareti","Cruzeiro sign":"Cruzeiro işareti","Currency sign":"Para birimi işareti","Degree sign":"Derece işareti","Division sign":"Bölme işareti","Dollar sign":"Dolar işareti","Dong sign":"Dong işareti","Double dagger":"Çift hançer","Double exclamation mark":"Çift ünlem işareti","Double low-9 quotation mark":"Çift düşük 9 tırnak işareti","Double question mark":"Çift soru işareti","downwards arrow to bar":"aşağı ok çubuğu","downwards dashed arrow":"aşağı doğru kesik ok","downwards double arrow":"aşağı çift ok","Drachma sign":"Drahmisi işareti","Element of":"Öğesi","Em dash":"Uzun çizgi","Empty set":"Boş küme","En dash":"Çizgi","end with leftwards arrow above":"sona sol ok yukarıda","Euro sign":"Avro işareti","Euro-currency sign":"Avro para birimi simgesi","Exclamation question mark":"Ünlem soru işareti","For all":"Hepsi için","Fraction slash":"Kesir eğik çizgi","French franc sign":"Fransız Frangı işareti","German penny sign":"Alman kuruş işareti","Greater-than or equal to":"Büyük veya eşit","Greater-than sign":"Büyüktür işareti","Guarani sign":"Guarani işareti","Horizontal ellipsis":"Yatay elips","Hryvnia sign":"Grivnası işareti","Identical to":"Benzeri","Indian rupee sign":"Hint Rupisi işareti",Infinity:"Sonsuzluk",Integral:"İntegral",Intersection:"Kesişim","Inverted exclamation mark":"Ters ünlem işareti","Inverted question mark":"Ters soru işareti","Kip sign":"Kip işareti","Latin capital letter a with breve":"Üstü yuvarlak büyük a harfi","Latin capital letter a with macron":"Üstü çizili büyük a harfi","Latin capital letter a with ogonek":"Altı kuyruklu işaretli büyük a harfi","Latin capital letter c with acute":"Üzeri tırnaklı büyük c harfi","Latin capital letter c with caron":"Üstü ters şapkalı büyük c harfi","Latin capital letter c with circumflex":"Üzeri şapkalı büyük c harfi","Latin capital letter c with dot above":"Üstü noktalı büyük c harfi","Latin capital letter d with caron":"Üstü ters şapkalı büyük d harfi","Latin capital letter d with stroke":"Ortası çizgili büyük d harfi","Latin capital letter e with breve":"Üstü ters şapkalı büyük e harfi","Latin capital letter e with caron":"Üstü ters şapkalı büyük e harfi","Latin capital letter e with dot above":"Üstü noktalı büyük e harfi","Latin capital letter e with macron":"Üstü çizili büyük e harfi","Latin capital letter e with ogonek":"Altı kuyruklu büyük e harfi","Latin capital letter eng":"Alttan kuyruklu büyük n harfi","Latin capital letter g with breve":"Üstü ters şapkalı büyük g harfi","Latin capital letter g with cedilla":"Altı kuyruklu büyük g harfi","Latin capital letter g with circumflex":"Üzeri şapkalı büyük g harfi","Latin capital letter g with dot above":"Üstü noktalı büyük g harfi","Latin capital letter h with circumflex":"Üzeri şapkalı büyük h harfi","Latin capital letter h with stroke":"Üst kısmı çizgili büyük h harfi","Latin capital letter i with breve":"Üstü ters şapkalı büyük i harfi","Latin capital letter i with dot above":"Üstü noktalı büyük i harfi","Latin capital letter i with macron":"Üstü çizili büyük i harfi","Latin capital letter i with ogonek":"Altı kuyruklu büyük i harfi","Latin capital letter i with tilde":"Üstü tilda işaretli büyük i harfi","Latin capital letter j with circumflex":"Üzeri şapkalı büyük j harfi","Latin capital letter k with cedilla":"Altı kuyruklu büyük k harfi","Latin capital letter l with acute":"Üzeri tırnaklı büyük L harfi","Latin capital letter l with caron":"Üstü ters şapkalı büyük L harfi","Latin capital letter l with cedilla":"Altı kuyruklu büyük L harfi","Latin capital letter l with middle dot":"Ortası noktalı büyük L harfi","Latin capital letter l with stroke":"Üst kısmı çizgili büyük L harfi","Latin capital letter n with acute":"Üzeri tırnaklı büyük n harfi","Latin capital letter n with caron":"Üstü ters şapkalı büyük n harfi","Latin capital letter n with cedilla":"Altı kuyruklu büyük n harfi","Latin capital letter o with breve":"Üstü ters şapkalı büyük o harfi","Latin capital letter o with double acute":"Üstü çift tırnaklı büyük o harfi","Latin capital letter o with macron":"Üstü çizili büyük o harfi","Latin capital letter r with acute":"Üzeri tırnaklı büyük r harfi","Latin capital letter r with caron":"Üstü ters şapkalı büyük r harfi","Latin capital letter r with cedilla":"Altı kuyruklu büyük r harfi","Latin capital letter s with acute":"Üzeri tırnaklı büyük s harfi","Latin capital letter s with caron":"Üstü ters şapkalı büyük s harfi","Latin capital letter s with cedilla":"Altı kuyruklu büyük s harfi","Latin capital letter s with circumflex":"Üzeri şapkalı büyük s harfi","Latin capital letter t with caron":"Üstü ters şapkalı büyük t harfi","Latin capital letter t with cedilla":"Altı kuyruklu büyük t harfi","Latin capital letter t with stroke":"Üst kısmı çizgili büyük t harfi","Latin capital letter u with breve":"Üstü ters şapkalı büyük u harfi","Latin capital letter u with double acute":"Üstü çift tırnaklı büyük u harfi","Latin capital letter u with macron":"Üstü çizili büyük u harfi","Latin capital letter u with ogonek":"Altı kuyruklu büyük u harfi","Latin capital letter u with ring above":"Üstü derece işaretli büyük u harfi","Latin capital letter u with tilde":"Üstü tildalı büyük u harfi","Latin capital letter w with circumflex":"Üzeri şapkalı büyük w harfi","Latin capital letter y with circumflex":"Üzeri şapkalı büyük y harfi","Latin capital letter y with diaeresis":"Üstü çift noktalı büyük y harfi","Latin capital letter z with acute":"Üzeri tırnaklı büyük z harfi","Latin capital letter z with caron":"Üstü ters şapkalı büyük z harfi","Latin capital letter z with dot above":"Üstü noktalı büyük z harfi","Latin capital ligature ij":"Büyük ij harfi","Latin capital ligature oe":"Büyük yunan OE harfi","Latin small letter a with breve":"Üstü yuvarlak küçük a harfi","Latin small letter a with macron":"Üstü çizili küçük a harfi","Latin small letter a with ogonek":"Altı kuyruklu işaretli küçük a harfi","Latin small letter c with acute":"Üzeri tırnaklı küçük c harfi","Latin small letter c with caron":"Üstü ters şapkalı küçük c harfi","Latin small letter c with circumflex":"Üzeri şapkalı küçük c harfi","Latin small letter c with dot above":"Üstü noktalı küçük c harfi","Latin small letter d with caron":"Üstü ters şapkalı küçük d harfi","Latin small letter d with stroke":"Ortası çizgili küçük d harfi","Latin small letter dotless i":"Noktası küçük i harfi","Latin small letter e with breve":"Üstü ters şapkalı küçük e harfi","Latin small letter e with caron":"Üstü ters şapkalı küçük e harfi","Latin small letter e with dot above":"Üstü noktalı küçük e harfi","Latin small letter e with macron":"Üstü çizili küçük e harfi","Latin small letter e with ogonek":"Altı kuyruklu küçük e harfi","Latin small letter eng":"Alttan kuyruklu küçük n harfi","Latin small letter f with hook":"Latince küçük f harfi","Latin small letter g with breve":"Üstü ters şapkalı küçük g harfi","Latin small letter g with cedilla":"Altı kuyruklu küçük g harfi","Latin small letter g with circumflex":"Üzeri şapkalı küçük g harfi","Latin small letter g with dot above":"Üstü noktalı küçük g harfi","Latin small letter h with circumflex":"Üzeri şapkalı küçük g harfi","Latin small letter h with stroke":"Üst kısmı çizgili küçük h harfi","Latin small letter i with breve":"Üstü ters şapkalı küçük i harfi","Latin small letter i with macron":"Üstü çizili küçük i harfi","Latin small letter i with ogonek":"Altı kuyruklu küçük i harfi","Latin small letter i with tilde":"Üstü tilda işaretli küçük i harfi","Latin small letter j with circumflex":"Üzeri şapkalı küçük j harfi","Latin small letter k with cedilla":"Altı kuyruklu küçük k harfi","Latin small letter kra":"Küçük küt k harfi","Latin small letter l with acute":"Üzeri tırnaklı küçük L harfi","Latin small letter l with caron":"Üstü ters şapkalı küçük L harfi","Latin small letter l with cedilla":"Altı kuyruklu küçük L harfi","Latin small letter l with middle dot":"Ortası noktalı küçük L harfi","Latin small letter l with stroke":"Üst kısmı çizgili küçük L harfi","Latin small letter long s":"Uzun küçük s harfi","Latin small letter n preceded by apostrophe":"Önden apostrof küçük n harfi","Latin small letter n with acute":"Üzeri tırnaklı küçük n harfi","Latin small letter n with caron":"Üstü ters şapkalı küçük n harfi","Latin small letter n with cedilla":"Altı kuyruklu küçük n harfi","Latin small letter o with breve":"Üstü ters şapkalı küçük o harfi","Latin small letter o with double acute":"Üstü çift tırnaklı küçük o harfi","Latin small letter o with macron":"Üstü çizili küçük o harfi","Latin small letter r with acute":"Üzeri tırnaklı küçük r harfi","Latin small letter r with caron":"Üstü ters şapkalı küçük r harfi","Latin small letter r with cedilla":"Altı kuyruklu küçük r harfi","Latin small letter s with acute":"Üzeri tırnaklı küçük s harfi","Latin small letter s with caron":"Üstü ters şapkalı küçük s harfi","Latin small letter s with cedilla":"Altı kuyruklu küçük s harfi","Latin small letter s with circumflex":"Üzeri şapkalı küçük s harfi","Latin small letter t with caron":"Üstü ters şapkalı küçük t harfi","Latin small letter t with cedilla":"Altı kuyruklu küçük t harfi","Latin small letter t with stroke":"Üst kısmı çizgili küçük t harfi","Latin small letter u with breve":"Üstü ters şapkalı küçük u harfi","Latin small letter u with double acute":"Üstü çift tırnaklı küçük u harfi","Latin small letter u with macron":"Üstü çizili küçük u harfi","Latin small letter u with ogonek":"Altı kuyruklu küçük u harfi","Latin small letter u with ring above":"Üstü derece işaretli küçük u harfi","Latin small letter u with tilde":"Üstü tildalı küçük u harfi","Latin small letter w with circumflex":"Üzeri şapkalı küçük w harfi","Latin small letter y with circumflex":"Üzeri şapkalı küçük y harfi","Latin small letter z with acute":"Üzeri tırnaklı küçük z harfi","Latin small letter z with caron":"Üstü ters şapkalı küçük z harfi","Latin small letter z with dot above":"Üstü noktalı küçük z harfi","Latin small ligature ij":"Küçük ij harfi","Latin small ligature oe":"Küçük yunan OE harfi","Left double quotation mark":"Sol çift tırnak işareti","Left single quotation mark":"Sol tek tırnak işareti","Left-pointing double angle quotation mark":"Sola dönük çift açılı tırnak işareti","leftwards arrow to bar":"sola ok çubuğu","leftwards dashed arrow":"sola kesik çizgili ok","leftwards double arrow":"sola çift ok","Less-than or equal to":"Küçük veya eşit","Less-than sign":"Küçüktür işareti","Lira sign":"Lira işareti","Livre tournois sign":"Livre tournois işareti","Logical and":"Mantıksal VE","Logical or":"Mantıksal VEYA",Macron:"Uzatma işareti","Manat sign":"Manat işareti","Mill sign":"Mill işareti","Minus sign":"Eksi işareti","Multiplication sign":"Çarpma işareti","N-ary product":"N-ary ürünü","N-ary summation":"N-ary toplamı",Nabla:"Nabla","Naira sign":"Naira işareti","New sheqel sign":"Yeni şekel işareti","Nordic mark sign":"İskandinav işareti","Not an element of":"Onun öğesi değil","Not equal to":"Eşit değil","Not sign":"İmzalanmamış","on with exclamation mark with left right arrow above":"üzerinde sol sağ ok bulunan ünlem işaretiyle",Overline:"Üstü çizili","Paragraph sign":"Paragraf işareti","Partial differential":"Kısmi diferansiyel","Per mille sign":"Bin işareti için","Per ten thousand sign":"Her on bine göre işareti","Peseta sign":"Peseta işareti","Peso sign":"Peso işareti","Plus-minus sign":"Artı eksi işareti","Pound sign":"Sterlin işareti","Proportional to":"Orantılı","Question exclamation mark":"Soru ünlem işareti","Registered sign":"Kayıtlı işareti","Reversed paragraph sign":"Ters paragraf işareti","Right double quotation mark":"Sağ çift tırnak işareti","Right single quotation mark":"Sağ tek tırnak işareti","Right-pointing double angle quotation mark":"Sağa bakan çift açılı tırnak işareti","rightwards arrow to bar":"sağa ok çubuğu","rightwards dashed arrow":"sağa kesik çizgili ok","rightwards double arrow":"sağa çift ok","Ruble sign":"Ruble işareti","Rupee sign":"Rupi işareti","Section sign":"Bölüm işareti","Single left-pointing angle quotation mark":"Tek sola dönük açı tırnak işareti","Single low-9 quotation mark":"Tek düşük 9 tırnak işareti","Single right-pointing angle quotation mark":"Sağa bakan tek açılı tırnak işareti","soon with rightwards arrow above":"yakında sağ ok ile","Special characters":"Özel karakterler","Spesmilo sign":"Spesmilo işareti","Square root":"Kare kök","Tenge sign":"Tenge işareti","There exists":"Var","Tilde operator":"Tilde operatörü","top with upwards arrow above":"en üst yukarı oku","Trade mark sign":"Ticari marka işareti","Tugrik sign":"Tugrik işareti","Turkish lira sign":"Türk Lirası işareti","Two dot leader":"Öncelikli iki nokta",Union:"Birleşik","up down arrow with base":"taban ile yukarı aşağı ok","upwards arrow to bar":"yukarı ok çubuğu","upwards dashed arrow":"yukarı doğru kesik ok","upwards double arrow":"yukarı çift ok","Vulgar fraction one half":"Kaba kesir bir buçuk","Vulgar fraction one quarter":"Kaba kesir bir çeyrek","Vulgar fraction three quarters":"Kaba bölüm dörtte üç","Won sign":"Kazanılan işaret","Yen sign":"Yen işareti"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.tr=e.tr||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0/%1",Aquamarine:"Su Yeşili",Black:"Siyah",Blue:"Mavi",Cancel:"İptal","Dim grey":"Koyu Gri","Dropdown toolbar":"Açılır araç çubuğu","Edit block":"Bloğu Düzenle","Editor toolbar":"Düzenleme araç çubuğu",Green:"Yeşil",Grey:"Gri","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Açık Mavi","Light green":"Açık Yeşil","Light grey":"Açık Gri",Next:"Sonraki",Orange:"Turuncu",Previous:"Önceki",Purple:"Mor",Red:"Kırmızı",Redo:"Tekrar yap","Remove color":"Rengi Sil","Restore default":"","Rich Text Editor":"Zengin İçerik Editörü","Rich Text Editor, %0":"Zengin İçerik Editörü, %0",Save:"Kaydet","Select all":"Hepsini seç","Show more items":"Daha fazla öğe göster",Turquoise:"Turkuaz",Undo:"Geri al","Upload in progress":"Yükleme işlemi devam ediyor",White:"Beyaz","Widget toolbar":"Bileşen araç çubuğu",Yellow:"Sarı"}),r.getPluralForm=function(e){return e>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/tt.js b/core/assets/vendor/ckeditor5/translations/tt.js
new file mode 100644
index 0000000000000000000000000000000000000000..4b4281a5cec572bda84c494b4fd85c9b0f74ef1e
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/tt.js
@@ -0,0 +1 @@
+!function(t){const i=t.tt=t.tt||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Калын",Code:"Код",Italic:"",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const t=o.tt=o.tt||{};t.dictionary=Object.assign(t.dictionary||{},{"%0 of %1":"",Cancel:"",Redo:"Кабатла","Remove color":"","Restore default":"",Save:"Сакла","Show more items":"",Undo:""}),t.getPluralForm=function(o){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/ug.js b/core/assets/vendor/ckeditor5/translations/ug.js
new file mode 100644
index 0000000000000000000000000000000000000000..ae6a91a9145e8138c0b98c248c863a1624c36809
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/ug.js
@@ -0,0 +1 @@
+!function(n){const i=n.ug=n.ug||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"ئوتتۇرىغا توغرىلاش","Align left":"سولغا توغرىلاش","Align right":"ئوڭغا توغرىلاش",Justify:"تەكشىلەش","Text alignment":"تېكىست توغرىلاش","Text alignment toolbar":"تېكىست توغرىلاش قورالبالدىقى"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ug=i.ug||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"توم",Code:"كود",Italic:"يانتۇ",Strikethrough:"ئۆچۈرۈش سىزىقى",Subscript:"ئاستبەلگە",Superscript:"ئۈستبەلگە",Underline:"ئاستى سىزىق"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ug=i.ug||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"نەقىل"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ug=n.ug||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"ماۋزۇ تاللاش",Heading:"ماۋزۇ","Heading 1":"ماۋزۇ 1","Heading 2":"ماۋزۇ 2","Heading 3":"ماۋزۇ 3","Heading 4":"ماۋزۇ 4","Heading 5":"ماۋزۇ 5","Heading 6":"ماۋزۇ 6",Paragraph:"ئابزاس","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ug=e.ug||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"ئوتتۇردىكى رەسىم","Change image text alternative":"رەسىملىك تېكىست تاللىغۇچنى ئۆزگەرتىش","Enter image caption":"رەسىمنىڭ تېمىسىنى كىرگۈزۈڭ","Full size image":"ئەسلى چوڭلۇقتىكى رەسىم","Image resize list":"","Image toolbar":"","image widget":"رەسىمچىك","In line":"",Insert:"","Insert image":"رەسىم قىستۇرۇش","Insert image via URL":"","Left aligned image":"سولغا توغۇرلانغان رەسىم",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"ئوڭغا توغۇرلانغان رەسىم","Side image":"يان رەسىم","Text alternative":"تېكىست ئاملاشتۇرۇش",Update:"","Update image URL":"","Upload failed":"چىقىرىش مەغلۇپ بولدى","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ug=n.ug||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"",Link:"ئۇلانما","Link image":"","Link URL":"ئۇلاش ئادىرسى","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"ئۇلانمىنى ئۈزۈش"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ug=e.ug||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"بەلگە تىزىملىك","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"نومۇرلۇق تىزىملىك","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ug=e.ug||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"",Dashed:"","Delete column":"","Delete row":"",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"","Header row":"",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"","Insert row below":"","Insert table":"جەدۋەل قىستۇر",Inset:"","Justify cell text":"","Merge cell down":"","Merge cell left":"","Merge cell right":"","Merge cell up":"","Merge cells":"",None:"",Outset:"",Padding:"",Ridge:"",Row:"","Select column":"","Select row":"",Solid:"","Split cell horizontally":"","Split cell vertically":"",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.ug=e.ug||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"ئىناۋەتسىز","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"تەكرارلاش","Remove color":"رەڭنى چىقىرىۋېتىش","Restore default":"","Rich Text Editor":"تېكىست تەھرىرلىگۈچ","Rich Text Editor, %0":"تېكىست تەھرىرلىگۈچ، 0%",Save:"ساقلاش","Show more items":"",Turquoise:"",Undo:"يېنىۋېلىش",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/uk.js b/core/assets/vendor/ckeditor5/translations/uk.js
new file mode 100644
index 0000000000000000000000000000000000000000..54b38775ade13b65340f524fb3cd9ac2a5ff0c59
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/uk.js
@@ -0,0 +1 @@
+!function(n){const i=n.uk=n.uk||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"По центру","Align left":"По лівому краю","Align right":"По правому краю",Justify:"По ширині","Text alignment":"Вирівнювання тексту","Text alignment toolbar":"Панель інструментів вирівнювання тексту"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.uk=i.uk||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Жирний",Code:"Код",Italic:"Курсив",Strikethrough:"Закреслений",Subscript:"Нижній індекс",Superscript:"Верхній індекс",Underline:"Підкреслений"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.uk=i.uk||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитата"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.uk=n.uk||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Оберіть заголовок",Heading:"Заголовок","Heading 1":"Заголовок 1","Heading 2":"Заголовок 2","Heading 3":"Заголовок 3","Heading 4":"Заголовок 4","Heading 5":"Заголовок 5","Heading 6":"Заголовок 6",Paragraph:"Параграф","Type or paste your content here.":"Введіть або вставте свій вміст тут.","Type your title":"Введіть назву"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.uk=i.uk||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Горизонтальна лінія"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.uk=e.uk||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Зображення по центру","Change image text alternative":"Змінити текстову альтернативу зображення","Enter image caption":"Введіть підпис зображення","Full size image":"Повний розмір зображення","Image resize list":"Перелік розмірів","Image toolbar":"Панелі інструментів зображення","image widget":"Віджет зображення","In line":"",Insert:"Вставити","Insert image":"Вставити зображення","Insert image via URL":"Вставити зображення через посилання","Left aligned image":"Зображення ліворуч",Original:"Оригінал","Resize image":"Розтягнути зображення","Resize image to %0":"Розтягнути зображення до %0","Resize image to the original size":"Розтягнути зображення до оригінального розміру","Right aligned image":"Зображення праворуч","Side image":"Бокове зображення","Text alternative":"Текстова альтернатива",Update:"Оновити","Update image URL":"Оновити посилання на зображення","Upload failed":"Завантаження не вдалось","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.uk=n.uk||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Зменшити відступ","Increase indent":"Збільшити відступ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.uk=n.uk||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Обрати мову",Language:"Мова","Remove language":"Видалити мову"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.uk=n.uk||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Завантажувальне","Edit link":"Редагувати посилання",Link:"Посилання","Link image":"Посилання зображення","Link URL":"URL посилання","Open in a new tab":"Вікрити у новій вкладці","Open link in new tab":"Відкрити посилання у новій вкладці","This link has no URL":"Це посилання не має URL",Unlink:"Видалити посилання"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.uk=e.uk||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Маркерний список","Bulleted list styles toolbar":"Панель маркерних списків",Circle:"Коло",Decimal:"Цифри","Decimal with leading zero":"Цифри із провідним нулем",Disc:"Круг","Lower-latin":"","Lower–roman":"","Numbered List":"Нумерований список","Numbered list styles toolbar":"Панель нумерованих списків",Square:"Квадрат","To-do List":"Список справ","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.uk=i.uk||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"Видалити форматування"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.uk=e.uk||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Вирівняти текст комірки по низу","Align cell text to the center":"Вирівняти текст по центру","Align cell text to the left":"Вирівняти текст по лівому краю","Align cell text to the middle":"Вирівняти текст комірки по середині","Align cell text to the right":"Вирівняти текст по правому краю","Align cell text to the top":"Вирівняти текст комірки по верху ","Align table to the left":"Вирівняти таблицю по лівому краю","Align table to the right":"Вирівняти таблицю по правому краю ",Alignment:"Вирівнювання",Background:"Фон",Border:"Межа","Cell properties":"Властивості комірок","Center table":"Відцентрувати таблицю",Color:"Колір","Color picker":"Вибір кольору",Column:"Стовпець",Dashed:"Пунктирна","Delete column":"Видалити стовпець","Delete row":"Видалити рядок",Dimensions:"Розміри",Dotted:"Точкова",Double:"Подвійна","Enter table caption":"",Groove:"Жолобчаста","Header column":"Заголовок стовпця","Header row":"Заголовок рядка",Height:"Висота","Horizontal text alignment toolbar":"Панель інструментів вирівнювання горизонтального тексту","Insert column left":"Вставити стовпець зліва","Insert column right":"Вставити стовпець справа","Insert row above":"Вставити рядок знизу","Insert row below":"Вставити рядок зверху","Insert table":"Вставити таблицю",Inset:"Угнута","Justify cell text":"Вирівняти текст по ширині ","Merge cell down":"Поєднати комірки внизу","Merge cell left":"Поєднати комірки ліворуч","Merge cell right":"Поєднати комірки праворуч","Merge cell up":"Поєднати комірки вгору","Merge cells":"Поєднати комірки",None:"Не вказано",Outset:"Випукла",Padding:"Заповнення",Ridge:"Ребриста",Row:"Рядок","Select column":"Виберіть стовпчик","Select row":"Виберіть рядок",Solid:"Суцільний","Split cell horizontally":"Розділити комірки горизонтально","Split cell vertically":"Розділити комірки вертикально",Style:"Стиль","Table alignment toolbar":"Панель інструментів вирівнювання таблиці","Table cell text alignment":"Вирівнювання тексту комірки","Table properties":"Властивості таблиці","Table toolbar":"Панель інструментів таблиці",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Колір недійсний. Спробуйте "#FF0000" або "rgb(255,0,0)" або "red"','The value is invalid. Try "10px" or "2em" or simply "2".':'Значення недійсне. Спробуйте "10px" або "2em" або просто "2"',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Панель інструментів вертикального вирівнювання тексту",Width:"Ширина"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.uk=e.uk||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 із %1",Aquamarine:"Аквамариновий",Black:"Чорний",Blue:"Синій",Cancel:"Відміна","Dim grey":"Темно-сірий","Dropdown toolbar":"Випадаюча панель інструментів","Edit block":"Редагувати блок","Editor toolbar":"Панель інструментів редактора",Green:"Зелений",Grey:"Сірий","Insert paragraph after block":"Додати абзац після блока","Insert paragraph before block":"Додати абзац перед блоком","Light blue":"Світло-синій","Light green":"Світло-зелений","Light grey":"Світло-сірий",Next:"Наступний",Orange:"Помаранчевий",Previous:"Попередній",Purple:"Фіолетовий",Red:"Червоний",Redo:"Повтор","Remove color":"Видалити колір","Restore default":"","Rich Text Editor":"Розширений текстовий редактор","Rich Text Editor, %0":"Розширений текстовий редактор, %0",Save:"Зберегти","Select all":"Вибрати все","Show more items":"Показати більше",Turquoise:"Бірюзовий",Undo:"Відміна","Upload in progress":"Виконується завантаження",White:"Білий","Widget toolbar":"Панель інструментів віджетів",Yellow:"Жовтий"}),o.getPluralForm=function(e){return e%1==0&&e%10==1&&e%100!=11?0:e%1==0&&e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?1:e%1==0&&(e%10==0||e%10>=5&&e%10<=9||e%100>=11&&e%100<=14)?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/vi.js b/core/assets/vendor/ckeditor5/translations/vi.js
new file mode 100644
index 0000000000000000000000000000000000000000..8be30edc4e6ce3b986baf4887bc7f68e95d92fe6
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/vi.js
@@ -0,0 +1 @@
+!function(n){const i=n.vi=n.vi||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Canh giữa","Align left":"Canh trái","Align right":"Canh phải",Justify:"Canh đều","Text alignment":"Căn chỉnh văn bản","Text alignment toolbar":"Thanh công cụ canh chữ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.vi=i.vi||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Đậm",Code:"Code",Italic:"Nghiêng",Strikethrough:"Gạch ngang",Subscript:"Chữ nhỏ dưới",Superscript:"Chữ nhỏ trên",Underline:"Gạch dưới"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.vi=i.vi||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Trích dẫn"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.vi=i.vi||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Chọn tiêu đề",Heading:"Tiêu đề","Heading 1":"Tiêu đề 1","Heading 2":"Tiêu đề 2","Heading 3":"Tiêu đề 3","Heading 4":"Tiêu đề 4","Heading 5":"Tiêu đề 5","Heading 6":"Tiêu đề 6",Paragraph:"Đoạn văn","Type or paste your content here.":"Nhập hoặc dán nội dung tại đây","Type your title":"Nhập tựa đề"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.vi=n.vi||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Đường ngang"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.vi=n.vi||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"","Centered image":"Ảnh canh giữa","Change image text alternative":"Đổi chữ alt của ảnh","Enter image caption":"Nhập mô tả ảnh","Full size image":"Ảnh đầy đủ","Image resize list":"Danh sách ảnh đã chỉnh kích thước","Image toolbar":"Thanh công cụ hình ảnh","image widget":"tiện ích ảnh","In line":"",Insert:"Chèn","Insert image":"Chèn ảnh","Insert image via URL":"Chèn ảnh từ URL","Left aligned image":"Ảnh canh trái",Original:"Nguyên bản","Resize image":"Chỉnh kích cỡ ảnh","Resize image to %0":"Chỉnh kích cỡ ảnh về %0","Resize image to the original size":"Chỉnh về ảnh kích cỡ nguyên gốc","Right aligned image":"Ảnh canh phải","Side image":"Ảnh một bên","Text alternative":"Chữ alt",Update:"Cập nhật","Update image URL":"Cập nhật ảnh từ URL","Upload failed":"Tải thất bại","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.vi=n.vi||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Giảm lề","Increase indent":"Tăng lề"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.vi=n.vi||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Có thể tải về","Edit link":"Sửa liên kết",Link:"Chèn liên kết","Link image":"Liên kết của ảnh","Link URL":"Đường dẫn liên kết","Open in a new tab":"Mở trên tab mới","Open link in new tab":"Mở liên kết","This link has no URL":"Liên kết không có đường dẫn",Unlink:"Bỏ liên kết"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.vi=e.vi||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Danh sách đánh ký hiệu","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Danh sách đánh số","Numbered list styles toolbar":"",Square:"","To-do List":"Danh sách cần làm","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.vi=i.vi||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"Xóa định dang"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const e=t.vi=t.vi||{};e.dictionary=Object.assign(e.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"Căn lề",Background:"Màu nền",Border:"Viền","Cell properties":"Thuộc tính của ô","Center table":"",Color:"Màu","Color picker":"",Column:"Cột",Dashed:"","Delete column":"Xoá cột","Delete row":"Xoá hàng",Dimensions:"Kích thước",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Tiêu đề cột","Header row":"Tiêu đề hàng",Height:"Cao","Horizontal text alignment toolbar":"","Insert column left":"Thêm cột vào bên trái","Insert column right":"Thêm cột vào bên phải","Insert row above":"Thêm hàng phía trên","Insert row below":"Thêm hàng ở dưới","Insert table":"Tạo bảng",Inset:"","Justify cell text":"","Merge cell down":"Sát nhập ô xuống dưới","Merge cell left":"Sát nhập ô qua trái","Merge cell right":"Sát nhập ô qua phải","Merge cell up":"Sát nhập ô lên trên","Merge cells":"Sát nhập ô",None:"",Outset:"",Padding:"Cách lề",Ridge:"",Row:"Hàng","Select column":"Chọn cột","Select row":"Chọn hàng",Solid:"","Split cell horizontally":"Tách ô theo chiều ngang","Split cell vertically":"Tách ô theo chiều dọc",Style:"Kiểu","Table alignment toolbar":"","Table cell text alignment":"Căn lề văn bản trong ô","Table properties":"Thuộc tính của bảng","Table toolbar":"Thanh công cụ bảng",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:"Rộng"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.vi=n.vi||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 đến %1",Aquamarine:"Xanh ngọc biển",Black:"Đen",Blue:"Xanh biển",Cancel:"Hủy","Dim grey":"Xám mờ","Dropdown toolbar":"Thanh công cụ danh mục","Edit block":"Chỉnh sửa đoạn","Editor toolbar":"Thanh công cụ biên tập",Green:"Xanh lá",Grey:"Xám","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Xanh dương","Light green":"Xanh lá nhạt","Light grey":"Xám nhạt",Next:"Tiếp theo",Orange:"Cam",Previous:"Quay lại",Purple:"Tím",Red:"Đỏ",Redo:"Tiếp tục","Remove color":"Xóa màu","Restore default":"","Rich Text Editor":"Trình soạn thảo văn bản","Rich Text Editor, %0":"Trình soạn thảo văn bản, %0",Save:"Lưu","Show more items":"Xem thêm",Turquoise:"Xanh ngọc bích",Undo:"Hoàn tác","Upload in progress":"Đang tải lên",White:"Trắng","Widget toolbar":"Thanh công cụ tiện ích",Yellow:"Vàng"}),o.getPluralForm=function(n){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/zh-cn.js b/core/assets/vendor/ckeditor5/translations/zh-cn.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a5cc92ea173150cf7afe463e63d49b7f8d1c828
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/zh-cn.js
@@ -0,0 +1 @@
+!function(n){const i=n["zh-cn"]=n["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"居中对齐","Align left":"左对齐","Align right":"右对齐",Justify:"两端对齐","Text alignment":"对齐","Text alignment toolbar":"对齐工具栏"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i["zh-cn"]=i["zh-cn"]||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"加粗",Code:"代码",Italic:"倾斜",Strikethrough:"删除线",Subscript:"下标",Superscript:"上标",Underline:"下划线"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const c=n["zh-cn"]=n["zh-cn"]||{};c.dictionary=Object.assign(c.dictionary||{},{"Block quote":"块引用"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["zh-cn"]=n["zh-cn"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"标题类型",Heading:"标题","Heading 1":"标题 1","Heading 2":"标题 2","Heading 3":"标题 3","Heading 4":"标题 4","Heading 5":"标题 5","Heading 6":"标题 6",Paragraph:"段落","Type or paste your content here.":"在这里输入或粘贴内容","Type your title":"输入标题"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["zh-cn"]=n["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"水平线"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e["zh-cn"]=e["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"图片居中","Change image text alternative":"更改图片替换文本","Enter image caption":"输入图片标题","Full size image":"图片通栏显示","Image resize list":"图片大小列表","Image toolbar":"图片工具栏","image widget":"图像小部件","In line":"",Insert:"插入","Insert image":"插入图像","Insert image via URL":"通过URL地址插入图片","Left aligned image":"图片左侧对齐",Original:"原始大小","Resize image":"调整图像大小","Resize image to %0":"调整图像大小为0%","Resize image to the original size":"调整图像大小为原始大小","Right aligned image":"图片右侧对齐","Side image":"图片侧边显示","Text alternative":"替换文本",Update:"更新","Update image URL":"更新图片URL地址","Upload failed":"上传失败","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["zh-cn"]=n["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"减少缩进","Increase indent":"增加缩进"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n["zh-cn"]=n["zh-cn"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"选择语言",Language:"语言","Remove language":"移除语言"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["zh-cn"]=n["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"可下载","Edit link":"修改链接",Link:"超链接","Link image":"链接图片","Link URL":"链接网址","Open in a new tab":"在新标签页中打开","Open link in new tab":"在新标签页中打开链接","This link has no URL":"此链接没有设置网址",Unlink:"取消超链接"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e["zh-cn"]=e["zh-cn"]||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"项目符号列表","Bulleted list styles toolbar":"项目符号列表样式工具条",Circle:"空心圆点",Decimal:"阿拉伯数字","Decimal with leading zero":"前导零阿拉伯数字",Disc:"实心圆点","Lower-latin":"小写拉丁字母","Lower–roman":"小写罗马数字","Numbered List":"项目编号列表","Numbered list styles toolbar":"项目编号列表样式工具条",Square:"实心方块","To-do List":"待办列表","Toggle the circle list style":"切换空心原点列表样式","Toggle the decimal list style":"切换阿拉伯数字列表样式","Toggle the decimal with leading zero list style":"切换前导零阿拉伯数字列表样式","Toggle the disc list style":"切换实心原点列表样式","Toggle the lower–latin list style":"切换小写拉丁字母列表样式","Toggle the lower–roman list style":"切换小写罗马数字列表样式","Toggle the square list style":"切换实心方块列表样式","Toggle the upper–latin list style":"切换大写拉丁字母列表样式","Toggle the upper–roman list style":"切换大写罗马数字列表样式","Upper-latin":"大写拉丁字母","Upper-roman":"大写罗马数字"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["zh-cn"]=n["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Remove Format":"移除格式"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const c=n["zh-cn"]=n["zh-cn"]||{};c.dictionary=Object.assign(c.dictionary||{},{Source:"源代码"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e["zh-cn"]=e["zh-cn"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"使单元格文本对齐到底部","Align cell text to the center":"使单元格文本水平居中","Align cell text to the left":"使单元格文本左对齐","Align cell text to the middle":"使单元格文本垂直居中","Align cell text to the right":"使单元格文本右对齐","Align cell text to the top":"使单元格文本对齐到顶部","Align table to the left":"使表格左对齐","Align table to the right":"使表格右对齐",Alignment:"对齐",Background:"背景",Border:"边框","Cell properties":"单元格属性","Center table":"表格居中",Color:"颜色","Color picker":"颜色选择器",Column:"列",Dashed:"虚线","Delete column":"删除本列","Delete row":"删除本行",Dimensions:"尺寸",Dotted:"点状虚线",Double:"双线","Enter table caption":"",Groove:"凹槽边框","Header column":"标题列","Header row":"标题行",Height:"高度","Horizontal text alignment toolbar":"水平文本对齐工具栏","Insert column left":"左侧插入列","Insert column right":"右侧插入列","Insert row above":"在上面插入一行","Insert row below":"在下面插入一行","Insert table":"插入表格",Inset:"凹边框","Justify cell text":"对齐单元格文本","Merge cell down":"向下合并单元格","Merge cell left":"向左合并单元格","Merge cell right":"向右合并单元格","Merge cell up":"向上合并单元格","Merge cells":"合并单元格",None:"无",Outset:"凸边框",Padding:"内边距",Ridge:"垄状边框",Row:"行","Select column":"选择列","Select row":"选择行",Solid:"实线","Split cell horizontally":"横向拆分单元格","Split cell vertically":"纵向拆分单元格",Style:"样式","Table alignment toolbar":"表格对齐工具栏","Table cell text alignment":"表格单元格中的文本水平对齐","Table properties":"表格属性","Table toolbar":"表格工具栏",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'颜色无效。尝试使用"#FF0000"、"rgb(255,0,0)"或者"red"。','The value is invalid. Try "10px" or "2em" or simply "2".':"无效值。尝试使用“10px”、“2ex”或者只写“2”。","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"垂直文本对齐工具栏",Width:"宽度"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t["zh-cn"]=t["zh-cn"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"约等于",Angle:"角","Approximately equal to":"近似等于","Asterisk operator":"星号运算符","Austral sign":"澳大利亚货币符号","back with leftwards arrow above":"带有back标识的向左箭头","Bitcoin sign":"比特币符号","Cedi sign":"塞地符号","Cent sign":"分币符号","Character categories":"字符类别","Colon sign":"科朗符号","Contains as member":"包含","Copyright sign":"版权符号","Cruzeiro sign":"克鲁塞罗符号","Currency sign":"货币符号","Degree sign":"度数符号","Division sign":"除号","Dollar sign":"美元符号","Dong sign":"越南盾符号","Double dagger":"双剑号","Double exclamation mark":"双叹号","Double low-9 quotation mark":"低位后双引号","Double question mark":"双问号","downwards arrow to bar":"头部带杠的向下箭头","downwards dashed arrow":"向下虚线箭头","downwards double arrow":"向下双箭头","Drachma sign":"德拉克马符号","Element of":"属于","Em dash":"长破折号","Empty set":"空集","En dash":"短破折号","end with leftwards arrow above":"带有end标识的向左箭头","Euro sign":"欧元符号","Euro-currency sign":"欧元货币符号","Exclamation question mark":"感叹疑问号","For all":"对于全部","Fraction slash":"分数斜线","French franc sign":"法国法郎符号","German penny sign":"德国便士符号","Greater-than or equal to":"大于等于","Greater-than sign":"大于号","Guarani sign":"瓜拉尼货币符号","Horizontal ellipsis":"省略号","Hryvnia sign":"戈里夫纳符号","Identical to":"恒等于","Indian rupee sign":"印度卢比符号",Infinity:"无穷大",Integral:"积分",Intersection:"交集","Inverted exclamation mark":"反感叹号","Inverted question mark":"反问号","Kip sign":" 基普符号","Latin capital letter a with breve":"带短音符的大写拉丁字母a","Latin capital letter a with macron":"带长音符的大写拉丁字母a","Latin capital letter a with ogonek":"带反尾形符的大写拉丁字母a","Latin capital letter c with acute":"带锐音符的大写拉丁字母c","Latin capital letter c with caron":"带抑扬符的大写拉丁字母c","Latin capital letter c with circumflex":"带扬抑符的大写拉丁字母c","Latin capital letter c with dot above":"带上点的大写拉丁字母c","Latin capital letter d with caron":"带抑扬符的大写拉丁字母d","Latin capital letter d with stroke":"带删节线的大写拉丁字母d","Latin capital letter e with breve":"带短音符的大写拉丁字母e","Latin capital letter e with caron":"带抑扬符的大写拉丁字母e","Latin capital letter e with dot above":"带上点的大写拉丁字母e","Latin capital letter e with macron":"带长音符的大写拉丁字母e","Latin capital letter e with ogonek":"带反尾形符的大写拉丁字母e","Latin capital letter eng":"大写拉丁字母eng","Latin capital letter g with breve":"带短音符的大写拉丁字母g","Latin capital letter g with cedilla":"带软音符的大写拉丁字母g","Latin capital letter g with circumflex":"带扬抑符的大写拉丁字母g","Latin capital letter g with dot above":"带上点的大写拉丁字母g","Latin capital letter h with circumflex":"带扬抑符的大写拉丁字母h","Latin capital letter h with stroke":"带删节线的大写拉丁字母h","Latin capital letter i with breve":"带短音符的大写拉丁字母i","Latin capital letter i with dot above":"带上点的大写拉丁字母i","Latin capital letter i with macron":"带长音符的大写拉丁字母i","Latin capital letter i with ogonek":"带反尾形符的大写拉丁字母i","Latin capital letter i with tilde":"带腭化符的大写拉丁字母i","Latin capital letter j with circumflex":"带扬抑符的大写拉丁字母j","Latin capital letter k with cedilla":"带软音符的大写拉丁字母k","Latin capital letter l with acute":"带锐音符的大写拉丁字母l","Latin capital letter l with caron":"带抑扬符的大写拉丁字母l","Latin capital letter l with cedilla":"带软音符的大写拉丁字母l","Latin capital letter l with middle dot":"带中点的大写拉丁字母l","Latin capital letter l with stroke":"带删节线的大写拉丁字母l","Latin capital letter n with acute":"带锐音符的大写拉丁字母n","Latin capital letter n with caron":"带抑扬符的大写拉丁字母n","Latin capital letter n with cedilla":"带软音符的大写拉丁字母n","Latin capital letter o with breve":"带短音符的大写拉丁字母o","Latin capital letter o with double acute":"带双锐音符的大写拉丁字母o","Latin capital letter o with macron":"带长音符的大写拉丁字母o","Latin capital letter r with acute":"带锐音符的大写拉丁字母r","Latin capital letter r with caron":"带抑扬符的大写拉丁字母r","Latin capital letter r with cedilla":"带软音符的大写拉丁字母r","Latin capital letter s with acute":"带锐音符的大写拉丁字母s","Latin capital letter s with caron":"带抑扬符的大写拉丁字母s","Latin capital letter s with cedilla":"带软音符的大写拉丁字母s","Latin capital letter s with circumflex":"带扬抑符的大写拉丁字母s","Latin capital letter t with caron":"带抑扬符的大写拉丁字母t","Latin capital letter t with cedilla":"带软音符的大写拉丁字母t","Latin capital letter t with stroke":"带删节线的大写拉丁字母t","Latin capital letter u with breve":"带短音符的大写拉丁字母u","Latin capital letter u with double acute":"带双锐音符的大写拉丁字母u","Latin capital letter u with macron":"带长音符的大写拉丁字母u","Latin capital letter u with ogonek":"带反尾形符的大写拉丁字母u","Latin capital letter u with ring above":"带上圆圈的大写拉丁字母u","Latin capital letter u with tilde":"带腭化符的大写拉丁字母u","Latin capital letter w with circumflex":"带扬抑符的大写拉丁字母w","Latin capital letter y with circumflex":"带扬抑符的大写拉丁字母y","Latin capital letter y with diaeresis":"带分音符的大写拉丁字母y","Latin capital letter z with acute":"带锐音符的大写拉丁字母z","Latin capital letter z with caron":"带抑扬符的大写拉丁字母z","Latin capital letter z with dot above":"带上点的大写拉丁字母z","Latin capital ligature ij":"大写拉丁连字符ij","Latin capital ligature oe":"大写拉丁连字符oe","Latin small letter a with breve":"带短音符的小写拉丁字母a","Latin small letter a with macron":"带长音符的小写拉丁字母a","Latin small letter a with ogonek":"带反尾形符的小写拉丁字母a","Latin small letter c with acute":"带锐音符的小写拉丁字母c","Latin small letter c with caron":"带抑扬符的小写拉丁字母c","Latin small letter c with circumflex":"带扬抑符的小写拉丁字母c","Latin small letter c with dot above":"带上点的小写拉丁字母c","Latin small letter d with caron":"带抑扬符的小写拉丁字母d","Latin small letter d with stroke":"带删节线的小写拉丁字母d","Latin small letter dotless i":"没有点的小写拉丁字母i","Latin small letter e with breve":"带短音符的小写拉丁字母e","Latin small letter e with caron":"带抑扬符的小写拉丁字母e","Latin small letter e with dot above":"带上点的小写拉丁字母e","Latin small letter e with macron":"带长音符的小写拉丁字母e","Latin small letter e with ogonek":"带反尾形符的小写拉丁字母e","Latin small letter eng":"小写拉丁字母eng","Latin small letter f with hook":"带钩的拉丁文小写字母 F","Latin small letter g with breve":"带短音符的小写拉丁字母g","Latin small letter g with cedilla":"带软音符的小写拉丁字母g","Latin small letter g with circumflex":"带扬抑符的小写拉丁字母g","Latin small letter g with dot above":"带上点的小写拉丁字母g","Latin small letter h with circumflex":"带扬抑符的小写拉丁字母h","Latin small letter h with stroke":"带删节线的小写拉丁字母h","Latin small letter i with breve":"带短音符的小写拉丁字母i","Latin small letter i with macron":"带长音符的小写拉丁字母i","Latin small letter i with ogonek":"带反尾形符的小写拉丁字母i","Latin small letter i with tilde":"带腭化符的小写拉丁字母i","Latin small letter j with circumflex":"带扬抑符的小写拉丁字母j","Latin small letter k with cedilla":"带软音符的小写拉丁字母k","Latin small letter kra":"小写拉丁字母kra","Latin small letter l with acute":"带锐音符的小写拉丁字母l","Latin small letter l with caron":"带抑扬符的小写拉丁字母l","Latin small letter l with cedilla":"带软音符的小写拉丁字母l","Latin small letter l with middle dot":"带中点的小写拉丁字母l","Latin small letter l with stroke":"带删节线的小写拉丁字母l","Latin small letter long s":"小写拉丁字母长s","Latin small letter n preceded by apostrophe":"冠以撇号的小写拉丁字母n","Latin small letter n with acute":"带锐音符的小写拉丁字母n","Latin small letter n with caron":"带抑扬符的小写拉丁字母n","Latin small letter n with cedilla":"带软音符的小写拉丁字母n","Latin small letter o with breve":"带短音符的小写拉丁字母o","Latin small letter o with double acute":"带双锐音符的小写拉丁字母o","Latin small letter o with macron":"带长音符的小写拉丁字母o","Latin small letter r with acute":"带锐音符的小写拉丁字母r","Latin small letter r with caron":"带抑扬符的小写拉丁字母r","Latin small letter r with cedilla":"带软音符的小写拉丁字母r","Latin small letter s with acute":"带锐音符的小写拉丁字母s","Latin small letter s with caron":"带抑扬符的小写拉丁字母s","Latin small letter s with cedilla":"带软音符的小写拉丁字母s","Latin small letter s with circumflex":"带扬抑符的小写拉丁字母s","Latin small letter t with caron":"带抑扬符的小写拉丁字母t","Latin small letter t with cedilla":"带软音符的小写拉丁字母t","Latin small letter t with stroke":"带删节线的小写拉丁字母t","Latin small letter u with breve":"带短音符的小写拉丁字母u","Latin small letter u with double acute":"带双锐音符的小写拉丁字母u","Latin small letter u with macron":"带长音符的小写拉丁字母u","Latin small letter u with ogonek":"带反尾形符的小写拉丁字母u","Latin small letter u with ring above":"带上圆圈的小写拉丁字母u","Latin small letter u with tilde":"带腭化符的小写拉丁字母u","Latin small letter w with circumflex":"带扬抑符的小写拉丁字母w","Latin small letter y with circumflex":"带扬抑符的小写拉丁字母y","Latin small letter z with acute":"带锐音符的小写拉丁字母z","Latin small letter z with caron":"带抑扬符的小写拉丁字母z","Latin small letter z with dot above":"带上点的小写拉丁字母z","Latin small ligature ij":"小写拉丁连字符ij","Latin small ligature oe":"小写拉丁连字符oe","Left double quotation mark":"左双引号","Left single quotation mark":"左单引号","Left-pointing double angle quotation mark":"双左尖括号","leftwards arrow to bar":"头部带杠的向左箭头","leftwards dashed arrow":"向左虚线箭头","leftwards double arrow":"向左双箭头","Less-than or equal to":"小于等于","Less-than sign":"小于号","Lira sign":"里拉符号","Livre tournois sign":"里弗尔符号","Logical and":"逻辑与","Logical or":"逻辑或",Macron:"长音符号","Manat sign":"马纳特符号","Mill sign":"密尔符号","Minus sign":"负号","Multiplication sign":"称号","N-ary product":"N 元乘积","N-ary summation":"N 元求和",Nabla:"劈形算符","Naira sign":"奈拉符号","New sheqel sign":"新谢克尔符号","Nordic mark sign":"北欧马克征符号","Not an element of":"不属于","Not equal to":"不等于","Not sign":"非","on with exclamation mark with left right arrow above":"带有NO!标识的左右双向箭头",Overline:"上划线","Paragraph sign":"段落符号","Partial differential":"偏微分","Per mille sign":"千分号","Per ten thousand sign":"万分号","Peseta sign":"比塞塔符号","Peso sign":"比索符号","Plus-minus sign":"正负号","Pound sign":"英镑符号","Proportional to":"比例","Question exclamation mark":"疑问感叹号","Registered sign":"注册商标","Reversed paragraph sign":"反向段落符号","Right double quotation mark":"右双引号","Right single quotation mark":"右单引号","Right-pointing double angle quotation mark":"双右尖括号","rightwards arrow to bar":"头部带杠的向右箭头","rightwards dashed arrow":"向右虚线箭头","rightwards double arrow":"向右双箭头","Ruble sign":"俄罗斯卢布","Rupee sign":"卢比符号","Section sign":"节标记","Single left-pointing angle quotation mark":"单左尖括号","Single low-9 quotation mark":"低位后单引号","Single right-pointing angle quotation mark":"单右尖括号","soon with rightwards arrow above":"带有soon标识的向右箭头","Special characters":"特殊字符","Spesmilo sign":"斯佩斯米洛符号","Square root":"平方根","Tenge sign":"坚戈符号","There exists":"存在","Tilde operator":"波浪线运算符","top with upwards arrow above":"带有top标识的向上箭头","Trade mark sign":"商标符号","Tugrik sign":"图格里克符号","Turkish lira sign":"土耳其里拉符号","Two dot leader":"二点前导符",Union:"并集","up down arrow with base":"处于基线的上下箭头","upwards arrow to bar":"头部带杠的向上箭头","upwards dashed arrow":"向上虚线箭头","upwards double arrow":"向上双箭头","Vulgar fraction one half":"普通分数二分之一","Vulgar fraction one quarter":"普通分数四分之一","Vulgar fraction three quarters":"普通分数四分之三","Won sign":"韩元符号","Yen sign":"日元符号"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e["zh-cn"]=e["zh-cn"]||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"第 %0 步,共 %1 步",Aquamarine:"海蓝色",Black:"黑色",Blue:"蓝色",Cancel:"取消","Dim grey":"暗灰色","Dropdown toolbar":"下拉工具栏","Edit block":"编辑框","Editor toolbar":"编辑器工具栏",Green:"绿色",Grey:"灰色","Insert paragraph after block":"在后面插入段落","Insert paragraph before block":"在前面插入段落","Light blue":"浅蓝色","Light green":"浅绿色","Light grey":"浅灰色",Next:"下一步",Orange:"橙色",Previous:"上一步",Purple:"紫色",Red:"红色",Redo:"重做","Remove color":"移除颜色","Restore default":"恢复默认","Rich Text Editor":"富文本编辑器","Rich Text Editor, %0":"富文本编辑器, %0",Save:"保存","Select all":"全选","Show more items":"显示更多",Turquoise:"青色",Undo:"撤销","Upload in progress":"正在上传",White:"白色","Widget toolbar":"小部件工具栏",Yellow:"黄色"}),o.getPluralForm=function(e){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/translations/zh.js b/core/assets/vendor/ckeditor5/translations/zh.js
new file mode 100644
index 0000000000000000000000000000000000000000..d12f7f1673601cd12620b2d2d7917fed46aab1e7
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/translations/zh.js
@@ -0,0 +1 @@
+!function(n){const i=n.zh=n.zh||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"置中對齊","Align left":"靠左對齊","Align right":"靠右對齊",Justify:"左右對齊","Text alignment":"文字對齊","Text alignment toolbar":"文字對齊"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"粗體",Code:"代碼",Italic:"斜體",Strikethrough:"刪除線",Subscript:"下標",Superscript:"上標",Underline:"底線"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"段落引用"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.zh=n.zh||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"選取標題",Heading:"標題","Heading 1":"標題 1","Heading 2":"標題 2","Heading 3":"標題 3","Heading 4":"標題 4","Heading 5":"標題 5","Heading 6":"標題 6",Paragraph:"段落","Type or paste your content here.":"在此輸入或貼上你的內容。","Type your title":"輸入你的標題"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"水平線"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.zh=e.zh||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"置中圖片","Change image text alternative":"修改圖片的替代文字","Enter image caption":"輸入圖片說明","Full size image":"完整尺寸圖片","Image resize list":"圖片縮放清單","Image toolbar":"圖片工具","image widget":"圖片小工具","In line":"",Insert:"","Insert image":"插入圖片","Insert image via URL":"","Left aligned image":"向左對齊圖片",Original:"原始圖片","Resize image":"縮放圖片","Resize image to %0":"縮放圖片到 %0","Resize image to the original size":"縮放圖片到原始尺寸","Right aligned image":"向右對齊圖片","Side image":"側邊圖片","Text alternative":"替代文字",Update:"","Update image URL":"","Upload failed":"上傳失敗","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.zh=n.zh||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"減少縮排","Increase indent":"增加縮排"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.zh=n.zh||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"選擇語言",Language:"語言","Remove language":"移除語言"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.zh=n.zh||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"可下載","Edit link":"編輯連結",Link:"連結","Link image":"圖片連結","Link URL":"連結˙ URL","Open in a new tab":"在新視窗開啟","Open link in new tab":"在新視窗開啟連結","This link has no URL":"連結沒有URL",Unlink:"移除連結"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.zh=e.zh||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"符號清單","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"有序清單","Numbered list styles toolbar":"",Square:"","To-do List":"代辦清單","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{"Remove Format":"移除格式"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"原始碼"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.zh=e.zh||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"向下對齊","Align cell text to the center":"置中對齊","Align cell text to the left":"靠左對齊","Align cell text to the middle":"置中對齊","Align cell text to the right":"靠右對齊","Align cell text to the top":"向上對齊","Align table to the left":"靠左對齊","Align table to the right":"靠右對齊",Alignment:"對齊",Background:"背景顏色",Border:"邊框","Cell properties":"儲存格屬性","Center table":"置中對齊",Color:"文字顏色","Color picker":"顏色選擇",Column:"欄",Dashed:"虛線","Delete column":"刪除欄","Delete row":"刪除列",Dimensions:"尺寸",Dotted:"點線",Double:"雙線","Enter table caption":"",Groove:"內凹線","Header column":"標題欄","Header row":"標題列",Height:"高度","Horizontal text alignment toolbar":"水平對齊","Insert column left":"插入左方欄","Insert column right":"插入右方欄","Insert row above":"插入上方列","Insert row below":"插入下方列","Insert table":"插入表格",Inset:"內邊線","Justify cell text":"分散對齊","Merge cell down":"合併下方儲存格","Merge cell left":"合併左方儲存格","Merge cell right":"合併右方儲存格","Merge cell up":"合併上方儲存格","Merge cells":"合併儲存格",None:"無",Outset:"外框線",Padding:"儲存格留白",Ridge:"凸起線",Row:"列","Select column":"選擇欄","Select row":"選擇列",Solid:"實線","Split cell horizontally":"水平分割儲存格","Split cell vertically":"垂直分割儲存格",Style:"樣式","Table alignment toolbar":"表格對齊","Table cell text alignment":"儲存格文字對齊","Table properties":"表格屬性","Table toolbar":"表格工具",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'顏色代碼錯誤。試試看 "#FF0000" 或 "rgb(255, 0, 0)" 或 "red"。','The value is invalid. Try "10px" or "2em" or simply "2".':'尺寸代碼錯誤。試試看 "10px" 或 "2em" 或簡單寫 "2"。',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"垂直對齊",Width:"寬度"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const a=t.zh=t.zh||{};a.dictionary=Object.assign(a.dictionary||{},{"Almost equal to":"",Angle:"","Approximately equal to":"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"","Bitcoin sign":"","Cedi sign":"","Cent sign":"","Character categories":"","Colon sign":"","Contains as member":"","Copyright sign":"","Cruzeiro sign":"","Currency sign":"","Degree sign":"","Division sign":"","Dollar sign":"","Dong sign":"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"","downwards arrow to bar":"向下停止箭頭","downwards dashed arrow":"向下虛線箭頭","downwards double arrow":"向下雙箭頭","Drachma sign":"","Element of":"","Em dash":"","Empty set":"","En dash":"","end with leftwards arrow above":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","For all":"","Fraction slash":"","French franc sign":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"","Guarani sign":"","Horizontal ellipsis":"","Hryvnia sign":"","Identical to":"","Indian rupee sign":"",Infinity:"",Integral:"",Intersection:"","Inverted exclamation mark":"","Inverted question mark":"","Kip sign":"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin capital letter c with caron":"","Latin capital letter c with circumflex":"","Latin capital letter c with dot above":"","Latin capital letter d with caron":"","Latin capital letter d with stroke":"","Latin capital letter e with breve":"","Latin capital letter e with caron":"","Latin capital letter e with dot above":"","Latin capital letter e with macron":"","Latin capital letter e with ogonek":"","Latin capital letter eng":"","Latin capital letter g with breve":"","Latin capital letter g with cedilla":"","Latin capital letter g with circumflex":"","Latin capital letter g with dot above":"","Latin capital letter h with circumflex":"","Latin capital letter h with stroke":"","Latin capital letter i with breve":"","Latin capital letter i with dot above":"","Latin capital letter i with macron":"","Latin capital letter i with ogonek":"","Latin capital letter i with tilde":"","Latin capital letter j with circumflex":"","Latin capital letter k with cedilla":"","Latin capital letter l with acute":"","Latin capital letter l with caron":"","Latin capital letter l with cedilla":"","Latin capital letter l with middle dot":"","Latin capital letter l with stroke":"","Latin capital letter n with acute":"","Latin capital letter n with caron":"","Latin capital letter n with cedilla":"","Latin capital letter o with breve":"","Latin capital letter o with double acute":"","Latin capital letter o with macron":"","Latin capital letter r with acute":"","Latin capital letter r with caron":"","Latin capital letter r with cedilla":"","Latin capital letter s with acute":"","Latin capital letter s with caron":"","Latin capital letter s with cedilla":"","Latin capital letter s with circumflex":"","Latin capital letter t with caron":"","Latin capital letter t with cedilla":"","Latin capital letter t with stroke":"","Latin capital letter u with breve":"","Latin capital letter u with double acute":"","Latin capital letter u with macron":"","Latin capital letter u with ogonek":"","Latin capital letter u with ring above":"","Latin capital letter u with tilde":"","Latin capital letter w with circumflex":"","Latin capital letter y with circumflex":"","Latin capital letter y with diaeresis":"","Latin capital letter z with acute":"","Latin capital letter z with caron":"","Latin capital letter z with dot above":"","Latin capital ligature ij":"","Latin capital ligature oe":"","Latin small letter a with breve":"","Latin small letter a with macron":"","Latin small letter a with ogonek":"","Latin small letter c with acute":"","Latin small letter c with caron":"","Latin small letter c with circumflex":"","Latin small letter c with dot above":"","Latin small letter d with caron":"","Latin small letter d with stroke":"","Latin small letter dotless i":"","Latin small letter e with breve":"","Latin small letter e with caron":"","Latin small letter e with dot above":"","Latin small letter e with macron":"","Latin small letter e with ogonek":"","Latin small letter eng":"","Latin small letter f with hook":"","Latin small letter g with breve":"","Latin small letter g with cedilla":"","Latin small letter g with circumflex":"","Latin small letter g with dot above":"","Latin small letter h with circumflex":"","Latin small letter h with stroke":"","Latin small letter i with breve":"","Latin small letter i with macron":"","Latin small letter i with ogonek":"","Latin small letter i with tilde":"","Latin small letter j with circumflex":"","Latin small letter k with cedilla":"","Latin small letter kra":"","Latin small letter l with acute":"","Latin small letter l with caron":"","Latin small letter l with cedilla":"","Latin small letter l with middle dot":"","Latin small letter l with stroke":"","Latin small letter long s":"","Latin small letter n preceded by apostrophe":"","Latin small letter n with acute":"","Latin small letter n with caron":"","Latin small letter n with cedilla":"","Latin small letter o with breve":"","Latin small letter o with double acute":"","Latin small letter o with macron":"","Latin small letter r with acute":"","Latin small letter r with caron":"","Latin small letter r with cedilla":"","Latin small letter s with acute":"","Latin small letter s with caron":"","Latin small letter s with cedilla":"","Latin small letter s with circumflex":"","Latin small letter t with caron":"","Latin small letter t with cedilla":"","Latin small letter t with stroke":"","Latin small letter u with breve":"","Latin small letter u with double acute":"","Latin small letter u with macron":"","Latin small letter u with ogonek":"","Latin small letter u with ring above":"","Latin small letter u with tilde":"","Latin small letter w with circumflex":"","Latin small letter y with circumflex":"","Latin small letter z with acute":"","Latin small letter z with caron":"","Latin small letter z with dot above":"","Latin small ligature ij":"","Latin small ligature oe":"","Left double quotation mark":"","Left single quotation mark":"","Left-pointing double angle quotation mark":"","leftwards arrow to bar":"向左停止箭頭","leftwards dashed arrow":"向左虛線箭頭","leftwards double arrow":"向左雙箭頭","Less-than or equal to":"","Less-than sign":"","Lira sign":"","Livre tournois sign":"","Logical and":"","Logical or":"",Macron:"","Manat sign":"","Mill sign":"","Minus sign":"","Multiplication sign":"","N-ary product":"","N-ary summation":"",Nabla:"","Naira sign":"","New sheqel sign":"","Nordic mark sign":"","Not an element of":"","Not equal to":"","Not sign":"","on with exclamation mark with left right arrow above":"",Overline:"","Paragraph sign":"","Partial differential":"","Per mille sign":"","Per ten thousand sign":"","Peseta sign":"","Peso sign":"","Plus-minus sign":"","Pound sign":"","Proportional to":"","Question exclamation mark":"","Registered sign":"","Reversed paragraph sign":"","Right double quotation mark":"","Right single quotation mark":"","Right-pointing double angle quotation mark":"","rightwards arrow to bar":"向右停止箭頭","rightwards dashed arrow":"向右虛線箭頭","rightwards double arrow":"向右雙箭頭","Ruble sign":"","Rupee sign":"","Section sign":"","Single left-pointing angle quotation mark":"","Single low-9 quotation mark":"","Single right-pointing angle quotation mark":"","soon with rightwards arrow above":"","Special characters":"特殊字元","Spesmilo sign":"","Square root":"","Tenge sign":"","There exists":"","Tilde operator":"","top with upwards arrow above":"","Trade mark sign":"","Tugrik sign":"","Turkish lira sign":"","Two dot leader":"",Union:"","up down arrow with base":"","upwards arrow to bar":"向上停止箭頭","upwards dashed arrow":"向上虛線箭頭","upwards double arrow":"向上雙箭頭","Vulgar fraction one half":"","Vulgar fraction one quarter":"","Vulgar fraction three quarters":"","Won sign":"","Yen sign":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.zh=e.zh||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0/%1",Aquamarine:"淺綠色",Black:"黑色",Blue:"藍色",Cancel:"取消","Dim grey":"淡灰色","Dropdown toolbar":"下拉選單","Edit block":"編輯區塊","Editor toolbar":"編輯器工具",Green:"綠色",Grey:"灰色","Insert paragraph after block":"在這個區塊後面插入一個段落","Insert paragraph before block":"在這個區塊前面插入一個段落","Light blue":"亮藍色","Light green":"亮綠色","Light grey":"亮灰色",Next:"下一",Orange:"橘色",Previous:"上一",Purple:"紫色",Red:"紅色",Redo:"重做","Remove color":"移除顏色","Restore default":"","Rich Text Editor":"豐富文字編輯器","Rich Text Editor, %0":"豐富文字編輯器,%0",Save:"儲存","Select all":"選取全部","Show more items":"顯示更多",Turquoise:"藍綠色",Undo:"取消","Upload in progress":"正在上傳",White:"白色","Widget toolbar":"小工具",Yellow:"黃色"}),o.getPluralForm=function(e){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/composer.json b/core/composer.json
index 0121aca5c95a1db6bdd4239a29cc0cfe49bb719b..2566db7afb7112aa2344f3d59773d85eef2a9186 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -65,6 +65,7 @@
         "drupal/book": "self.version",
         "drupal/breakpoint": "self.version",
         "drupal/ckeditor": "self.version",
+        "drupal/ckeditor5": "self.version",
         "drupal/claro": "self.version",
         "drupal/classy": "self.version",
         "drupal/color": "self.version",
diff --git a/core/core.libraries.yml b/core/core.libraries.yml
index f4449213627edb678ff7dab02ac2ddc53aafccbd..826fa73e4d123df298ede889ce3235c56c87b7d0 100644
--- a/core/core.libraries.yml
+++ b/core/core.libraries.yml
@@ -22,6 +22,234 @@ ckeditor:
   js:
     assets/vendor/ckeditor/ckeditor.js: { preprocess: false, minified: true }
 
+ckeditor5:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/ckeditor5-dll.js: { preprocess: false, minified: true }
+
+ckeditor5.editorClassic:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/editor-classic.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.editorDecoupled:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/editor-decoupled.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+    - core/ckeditor5.htmlSupport
+
+ckeditor5.internal:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/essentials.js: { preprocess: false, minified: true }
+    assets/vendor/ckeditor5/heading.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.basic:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/basic-styles.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.specialCharacters:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/special-characters.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.blockquote:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/block-quote.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.image:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/image.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.link:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/link.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.list:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/list.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.horizontalLine:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/horizontal-line.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.htmlSupport:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/html-support.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.alignment:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/alignment.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.removeFormat:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/remove-format.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.pasteFromOffice:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/paste-from-office.js: { preprocess: false, minified: true }
+  dependencies:
+    - ckeditor5/ckeditor5
+
+ckeditor5.indent:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/indent.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.sourceEditing:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/source-editing.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.table:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/table.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.language:
+  remote: https://github.com/ckeditor/ckeditor5
+  version: "31.0.0"
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/v31.0.0/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/language.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
 css.escape:
   remote: https://github.com/mathiasbynens/CSS.escape
   version: "1.5.1"
diff --git a/core/modules/ckeditor5/ckeditor5.api.php b/core/modules/ckeditor5/ckeditor5.api.php
new file mode 100644
index 0000000000000000000000000000000000000000..dce79025ebf5ba7b8e7f9fc6c0e525236b1f3095
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.api.php
@@ -0,0 +1,235 @@
+<?php
+
+/**
+ * @file
+ * Documentation related to CKEditor 5.
+ */
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+
+/**
+ * @defgroup ckeditor5_architecture CKEditor 5 architecture
+ * @{
+ *
+ * @section overview Overview
+ * The CKEditor 5 module integrates CKEditor 5 with Drupal's filtering and text
+ * editor APIs.
+ *
+ * Where possible, it uses upstream CKEditor plugins, but it also relies on
+ * Drupal-specific CKEditor plugins to ensure a consistent user experience.
+ *
+ * @see https://ckeditor.com/ckeditor-5/
+ *
+ * @section data_models Data models
+ * Drupal and CKEditor 5 have very different data models.
+ *
+ * Drupal stores blobs of HTML that remains manageable thanks to the use of
+ * filters and granular HTML restrictions — crucially this remains manageable
+ * thanks to those restrictions but also because Drupal does not need to
+ * process, render, understand or otherwise interact with it.
+ *
+ * @see \Drupal\text\Plugin\Field\FieldType\TextItemBase
+ * @see \Drupal\filter\Plugin\Filter\FilterInterface::getHTMLRestrictions()
+ *
+ * On the other hand, CKEditor 5 must not only be able to render these
+ * blobs, but also allow editing and creating it. This requires a much deeper
+ * understanding of that HTML.
+ *
+ * CKEditor 5 (in contrast with CKEditor 4) therefore has its own data model to
+ * represent this information — that data model is explicitly not HTML.
+ *
+ * Therefore all interactions between Drupal and CKEditor 5 need to translate
+ * between these different data models.
+ *
+ * @see https://ckeditor.com/docs/ckeditor5/latest/framework/guides/architecture/editing-engine.html#element-types-and-custom-data
+ *
+ * @section plugins CKEditor 5 Plugins
+ * CKEditor 5 plugins may use either YAML or a PHP annotation for their
+ * definitions. A PHP class does not need an annotation if it is defined in yml.
+ *
+ * To be discovered, YAML definition files must be named
+ * {module_name}.ckeditor5.yml.
+ *
+ * @see ckeditor5.ckeditor5.yml for many examples of CKEditor 5 plugin
+ * configuration as YAML.
+ *
+ * The minimally required metadata: the CKEditor 5 plugins to load, the label
+ * and the HTML elements it can generate — here's an example for a module
+ * providing a Marquee plugin, both in yml and Annotation form:
+ *
+ * @code
+ * MODULE_NAME_marquee:
+ *   ckeditor5:
+ *     plugins: [PACKAGE.CLASS]
+ *   drupal:
+ *     label: Marquee
+ *     elements:
+ *     - <marquee>
+ * @endcode
+ *
+ * and
+ *
+ * @code
+ *  * @CKEditor5Plugin(
+ *  *   id = "MODULE_NAME_marquee",
+ *  *   ckeditor5 = @CKEditor5AspectsOfCKEditor5Plugin(
+ *  *     plugins = { "PACKAGE.CLASS" },
+ *  *   ),
+ *  *   drupal = @DrupalAspectsOfCKEditor5Plugin(
+ *  *     label = @Translation("Marquee"),
+ *  *     elements = { "<marquee>" },
+ *  *   )
+ *  * )
+ * @endcode
+ *
+ * The metadata relating strictly to the CKEditor 5 plugin's JS code is stored
+ * in the 'ckeditor5' key; all other metadata is stored in the 'drupal' key.
+ *
+ * If the plugin has a dependency on another module, adding the 'provider' key
+ * will prevent the plugin from being loaded if that module is not installed.
+ *
+ * All of these can be defined in YAML or annotations. A given plugin should
+ * choose one or the other, as a definition can't parse both at once.
+ *
+ * Overview of all available plugin definition properties:
+ *
+ * - provider: Allows a plugin to have a dependency on another module. If it has
+ *   a value, a module with a machine name matching that value must be installed
+ *   for the configured plugin to load.
+ * - ckeditor5.plugins: A list CKEditor 5 JavaScript plugins to load, as
+ *   '{package.Class}' , such as 'drupalMedia.DrupalMedia'.
+ * - ckeditor5.config: A keyed array of additional values for the constructor of
+ *   the CKEditor 5 JavaScript plugins being loaded. i.e. this becomes the
+ *   CKEditor 5 plugin configuration settings (see
+ *   https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/configuration.html)
+ *   for a given plugin.
+ * - drupal.label: Human-readable name of the CKEditor 5 plugin.
+ * - drupal.library: A Drupal asset library to load with the plugin.
+ * - drupal.admin_library: A Drupal asset library that will load in the text
+ *   format admin UI when the plugin is available.
+ * - drupal.class: Optional PHP class that makes it possible for the plugin to
+ *   provide dynamic values, or a configuration UI. The value should be
+ *   formatted as '\Drupal\{module_name}\Plugin\CKEditor5Plugin\{class_name}' to
+ *   make it discoverable.
+ * - drupal.elements: A list of elements and attributes the plugin allows use of
+ *   within CKEditor 5. This uses the same syntax as the 'filter_html' plugin
+ *   with an additional special keyword: '<$block>' . Using
+ *   '<$block [attribute(s)]>`  will permit the provided attributes in all block
+ *   level tags that are explicitly enabled in any plugin. i.e. if only '<p>',
+ *   '<h3>' and '<h2>' tags are allowed, then '<$block data-something>'  will
+ *   allow the 'data-something' attribute for '<p>', '<h3>' and '<h2>' tags.
+ * - drupal.toolbar_items: List of toolbar items the plugin provides. Keyed by a
+ *   machine name and the value being a pair defining the label:
+ *   @code
+ *   toolbar_items:
+ *     indent:
+ *       label: Indent
+ *     outdent:
+ *       label: Outdent
+ *   @encode
+ * - drupal.conditions: Conditions required for the plugin to load (other than
+ *   module dependencies, which are defined by the 'provider' property).
+ *   Conditions can check for three different things:
+ *   - 'toolbarItem': a toolbar item that must be enabled
+ *   - 'filter': a filter that must be enabled
+ *   - 'imageUploadStatus': TRUE if image upload must be enabled, FALSE if it
+ *      must not be enabled
+ *   - 'plugins': a list of CKEditor 5 Drupal plugin IDs that must be enabled
+ *
+ * All of these can be defined in YAML or annotations. A given plugin should
+ * choose one or the other, as a definition can't parse both at once.
+ *
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin
+ * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin
+ *
+ * @section upgrade_path Upgrade path
+ *
+ * Modules can provide upgrade paths similar to the built-in upgrade path for
+ * Drupal core's CKEditor 4 to CKEditor 5, by providing a CKEditor4To5Upgrade
+ * plugin. This plugin type allows:
+ * - mapping a CKEditor 4 button to an equivalent CKEditor 5 toolbar item
+ * - mapping CKEditor 4 plugin settings to equivalent CKEditor 5 plugin
+ *   configuration.
+ * The supported CKEditor 4 buttons and/or CKEditor 4 plugin settings must be
+ * specified in the annotation.
+ * See Drupal core's implementation for an example.
+ *
+ * @see \Drupal\ckeditor5\Annotation\CKEditor4To5Upgrade
+ * @see \Drupal\ckeditor5\Plugin\CKEditor4To5UpgradePluginInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditor4To5Upgrade\Core
+ *
+ * @section public_api Public API
+ *
+ * The CKEditor 5 module provides no public API, other than:
+ * - the annotations and interfaces mentioned above;
+ * - to help implement CKEditor 5 plugins:
+ *   \Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait and
+ *   \Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+ * - \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition, which is used to
+ *   interact with plugin definitions in hook_ckeditor5_plugin_info_alter();
+ * - to help contributed modules write tests:
+ *   \Drupal\Tests\ckeditor5\Kernel\CKEditor5ValidationTestTrait and
+ *   \Drupal\Tests\ckeditor5\Traits\CKEditor5TestTrait;
+ * - to help contributed modules write configuration schemas for configurable
+ *   plugins, the data types in config/schema/ckeditor5.data_types.yml are
+ *   likely to be useful. They automatically get validation constraints applied;
+ * - to help contributed modules write validation constraints for configurable
+ *   plugins, it is strongly recommended to subclass
+ *   \Drupal\Tests\ckeditor5\Kernel\ValidatorsTest. For very complex validation
+ *   constraints that need to access text editor and/or format, use
+ *   \Drupal\ckeditor5\Plugin\Validation\Constraint\TextEditorObjectDependentValidatorTrait.
+ *
+ * @}
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Modify the list of available CKEditor 5 plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules.
+ *
+ * @param array $plugin_definitions
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManager
+ */
+function hook_ckeditor5_plugin_info_alter(array &$plugin_definitions): void {
+  assert($plugin_definitions['ckeditor5_link'] instanceof CKEditor5PluginDefinition);
+  $link_plugin_definition = $plugin_definitions['ckeditor5_link']->toArray();
+  $link_plugin_definition['ckeditor5']['config']['link']['decorators'][] = [
+    'mode' => 'manual',
+    'label' => t('Open in new window'),
+    'attributes' => [
+      'target' => '_blank',
+    ],
+  ];
+  $plugin_definitions['ckeditor5_link'] = new CKEditor5PluginDefinition($link_plugin_definition);
+}
+
+/**
+ * Modify the list of available CKEditor 4 to 5 Upgrade plugins.
+ *
+ * This hook may be used to modify plugin properties after they have been
+ * specified by other modules. For example, to override a default upgrade path.
+ *
+ * @param array $plugin_definitions
+ *   An array of all the existing plugin definitions, passed by reference.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor4To5UpgradePluginManager
+ */
+function hook_ckeditor4to5upgrade_plugin_info_alter(array &$plugin_definitions): void {
+  // Remove core's upgrade path for the "Maximize" button (which is: there is no
+  // equivalent). This allows a different CKEditor4To5Upgrade plugin to define
+  // this upgrade path instead.
+  unset($plugin_definitions['core']['cke4_buttons']['Maximize']);
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/core/modules/ckeditor5/ckeditor5.ckeditor5.yml b/core/modules/ckeditor5/ckeditor5.ckeditor5.yml
new file mode 100644
index 0000000000000000000000000000000000000000..474322d1c6a6ca7e51fd3d52e46435202270a2f0
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.ckeditor5.yml
@@ -0,0 +1,510 @@
+# CKEditor 5 Drupal plugin definitions.
+# @see this module's README.md for details on defining CKEditor 5 plugins in
+# Drupal.
+
+ckeditor5_essentials:
+  ckeditor5:
+    plugins:
+      - drupalHtmlEngine.DrupalHtmlEngine
+      - essentials.Essentials
+  drupal:
+    label: Essentials
+    library: ckeditor5/drupal.ckeditor5.internal
+    admin_library: ckeditor5/admin.internal
+    toolbar_items:
+      undo:
+        label: Undo
+      redo:
+        label: Redo
+    elements:
+      - <br>
+    conditions: []
+
+ckeditor5_paragraph:
+  ckeditor5:
+    plugins: [paragraph.Paragraph]
+  drupal:
+    label: Paragraph
+    library: core/ckeditor5.internal
+    admin_library: ckeditor5/admin.internal
+    elements:
+      - <p>
+
+ckeditor5_heading:
+  ckeditor5:
+    plugins: [heading.Heading]
+    config:
+      heading:
+        # These are the options passed to the CKEditor heading constructor
+        # @see https://ckeditor.com/docs/ckeditor5/latest/api/module_heading_heading-HeadingConfig.html#member-options
+        #   for details on what each of these config properties do.
+        options:
+          - { model: 'paragraph', title: 'Paragraph', class: 'ck-heading_paragraph' }
+          - { model: 'heading1', view: 'h1', title: 'Heading 1', class: 'ck-heading_heading1' }
+          - { model: 'heading2', view: 'h2', title: 'Heading 2', class: 'ck-heading_heading2' }
+          - { model: 'heading3', view: 'h3', title: 'Heading 3', class: 'ck-heading_heading3' }
+          - { model: 'heading4', view: 'h4', title: 'Heading 4', class: 'ck-heading_heading4' }
+          - { model: 'heading5', view: 'h5', title: 'Heading 5', class: 'ck-heading_heading5' }
+          - { model: 'heading6', view: 'h6', title: 'Heading 6', class: 'ck-heading_heading6' }
+  drupal:
+    label: Headings
+    library: core/ckeditor5.internal
+    admin_library: ckeditor5/admin.heading
+    class: Drupal\ckeditor5\Plugin\CKEditor5Plugin\Heading
+    toolbar_items:
+      heading:
+        label: Heading
+    elements:
+      - <h1>
+      - <h2>
+      - <h3>
+      - <h4>
+      - <h5>
+      - <h6>
+
+ckeditor5_htmlSupport:
+  ckeditor5:
+    plugins: [htmlSupport.GeneralHtmlSupport]
+    config:
+      htmlSupport:
+        allow:
+          -
+            name:
+              regexp:
+                pattern: /.*/
+            attributes: true
+            classes: true
+            styles: true
+  drupal:
+    label: Arbitrary HTML support
+    elements: false
+    library: core/ckeditor5.htmlSupport
+    # @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface::getEnabledDefinitions()
+    conditions: []
+
+ckeditor5_specialCharacters:
+  ckeditor5:
+    plugins:
+      - specialCharacters.SpecialCharacters
+      - specialCharacters.SpecialCharactersEssentials
+  drupal:
+    label: Special characters
+    library: core/ckeditor5.specialCharacters
+    admin_library: ckeditor5/admin.specialCharacters
+    toolbar_items:
+      specialCharacters:
+        label: Special characters
+    elements: false
+
+ckeditor5_sourceEditing:
+  ckeditor5:
+    plugins:
+      - sourceEditing.SourceEditing
+      - htmlSupport.GeneralHtmlSupport
+  drupal:
+    label: Source editing
+    class: \Drupal\ckeditor5\Plugin\CKEditor5Plugin\SourceEditing
+    # This is the only CKEditor 5 plugin allowed to generate a superset of elements.
+    # @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\SourceEditing::getElementsSubset()
+    elements: ['<*>']
+    library: core/ckeditor5.sourceEditing
+    admin_library: ckeditor5/admin.sourceEditing
+    toolbar_items:
+      sourceEditing:
+        label: Source
+
+ckeditor5_bold:
+  ckeditor5:
+    plugins: [basicStyles.Bold]
+  drupal:
+    label: Bold
+    library: core/ckeditor5.basic
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      bold:
+        label: Bold
+    elements:
+      - <strong>
+
+ckeditor5_emphasis:
+  ckeditor5:
+    plugins:
+      - basicStyles.Italic
+      - drupalEmphasis.DrupalEmphasis
+  drupal:
+    label: Emphasis
+    library: ckeditor5/drupal.ckeditor5.emphasis
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      italic:
+        label: Italic
+    elements:
+      - <em>
+
+ckeditor5_underline:
+  ckeditor5:
+    plugins: [basicStyles.Underline]
+  drupal:
+    label: Underline
+    library: core/ckeditor5.basic
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      underline:
+        label: Underline
+    elements:
+      - <u>
+
+ckeditor5_code:
+  ckeditor5:
+    plugins: [basicStyles.Code]
+  drupal:
+    label: Code
+    library: core/ckeditor5.basic
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      code:
+        label: Code
+    elements:
+      - <code>
+
+ckeditor5_strikethrough:
+  ckeditor5:
+    plugins: [basicStyles.Strikethrough]
+  drupal:
+    label: Strikethrough
+    library: core/ckeditor5.basic
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      strikethrough:
+        label: Strikethrough
+    elements:
+      - <s>
+
+ckeditor5_subscript:
+  ckeditor5:
+    plugins: [basicStyles.Subscript]
+  drupal:
+    label: Subscript
+    library: core/ckeditor5.basic
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      subscript:
+        label: Subscript
+    elements:
+      - <sub>
+
+ckeditor5_superscript:
+  ckeditor5:
+    plugins: [basicStyles.Superscript]
+  drupal:
+    label: Superscript
+    library: core/ckeditor5.basic
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      superscript:
+        label: Superscript
+    elements:
+      - <sup>
+
+ckeditor5_blockquote:
+  ckeditor5:
+    plugins:
+      - blockQuote.BlockQuote
+  drupal:
+    label: Block quote
+    library: core/ckeditor5.blockquote
+    admin_library: ckeditor5/admin.blockquote
+    toolbar_items:
+      blockQuote:
+        label: Block quote
+    elements:
+      - <blockquote>
+
+ckeditor5_link:
+  ckeditor5:
+    plugins:
+      - link.Link
+  drupal:
+    label: Link
+    library: core/ckeditor5.link
+    admin_library: ckeditor5/admin.link
+    toolbar_items:
+      link:
+        label: Link
+    elements:
+      - <a href>
+
+ckeditor5_linkImage:
+  ckeditor5:
+    plugins:
+      - link.LinkImage
+    config:
+      # Append the "Link" button to the image balloon toolbar.
+      image:
+        toolbar:
+          - '|'
+          - linkImage
+  drupal:
+    label: Linked Image
+    elements: false
+    conditions:
+      plugins:
+        - ckeditor5_link
+        - ckeditor5_image
+
+ckeditor5_linkMedia:
+  ckeditor5:
+    plugins:
+      - drupalMedia.DrupalLinkMedia
+    config:
+      # Append the "Link" button to the media balloon toolbar.
+      drupalMedia:
+        toolbar: [drupalLinkMedia]
+  drupal:
+    label: Linked Media
+    elements: false
+    conditions:
+      plugins:
+        - ckeditor5_link
+        - media_media
+
+ckeditor5_list:
+  ckeditor5:
+    plugins: [list.List]
+  drupal:
+    label: List
+    library: core/ckeditor5.list
+    admin_library: ckeditor5/admin.list
+    toolbar_items:
+      bulletedList:
+        label: Bulleted list
+      numberedList:
+        label: Numbered list
+    elements:
+      - <ul>
+      - <ol>
+      - <li>
+
+ckeditor5_horizontalLine:
+  ckeditor5:
+    plugins: [horizontalLine.HorizontalLine]
+  drupal:
+    label: Horizontal line
+    library: core/ckeditor5.horizontalLine
+    admin_library: ckeditor5/admin.horizontalLine
+    toolbar_items:
+      horizontalLine:
+        label: Horizontal line
+    elements:
+      - <hr>
+
+ckeditor5_alignment:
+  ckeditor5:
+    plugins: [alignment.Alignment]
+    config:
+      # @see core/modules/system/css/components/align.module.css
+      alignment:
+        options:
+          - name: left
+            className: text-align-left
+          - name: center
+            className: text-align-center
+          - name: right
+            className: text-align-right
+          - name: justify
+            className: text-align-justify
+  drupal:
+    label: Alignment
+    library: core/ckeditor5.alignment
+    admin_library: ckeditor5/admin.alignment
+    toolbar_items:
+      alignment:
+        label: Text alignment
+      "alignment:left":
+        label: Align left
+      "alignment:center":
+        label: Align center
+      "alignment:right":
+        label: Align right
+      "alignment:justify":
+        label: justify
+    elements:
+      - <$block class="text-align-left text-align-center text-align-right text-align-justify">
+
+ckeditor5_removeFormat:
+  ckeditor5:
+    plugins: [removeFormat.RemoveFormat]
+  drupal:
+    label: Remove Format
+    library: core/ckeditor5.removeFormat
+    admin_library: ckeditor5/admin.removeFormat
+    toolbar_items:
+      removeFormat:
+        label: Remove Format
+    elements: false
+
+ckeditor5_pasteFromOffice:
+  ckeditor5:
+    plugins: [pasteFromOffice.PasteFromOffice]
+  drupal:
+    label: Paste From Office
+    library: core/ckeditor5.pasteFromOffice
+    elements: false
+    conditions: []
+
+ckeditor5_table:
+  ckeditor5:
+    plugins:
+      - table.Table
+      - table.TableToolbar
+    config:
+      table:
+        contentToolbar: [tableColumn, tableRow, mergeTableCells]
+  drupal:
+    label: Table
+    library: core/ckeditor5.table
+    admin_library: ckeditor5/admin.table
+    toolbar_items:
+      insertTable:
+        label: table
+    elements:
+      - <table>
+      - <tr>
+      - <td>
+      - <th>
+      - <thead>
+      - <tbody>
+      - <tfoot>
+
+ckeditor5_image:
+  ckeditor5:
+    plugins:
+      - image.Image
+      - image.ImageToolbar
+      - drupalImage.DrupalImage
+    config:
+      image:
+        toolbar: [imageTextAlternative]
+  drupal:
+    label: Image
+    library: ckeditor5/drupal.ckeditor5.image
+    elements:
+      - <img src alt data-entity-uuid data-entity-type height width>
+    conditions:
+      toolbarItem: uploadImage
+      imageUploadStatus: true
+
+ckeditor5_imageCaption:
+  ckeditor5:
+    plugins:
+      - image.ImageCaption
+    config:
+      image:
+        toolbar: [toggleImageCaption]
+  drupal:
+    label: Image caption
+    elements:
+      - <img data-caption>
+    conditions:
+      toolbarItem: uploadImage
+      imageUploadStatus: true
+      filter: filter_caption
+
+ckeditor5_imageAlign:
+  ckeditor5:
+    plugins:
+      - image.ImageStyle
+    config:
+      image:
+        toolbar:
+          - name: 'imageStyle:icons'
+            items:
+              - 'imageStyle:alignLeft'
+              - 'imageStyle:alignCenter'
+              - 'imageStyle:alignRight'
+            defaultItem: 'imageStyle:alignCenter'
+  drupal:
+    label: Image align
+    elements:
+      - <img data-align>
+    conditions:
+      toolbarItem: uploadImage
+      imageUploadStatus: true
+      filter: filter_align
+
+ckeditor5_indent:
+  ckeditor5:
+    plugins: [indent.Indent]
+  drupal:
+    label: Indent
+    elements: false
+    library: core/ckeditor5.indent
+    admin_library: ckeditor5/admin.indent
+    toolbar_items:
+      indent:
+        label: Indent
+      outdent:
+        label: Outdent
+
+ckeditor5_language:
+  ckeditor5:
+    plugins: [language.TextPartLanguage]
+  drupal:
+    label: Language
+    library: ckeditor5/ckeditor5.language
+    admin_library: ckeditor5/admin.language
+    class: Drupal\ckeditor5\Plugin\CKEditor5Plugin\Language
+    toolbar_items:
+      textPartLanguage:
+        label: Language
+    elements:
+      - <span lang dir>
+
+media_media:
+  provider: media
+  ckeditor5:
+    plugins:
+      - drupalMedia.DrupalMedia
+    config:
+      drupalMedia:
+        toolbar: [mediaImageTextAlternative]
+        themeError:
+          func:
+            name: Drupal.theme
+            args: [mediaEmbedPreviewError]
+            invoke: true
+  drupal:
+    label: Media
+    library: ckeditor5/drupal.ckeditor5.media
+    class: Drupal\ckeditor5\Plugin\CKEditor5Plugin\Media
+    elements:
+      - <drupal-media data-entity-type data-entity-uuid alt>
+    conditions:
+      filter: media_embed
+
+media_library_mediaLibrary:
+  provider: media_library
+  ckeditor5:
+    plugins: []
+    config:
+      drupalMedia:
+        openDialog:
+          func:
+            name: Drupal.ckeditor5.openDialog
+            invoke: false
+        dialogSettings:
+          height: 75%
+          dialogClass: media-library-widget-modal
+          title: Add or select media
+  drupal:
+    label: Media Library
+    elements: false
+    admin_library: ckeditor5/admin.drupalmedia
+    class: Drupal\ckeditor5\Plugin\CKEditor5Plugin\MediaLibrary
+    library: editor/drupal.editor.dialog
+    toolbar_items:
+        drupalMedia:
+          label: Drupal media
+    conditions:
+      filter: media_embed
+      toolbarItem: drupalMedia
diff --git a/core/modules/ckeditor5/ckeditor5.info.yml b/core/modules/ckeditor5/ckeditor5.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6d93d11a3fa0af0edb4dc9e7b2e37bc3da58900b
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.info.yml
@@ -0,0 +1,8 @@
+name: CKEditor 5
+type: module
+description: "WYSIWYG editing for rich text fields using CKEditor 5."
+version: VERSION
+package: Core (Experimental)
+lifecycle: experimental
+dependencies:
+  - drupal:editor
diff --git a/core/modules/ckeditor5/ckeditor5.libraries.yml b/core/modules/ckeditor5/ckeditor5.libraries.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a4f082c2c5ca946a949a5fc6eec63a84a08a3f9c
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.libraries.yml
@@ -0,0 +1,184 @@
+# cspell:ignore imageupload
+
+ckeditor5.language:
+  css:
+    component:
+      css/language.css: {}
+  dependencies:
+    - core/ckeditor5.language
+
+drupal.ckeditor5.internal:
+  js:
+    js/build/drupalHtmlEngine.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5.internal
+
+drupal.ckeditor5:
+  js:
+    js/ckeditor5.js: {}
+  css:
+    theme:
+      css/quickedit.css: { }
+  dependencies:
+    - core/jquery
+    - core/drupal
+    - core/drupal.debounce
+    - core/ckeditor5.editorClassic
+    - core/ckeditor5.editorDecoupled
+    - core/ckeditor5
+    - editor/drupal.editor
+    - ckeditor5/drupal.ckeditor5.quickedit-temporary-work-around
+
+drupal.ckeditor5.quickedit-temporary-work-around:
+  deprecated: "Temporary work-around until https://www.drupal.org/project/drupal/issues/3196689 lands."
+  css:
+    theme:
+      css/quickedit-override.css: {}
+
+drupal.ckeditor5.image:
+  js:
+    js/build/drupalImage.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5.image
+
+drupal.ckeditor5.emphasis:
+  version: VERSION
+  js:
+    js/build/drupalEmphasis.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5.basic
+
+drupal.ckeditor5.media:
+  js:
+    js/media_embed_ckeditor5.theme.js: {}
+    js/build/drupalMedia.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+    - core/drupal
+
+ie11.user.warnings:
+  js:
+    js/ie11.user.warnings.js: { }
+  css:
+    theme:
+      css/ie-warnings.css: { }
+  dependencies:
+    - core/drupal
+    - core/drupal.message
+    - editor/drupal.editor
+    - core/modernizr
+
+ie11.filter.warnings:
+  js:
+    js/ie11.filter.warnings.js: {}
+  dependencies:
+    - core/drupal
+    - core/drupal.message
+    - core/once
+    - core/modernizr
+
+drupal.ckeditor5.filter.admin:
+  js:
+    js/ckeditor5.filter.admin.js: {}
+  css:
+    theme:
+      css/filter.admin.css: { }
+  dependencies:
+    - core/drupal
+    - core/drupal.message
+    - core/once
+    - core/drupal.ajax
+
+admin:
+  js:
+    js/ckeditor5.admin.js: { }
+  css:
+    theme:
+      css/toolbar.admin.css: { }
+  dependencies:
+    - core/sortable
+    - filter/drupal.filter.admin
+    - core/jquery
+    - core/once
+
+admin.specialCharacters:
+  css:
+    theme:
+      css/special-characters.css: { }
+
+admin.removeFormat:
+  css:
+    theme:
+      css/remove-format.css: { }
+
+admin.internal:
+  css:
+    theme:
+      css/internal.admin.css: { }
+
+admin.basic:
+  css:
+    theme:
+      css/basic.admin.css: { }
+
+admin.blockquote:
+  css:
+    theme:
+      css/blockquote.admin.css: { }
+
+admin.link:
+  css:
+    theme:
+      css/link.admin.css: { }
+
+admin.list:
+  css:
+    theme:
+      css/list.admin.css: { }
+
+admin.heading:
+  css:
+    theme:
+      css/heading.admin.css: { }
+  dependencies:
+    - core/ckeditor5.internal
+
+admin.horizontalLine:
+  css:
+    theme:
+      css/horizontal-line.admin.css: { }
+
+admin.alignment:
+  css:
+    theme:
+      css/alignment.admin.css: { }
+
+admin.imageupload:
+  css:
+    theme:
+      css/imageupload.admin.css: { }
+
+admin.indent:
+  css:
+    theme:
+      css/indent.admin.css: { }
+
+admin.language:
+  css:
+    theme:
+      css/language.admin.css: { }
+
+admin.drupalmedia:
+  css:
+    theme:
+      css/drupalmedia.admin.css: { }
+
+admin.sourceEditing:
+  css:
+    theme:
+      css/source-editing.admin.css: { }
+
+admin.table:
+  css:
+    theme:
+      css/table.admin.css: { }
diff --git a/core/modules/ckeditor5/ckeditor5.module b/core/modules/ckeditor5/ckeditor5.module
new file mode 100644
index 0000000000000000000000000000000000000000..b6ccf9711ce9f77a56908cca060f76fb20a33957
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.module
@@ -0,0 +1,398 @@
+<?php
+
+/**
+ * @file
+ * Implements hooks for the CKEditor 5 module.
+ */
+
+declare(strict_types = 1);
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\Core\Ajax\AjaxResponse;
+use Drupal\Core\Ajax\InvokeCommand;
+use Drupal\Core\Ajax\MessageCommand;
+use Drupal\Core\Ajax\PrependCommand;
+use Drupal\Core\Ajax\ReplaceCommand;
+use Drupal\Core\Ajax\RemoveCommand;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Url;
+use Symfony\Component\Validator\Constraints\Choice;
+
+/**
+ * Implements hook_help().
+ */
+function ckeditor5_help($route_name, RouteMatchInterface $route_match) {
+  switch ($route_name) {
+    case 'help.page.ckeditor5':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The CKEditor 5 module provides a highly-accessible, highly-usable visual text editor and adds a toolbar to text fields. Users can use buttons to format content and to create semantically correct and valid HTML. The CKEditor module uses the framework provided by the <a href=":text_editor">Text Editor module</a>. It requires JavaScript to be enabled in the browser. For more information, see the <a href=":doc_url">online documentation for the CKEditor 5 module</a> and the <a href=":cke5_url">CKEditor 5 website</a>.', [':doc_url' => 'https://www.drupal.org/docs/contributed-modules/ckeditor-5', ':cke5_url' => 'https://ckeditor.com/ckeditor-5/', ':text_editor' => Url::fromRoute('help.page', ['name' => 'editor'])->toString()]) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Enabling CKEditor 5 for individual text formats') . '</dt>';
+      $output .= '<dd>' . t('CKEditor 5 has to be enabled and configured separately for individual text formats from the <a href=":formats">Text formats and editors page</a> because the filter settings for each text format can be different. For more information, see the <a href=":text_editor">Text Editor help page</a> and <a href=":filter">Filter help page</a>.', [':formats' => Url::fromRoute('filter.admin_overview')->toString(), ':text_editor' => Url::fromRoute('help.page', ['name' => 'editor'])->toString(), ':filter' => Url::fromRoute('help.page', ['name' => 'filter'])->toString()]) . '</dd>';
+      $output .= '<dt>' . t('Migration for existing text formats switching to CKEditor 5') . '</dt>';
+      $output .= '<dd>' . t('Text formats switching to CKEditor 5 from CKEditor 4 (or no text editor) should be able to do so with minimal effort and zero data loss. Existing configuration will be automatically migrated to CKEditor 5 compatible configuration. In instances where functionality can not be migrated, detailed messages are provided explaining what is necessary for feature parity.') . '</dd>';
+      $output .= '<dt>' . t('Configuring the toolbar') . '</dt>';
+      $output .= '<dd>' . t('When CKEditor 5 is chosen from the <em>Text editor</em> drop-down menu, its toolbar configuration is displayed. You can add and remove buttons from the <em>Active toolbar</em> by dragging and dropping them. Separators and rows can be added to organize the buttons.') . '</dd>';
+      $output .= '<dt>' . t('Filtering HTML content') . '</dt>';
+      $output .= '<dd>' . t("Unlike other text editors, plugin configuration determines the tags and attributes allowed in text formats using CKEditor 5. If using the <em>Limit allowed HTML tags and correct faulty HTML</em> filter, this filter's values will be automatically set based on enabled plugins and toolbar items.");
+      $output .= '<dt>' . t('Toggling between formatted text and HTML source') . '</dt>';
+      $output .= '<dd>' . t('If the <em>Source</em> button is available in the toolbar, users can click this button to disable the visual editor and edit the HTML source directly. After toggling back, the visual editor uses the HTML tags allowed via plugin configuration (and not explicity disallowed by filters) to format the text. Tags not enabled via plugin configuration will be be stripped out of the HTML source when the user toggles back to the text editor.') . '</dd>';
+      $output .= '<dt>' . t('Developing CKEditor 5 plugins in Drupal') . '</dt>';
+      $output .= '<dd>' . t('See the <a href=":dev_docs_url">online documentation</a> for detailed information on developing CKEditor 5 plugins for use in Drupal.', [':dev_docs_url' => 'https://www.drupal.org/docs/contributed-modules/ckeditor-5/plugin-and-contrib-module-development']) . '</dd>';
+      $output .= '</dd>';
+      $output .= '<dt>' . t('Accessibility features') . '</dt>';
+      $output .= '<dd>' . t('The built in WYSIWYG editor (CKEditor 5) comes with a number of accessibility features. CKEditor 5 comes with built in <a href=":shortcuts">keyboard shortcuts</a>, which can be beneficial for both power users and keyboard only users.', [':shortcuts' => 'https://ckeditor.com/docs/ckeditor5/latest/features/keyboard-support.html']) . '</dd>';
+      $output .= '<dt>' . t('Generating accessible content') . '</dt>';
+      $output .= '<dd>';
+      $output .= '<ul>';
+      // @todo Uncomment this in https://www.drupal.org/project/ckeditor5/issues/3230230
+      // $output .= '<li>' . t('HTML tables can be created with table headers and caption/summary elements.') . '</li>';
+      // @todo Uncomment this in https://www.drupal.org/project/ckeditor5/issues/3222757
+      // $output .= '<li>' . t('Alt text is required by default on images added through CKEditor (note that this can be overridden).') . '</li>';
+      $output .= '<li>' . t('Semantic HTML5 figure/figcaption are available to add captions to images.') . '</li>';
+      $output .= '<li>' . t('To support multilingual page content, CKEditor 5 can be configured to include a language button in the toolbar.') . '</li>';
+      $output .= '</ul>';
+      $output .= '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function ckeditor5_theme() {
+  return [
+    // The theme hook is used for rendering the CKEditor 5 toolbar settings in
+    // the Drupal admin UI. The toolbar settings UI is internal, and utilizing
+    // it outside of core usages is not supported because the UI can change at
+    // any point.
+    // @internal
+    'ckeditor5_settings_toolbar' => [
+      'render element' => 'form',
+    ],
+  ];
+}
+
+/**
+ * Implements hook_module_implements_alter().
+ */
+function ckeditor5_module_implements_alter(&$implementations, $hook) {
+  // This module's implementation of form_filter_format_form_alter() must happen
+  // after the editor module's implementation, as that implementation adds the
+  // active editor to $form_state. It must also happen after the media module's
+  // implementation so media_filter_format_edit_form_validate can be removed
+  // from the validation chain, as that validator is not needed with CKEditor 5
+  // and will trigger a false error.
+  if ($hook === 'form_alter' && isset($implementations['ckeditor5']) && isset($implementations['editor'])) {
+    $group = $implementations['ckeditor5'];
+    unset($implementations['ckeditor5']);
+
+    $offset = array_search('editor', array_keys($implementations)) + 1;
+    if (array_key_exists('media', $implementations)) {
+      $media_offset = array_search('media', array_keys($implementations)) + 1;
+      $offset = max([$offset, $media_offset]);
+    }
+    $implementations = array_slice($implementations, 0, $offset, TRUE) +
+      ['ckeditor5' => $group] +
+      array_slice($implementations, $offset, NULL, TRUE);
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function ckeditor5_form_filter_format_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
+  $editor = $form_state->get('editor');
+
+  // CKEditor 5 plugin config determines the available HTML tags. If an HTML
+  // restricting filter is enabled and the editor is CKEditor 5, the 'Allowed
+  // HTML tags' field is made read only and automatically populated with the
+  // values needed by CKEditor 5 plugins.
+  // @see \Drupal\ckeditor5\Plugin\Editor\CKEditor5::buildConfigurationForm()
+  if ($editor && $editor->getEditor() === 'ckeditor5') {
+    if (isset($form['filters']['settings']['filter_html']['allowed_html'])) {
+      $filter_allowed_html = &$form['filters']['settings']['filter_html']['allowed_html'];
+
+      if (isset($form['editor']['settings']['subform']['plugins']['ckeditor5_sourceEditing']['allowed_tags'])) {
+        $source_allowed_tags = &$form['editor']['settings']['subform']['plugins']['ckeditor5_sourceEditing']['allowed_tags'];
+        // @todo if this triggers the callback via keyboard navigation such as
+        //   tab, focus should move to the next element, not to the rebuilt
+        //   "allowed tags" field
+        //   https://www.drupal.org/project/ckeditor5/issues/3231321.
+        $source_allowed_tags['#ajax'] = [
+          'callback' => '_update_ckeditor5_html_filter',
+          'trigger_as' => ['name' => 'editor_configure'],
+          'event' => 'change',
+        ];
+      }
+
+      $filter_allowed_html['#value_callback'] = [CKEditor5::class, 'getGeneratedAllowedHtmlValue'];
+      // Set readonly and add the form-disabled wrapper class as using #disabled
+      // or the disabled attribute will prevent the new values from being
+      // validated.
+      $filter_allowed_html['#attributes']['readonly'] = TRUE;
+      $filter_allowed_html['#wrapper_attributes']['class'][] = 'form-disabled';
+
+      $filter_allowed_html['#description'] = t('With CKEditor 5 this is a
+          read-only field. The allowed HTML tags and attributes are determined
+          by the CKEditor 5 configuration. Manually removing tags would break
+          enabled functionality, and any manually added tags would be removed by
+          CKEditor 5 on render.');
+
+      // The media_filter_format_edit_form_validate validator is not needed
+      // with CKEditor 5 as it exists to enforce the inclusion of specific
+      // allowed tags that are added automatically by CKEditor 5. The
+      // validator is removed so it does not conflict with the automatic
+      // addition of those allowed tags.
+      $key = array_search('media_filter_format_edit_form_validate', $form['#validate']);
+      if ($key !== FALSE) {
+        unset($form['#validate'][$key]);
+      }
+    }
+  }
+
+  // Override the AJAX callbacks for changing editors, so multiple areas of the
+  // form can be updated on change.
+  $form['editor']['editor']['#ajax'] = [
+    'callback' => '_update_ckeditor5_html_filter',
+    'trigger_as' => ['name' => 'editor_configure'],
+  ];
+  $form['editor']['configure']['#ajax'] = [
+    'callback' => '_update_ckeditor5_html_filter',
+  ];
+
+  $form['editor']['settings']['subform']['toolbar']['items']['#ajax'] = [
+    'callback' => '_update_ckeditor5_html_filter',
+    'trigger_as' => ['name' => 'editor_configure'],
+    'event' => 'change',
+    'ckeditor5_only' => 'true',
+  ];
+
+  foreach (Element::children($form['filters']['status']) as $filter_type) {
+    $form['filters']['status'][$filter_type]['#ajax'] = [
+      'callback' => '_update_ckeditor5_html_filter',
+      'trigger_as' => ['name' => 'editor_configure'],
+      'event' => 'change',
+      'ckeditor5_only' => 'true',
+    ];
+  }
+
+  if (!function_exists('_add_ajax_listeners_to_plugin_inputs')) {
+
+    /**
+     * Recursively adds AJAX listeners to plugin settings elements.
+     *
+     * These are added so allowed tags and other fields that have values
+     * dependent on plugin settings can be updated via AJAX when these settings
+     * are changed in the editor form.
+     *
+     * @param array $plugins_config_form
+     *   The plugins config subform render array.
+     */
+    function _add_ajax_listeners_to_plugin_inputs(array &$plugins_config_form): void {
+      $field_types = [
+        'checkbox',
+        'select',
+        'radios',
+      ];
+      if (isset($plugins_config_form['#type']) && in_array($plugins_config_form['#type'], $field_types) && !isset($plugins_config_form['#ajax'])) {
+        $plugins_config_form['#ajax'] = [
+          'callback' => '_update_ckeditor5_html_filter',
+          'trigger_as' => ['name' => 'editor_configure'],
+          'event' => 'change',
+          'ckeditor5_only' => 'true',
+        ];
+      }
+
+      foreach ($plugins_config_form as $key => &$value) {
+        if (is_array($value) && strpos($key, '#') === FALSE) {
+          _add_ajax_listeners_to_plugin_inputs($value);
+        }
+      }
+    }
+
+  }
+
+  if (isset($form['editor']['settings']['subform']['plugins'])) {
+    _add_ajax_listeners_to_plugin_inputs($form['editor']['settings']['subform']['plugins']);
+  }
+
+  // Add an ID to the filter settings vertical tabs wrapper to facilitate AJAX
+  // updates.
+  $form['filter_settings']['#wrapper_attributes']['id'] = 'filter-settings-wrapper';
+
+  // Add an ID to the editor settings vertical tabs wrapper so it can be easily
+  // targeted by JavaScript.
+  // @todo consider moving this to editor.module when this module is moved to
+  //   Drupal core https://www.drupal.org/project/ckeditor5/issues/3231322.
+  $form['editor']['settings']['subform']['plugin_settings']['#wrapper_attributes']['id'] = 'plugin-settings-wrapper';
+
+  $form['#after_build'][] = [CKEditor5::class, 'assessActiveTextEditorAfterBuild'];
+  $form['#validate'][] = [CKEditor5::class, 'validateSwitchingToCKEditor5'];
+}
+
+/**
+ * AJAX callback handler for filter_format_form().
+ *
+ * Used instead of editor_form_filter_admin_form_ajax from the editor module.
+ */
+function _update_ckeditor5_html_filter(array $form, FormStateInterface $form_state) {
+  $response = new AjaxResponse();
+  $renderer = \Drupal::service('renderer');
+
+  // Replace the editor settings with the settings for the currently selected
+  // editor. This is the default behavior of editor.module. Except when using
+  // CKEditor 5: then we only want CKEditor 5's plugin settings to be updated:
+  // the client side-rendered admin UI would otherwise be dependent on network
+  // latency.
+  $renderedField = $renderer->render($form['editor']['settings']);
+  if ($form_state->get('ckeditor5_is_active') && $form_state->get('ckeditor5_is_selected')) {
+    $response->addCommand(new ReplaceCommand('#plugin-settings-wrapper', $form['editor']['settings']['subform']['plugin_settings']['#markup']));
+  }
+  else {
+    $response->addCommand(new ReplaceCommand('#editor-settings-wrapper', $renderedField));
+  }
+
+  if ($form_state->get('ckeditor5_is_active')) {
+    // Delete all existing validation messages, replace them with the current set.
+    $response->addCommand(new RemoveCommand('#ckeditor5-realtime-validation-messages-container > *'));
+    $messages = \Drupal::messenger()->deleteAll();
+    foreach ($messages as $type => $messages_by_type) {
+      foreach ($messages_by_type as $message) {
+        $response->addCommand(new MessageCommand($message, '#ckeditor5-realtime-validation-messages-container', ['type' => $type], FALSE));
+      }
+    }
+  }
+  else {
+    // If switching to CKEditor 5 triggers a validation error, the real-time
+    // validation messages container will not exist, because CKEditor 5's
+    // configuration form will not be rendered.
+    // In this case, render it into the (empty) editor settings wrapper. When
+    // the validation error is addressed, CKEditor 5's configuration form will
+    // get rendered and will overwrite those validation error messages.
+    $response->addCommand(new PrependCommand('#editor-settings-wrapper', ['#type' => 'status_messages']));
+  }
+
+  // Rebuild filter_settings form item when one of the following is true:
+  // - Switching to CKEditor 5 from another text editor, and the current
+  //   configuration triggers no fundamental compatibility errors.
+  // - Switching from CKEditor 5 to a different editor.
+  // - The editor is not being switched, and is currently CKEditor 5.
+  if ($form_state->get('ckeditor5_is_active') || ($form_state->get('ckeditor5_is_selected') && !$form_state->getError($form['editor']['editor']))) {
+    // Replace the filter settings with the settings for the currently selected
+    // editor.
+    $renderedSettings = $renderer->render($form['filter_settings']);
+    $response->addCommand(new ReplaceCommand('#filter-settings-wrapper', $renderedSettings));
+  }
+
+  // If switching to CKEditor 5 from another editor and there are errors in that
+  // switch, add an error class to the editor select, otherwise remove.
+  $response->addCommand(new InvokeCommand('[data-drupal-selector="edit-editor-editor"]', !$form_state->get('ckeditor5_is_active') && $form_state->get('ckeditor5_is_selected') && !empty($form_state->getErrors()) ? 'addClass' : 'removeClass', ['error']));
+
+  if (!function_exists('_add_attachments_to_editor_update_response')) {
+
+    /**
+     * Recursively find #attach items in the form and add as attachments to the
+     * AJAX response.
+     *
+     * @param array $form
+     *   A form array.
+     * @param \Drupal\Core\Ajax\AjaxResponse $response
+     *   The AJAX response attachments will be added to.
+     */
+    function _add_attachments_to_editor_update_response(array $form, AjaxResponse &$response): void {
+      foreach ($form as $key => $value) {
+        if ($key === "#attached") {
+          $response->addAttachments(array_diff_key($value, ['placeholders' => '']));
+        }
+        elseif (is_array($value) && strpos((string) $key, '#') === FALSE) {
+          _add_attachments_to_editor_update_response($value, $response);
+        }
+      }
+    }
+
+  }
+
+  _add_attachments_to_editor_update_response($form, $response);
+
+  return $response;
+}
+
+/**
+ * Implements hook_library_info_alter().
+ */
+function ckeditor5_library_info_alter(&$libraries, $extension) {
+  if ($extension === 'filter') {
+    $libraries['drupal.filter.admin']['dependencies'][] = 'ckeditor5/ie11.filter.warnings';
+    $libraries['drupal.filter.admin']['dependencies'][] = 'ckeditor5/drupal.ckeditor5.filter.admin';
+  }
+
+  // If the 'ckeditor5/ie11.user.warnings' library is added as a dependency of
+  // other Ckeditor 5 libraries, it won't reliably work as the CKEditor 5 assets
+  // are loaded via AJAX, and the IE11-incompatible syntax in CKEditor 5 can
+  // prevent the AJAX call from successfully loading the functionality in
+  // 'ckeditor5/ie11.user.warnings'. Adding this as a dependency of
+  // 'system/base', as excessive as it may seem, is the most reliable way to
+  // assure it is loaded as part of the page request.
+  if ($extension === 'system') {
+    $libraries['base']['dependencies'][] = 'ckeditor5/ie11.user.warnings';
+  }
+
+  if ($extension === 'core') {
+    // Generate libraries for each of the CKEditor 5 translation files so that
+    // the correct translation file can be attached depending on the current
+    // language.
+    $files = scandir('core/assets/vendor/ckeditor5/translations');
+    foreach ($files as $file) {
+      if ($file[0] !== '.' && preg_match('/\.js$/', $file)) {
+        $langcode = basename($file, '.js');
+        $libraries['ckeditor5.translations.' . $langcode] = [
+          'remote' => $libraries['ckeditor5']['remote'],
+          'version' => $libraries['ckeditor5']['version'],
+          'license' => $libraries['ckeditor5']['license'],
+          'js' => [
+            'assets/vendor/ckeditor5/translations/' . $file => ['preprocess' => FALSE, 'minified' => TRUE],
+          ],
+        ];
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_validation_constraint_alter().
+ */
+function ckeditor5_validation_constraint_alter(array &$definitions) {
+  // Add the Symfony validation constraints that Drupal core does not add in
+  // \Drupal\Core\Validation\ConstraintManager::registerDefinitions() for
+  // unknown reasons. Do it defensively, to not break when this changes.
+  if (!isset($definitions['Choice'])) {
+    $definitions['Choice'] = [
+      'label' => 'Choice',
+      'class' => Choice::class,
+      'type' => FALSE,
+      'provider' => 'core',
+      'id' => 'Choice',
+    ];
+  }
+}
+
+/**
+ * Implements hook_config_schema_info_alter().
+ */
+function ckeditor5_config_schema_info_alter(&$definitions) {
+  // In \Drupal\Tests\config\Functional\ConfigImportAllTest, this hook may be
+  // called without ckeditor5.pair.schema.yml being active.
+  if (!isset($definitions['ckeditor5_valid_pair__format_and_editor'])) {
+    return;
+  }
+  // @see filter.format.*.filters
+  $definitions['ckeditor5_valid_pair__format_and_editor']['mapping']['filters'] = $definitions['filter.format.*']['mapping']['filters'];
+  // @see @see editor.editor.*.image_upload
+  $definitions['ckeditor5_valid_pair__format_and_editor']['mapping']['image_upload'] = $definitions['editor.editor.*']['mapping']['image_upload'];
+}
diff --git a/core/modules/ckeditor5/ckeditor5.routing.yml b/core/modules/ckeditor5/ckeditor5.routing.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9efcc338f707422d9601b4d0b2a419f2760e24b4
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.routing.yml
@@ -0,0 +1,27 @@
+ckeditor5.upload_image:
+  path: '/ckeditor5/upload-image/{editor}'
+  defaults:
+    _controller: '\Drupal\ckeditor5\Controller\CKEditor5ImageController::upload'
+  methods: [POST]
+  requirements:
+    _entity_access: 'editor.use'
+    _custom_access: '\Drupal\ckeditor5\Controller\CKEditor5ImageController::imageUploadEnabledAccess'
+    _csrf_token: 'TRUE'
+  options:
+    parameters:
+      editor:
+        type: entity:editor
+
+ckeditor5.media_image:
+  path: '/ckeditor5/{editor}/is-media-image'
+  defaults:
+    _controller: '\Drupal\ckeditor5\Controller\CKEditor5MediaController::isMediaImage'
+  methods: [GET]
+  requirements:
+    _entity_access: 'editor.use'
+    _custom_access: '\Drupal\ckeditor5\Controller\CKEditor5MediaController::access'
+    _csrf_token: 'TRUE'
+  options:
+    parameters:
+      editor:
+        type: entity:editor
diff --git a/core/modules/ckeditor5/ckeditor5.services.yml b/core/modules/ckeditor5/ckeditor5.services.yml
new file mode 100644
index 0000000000000000000000000000000000000000..033840825af5fac404bb9fda0f152233b71f928f
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.services.yml
@@ -0,0 +1,15 @@
+services:
+  plugin.manager.ckeditor5.plugin:
+    class: Drupal\ckeditor5\Plugin\CKEditor5PluginManager
+    parent: default_plugin_manager
+  # @todo Remove in Drupal 11: https://www.drupal.org/project/ckeditor5/issues/3239012
+  plugin.manager.ckeditor4to5upgrade.plugin:
+    public: false
+    class: Drupal\ckeditor5\Plugin\CKEditor4To5UpgradePluginManager
+    parent: default_plugin_manager
+  ckeditor5.smart_default_settings:
+    class: Drupal\ckeditor5\SmartDefaultSettings
+    arguments:
+      - '@plugin.manager.ckeditor5.plugin'
+      - '@plugin.manager.ckeditor4to5upgrade.plugin'
+      - '@?plugin.manager.ckeditor.plugin'
diff --git a/core/modules/ckeditor5/config/schema/ckeditor5.data_types.yml b/core/modules/ckeditor5/config/schema/ckeditor5.data_types.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9ee32d4a17a413e6da404b8678d970a7647a6e3f
--- /dev/null
+++ b/core/modules/ckeditor5/config/schema/ckeditor5.data_types.yml
@@ -0,0 +1,12 @@
+# @see https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/toolbar.html
+ckeditor5.toolbar_item:
+  type: string
+  label: 'Toolbar item'
+  constraints:
+    CKEditor5ToolbarItem: []
+
+ckeditor5.element:
+  type: string
+  label: 'Element'
+  constraints:
+    CKEditor5Element: []
diff --git a/core/modules/ckeditor5/config/schema/ckeditor5.pair.schema.yml b/core/modules/ckeditor5/config/schema/ckeditor5.pair.schema.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8bf146455cd24b0b1d09b583b3ae555e758f35ce
--- /dev/null
+++ b/core/modules/ckeditor5/config/schema/ckeditor5.pair.schema.yml
@@ -0,0 +1,15 @@
+# @see ckeditor5_config_schema_info_alter()
+ckeditor5_valid_pair__format_and_editor:
+  type: mapping
+  label: 'Text Format plus Text Editor pair using CKEditor 5'
+  constraints:
+    CKEditor5FundamentalCompatibility: []
+  mapping:
+    settings:
+      type: editor.settings.ckeditor5
+    # @see ckeditor5_config_schema_info_alter()
+    # @see filter.format.*.filters
+    filters: {}
+    # @see ckeditor5_config_schema_info_alter()
+    # @see editor.editor.*.image_upload
+    image_upload: {}
diff --git a/core/modules/ckeditor5/config/schema/ckeditor5.schema.yml b/core/modules/ckeditor5/config/schema/ckeditor5.schema.yml
new file mode 100644
index 0000000000000000000000000000000000000000..29171f9e36d9d4037ce4f8f98a53db49a727b8ff
--- /dev/null
+++ b/core/modules/ckeditor5/config/schema/ckeditor5.schema.yml
@@ -0,0 +1,76 @@
+# Schema for the configuration files of the CKEditor5 module.
+
+editor.settings.ckeditor5:
+  type: mapping
+  label: 'CKEditor 5 settings'
+  mapping:
+    toolbar:
+      type: mapping
+      label: 'Toolbar configuration'
+      mapping:
+        items:
+          type: sequence
+          label: 'Items'
+          sequence:
+            type: ckeditor5.toolbar_item
+            label: 'Button'
+            constraints:
+              # Each active CKEditor 5 toolbar item whose plugin has conditions must have those conditions met.
+              CKEditor5ToolbarItemConditionsMet: []
+    plugins:
+      type: sequence
+      label: 'Plugins'
+      sequence:
+        type: ckeditor5.plugin.[%key]
+  constraints:
+    # Each enabled CKEditor 5 plugin that implements \Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface
+    # must exist in here.
+    CKEditor5EnabledConfigurablePlugins: []
+
+# Plugin \Drupal\ckeditor5\Plugin\CKEditor5Plugin\Language
+ckeditor5.plugin.ckeditor5_language:
+  type: mapping
+  label: 'Language'
+  mapping:
+    language_list:
+      type: string
+      label: 'Language list ID'
+      constraints:
+        # Configuring this does not make sense without the corresponding button.
+        CKEditor5ToolbarItemDependencyConstraint:
+          toolbarItem: textPartLanguage
+        # Only two possible values are accepted.
+        Choice:
+          - un
+          - all
+
+# Plugin \Drupal\ckeditor5\Plugin\CKEditor5Plugin\Heading
+ckeditor5.plugin.ckeditor5_heading:
+  type: mapping
+  label: Headings
+  mapping:
+    enabled_headings:
+      type: sequence
+      label: 'Enabled Headings'
+      constraints:
+        NotBlank:
+          message: "Enable at least one heading, otherwise disable the Heading plugin."
+      sequence:
+        type: string
+        label: 'Heading type'
+        constraints:
+          Choice:
+            callback: \Drupal\ckeditor5\Plugin\CKEditor5Plugin\Heading::validChoices
+
+ckeditor5.plugin.ckeditor5_sourceEditing:
+  type: mapping
+  label: Source Editing
+  mapping:
+    allowed_tags:
+      type: sequence
+      label: 'Allowed Tags'
+      sequence:
+        type: ckeditor5.element
+        label: 'Allowed Tag'
+        constraints:
+          SourceEditingRedundantTags: []
diff --git a/core/modules/ckeditor5/css/alignment.admin.css b/core/modules/ckeditor5/css/alignment.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..2830a9d55656594a2079b6fc9858f08800da7028
--- /dev/null
+++ b/core/modules/ckeditor5/css/alignment.admin.css
@@ -0,0 +1,45 @@
+.ckeditor5-toolbar-button-alignment\:left {
+  background-image: url(../icons/align-left.svg);
+}
+.ckeditor5-toolbar-button-alignment\:right {
+  background-image: url(../icons/align-right.svg);
+}
+.ckeditor5-toolbar-button-alignment\:center {
+  background-image: url(../icons/align-center.svg);
+}
+.ckeditor5-toolbar-button-alignment\:justify {
+  background-image: url(../icons/align-justify.svg);
+}
+.ckeditor5-toolbar-button-alignment {
+  background-image: url(../icons/align-left.svg);
+}
+
+.ckeditor5-toolbar-button-alignment {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  padding-right: 20px;
+  background-position-x: 10px;
+}
+[dir="rtl"] .ckeditor5-toolbar-button-alignment {
+  padding-right: 0;
+  padding-left: 20px;
+  background-position-x: 30px;
+}
+.ckeditor5-toolbar-button-alignment::after {
+  position: relative;
+  right: -10px;
+  display: inline-block;
+  width: 7px;
+  height: 7px;
+  content: "";
+  transform: rotate(135deg);
+  color: #000;
+  border-width: 2px 2px 0 0;
+  border-style: solid;
+  background-position-x: -10px;
+}
+[dir="rtl"] .ckeditor5-toolbar-button-alignment::after {
+  right: 10px;
+  background-position-x: 10px;
+}
diff --git a/core/modules/ckeditor5/css/basic.admin.css b/core/modules/ckeditor5/css/basic.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..8db1109e328cbd5ef91f6e35d227bcea4b1e580e
--- /dev/null
+++ b/core/modules/ckeditor5/css/basic.admin.css
@@ -0,0 +1,27 @@
+.ckeditor5-toolbar-button-bold {
+  background-image: url(../icons/bold.svg);
+}
+
+.ckeditor5-toolbar-button-italic {
+  background-image: url(../icons/italic.svg);
+}
+
+.ckeditor5-toolbar-button-underline {
+  background-image: url(../icons/underline.svg);
+}
+
+.ckeditor5-toolbar-button-code {
+  background-image: url(../icons/code.svg);
+}
+
+.ckeditor5-toolbar-button-strikethrough {
+  background-image: url(../icons/strikethrough.svg);
+}
+
+.ckeditor5-toolbar-button-subscript {
+  background-image: url(../icons/subscript.svg);
+}
+
+.ckeditor5-toolbar-button-superscript {
+  background-image: url(../icons/superscript.svg);
+}
diff --git a/core/modules/ckeditor5/css/blockquote.admin.css b/core/modules/ckeditor5/css/blockquote.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..7f6ac95c7708d00f8b8e80de981b8f55622132ed
--- /dev/null
+++ b/core/modules/ckeditor5/css/blockquote.admin.css
@@ -0,0 +1,3 @@
+.ckeditor5-toolbar-button-blockQuote {
+  background-image: url(../icons/blockquote.svg);
+}
diff --git a/core/modules/ckeditor5/css/drupalmedia.admin.css b/core/modules/ckeditor5/css/drupalmedia.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..7a381a053dc83741458d55816c31bd74e298cf66
--- /dev/null
+++ b/core/modules/ckeditor5/css/drupalmedia.admin.css
@@ -0,0 +1,4 @@
+/* cspell:ignore medialibrary */
+.ckeditor5-toolbar-button-drupalMedia {
+  background-image: url(../icons/medialibrary.svg);
+}
diff --git a/core/modules/ckeditor5/css/filter.admin.css b/core/modules/ckeditor5/css/filter.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..dc9c54cbb3bf3617994ffe6d97724d20eeb0a56b
--- /dev/null
+++ b/core/modules/ckeditor5/css/filter.admin.css
@@ -0,0 +1,4 @@
+.ckeditor5-filter-attention {
+  padding: 4px;
+  outline: 1px red dashed;
+}
diff --git a/core/modules/ckeditor5/css/heading.admin.css b/core/modules/ckeditor5/css/heading.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..d16d435a4a2d2d0e4f78738f7a60340262f4c133
--- /dev/null
+++ b/core/modules/ckeditor5/css/heading.admin.css
@@ -0,0 +1,23 @@
+/**
+ * @file
+ * Styles for header options in the admin UI.
+ *
+ * These styles are copied from CKEditor 5's editor styles, which load when an
+ * editor is present, but are not guaranteed to load in the admin UI.
+ */
+
+.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: bold;
+}
diff --git a/core/modules/ckeditor5/css/horizontal-line.admin.css b/core/modules/ckeditor5/css/horizontal-line.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..383eb2a10d5b3880f0954b97684e6f96caca5f97
--- /dev/null
+++ b/core/modules/ckeditor5/css/horizontal-line.admin.css
@@ -0,0 +1,4 @@
+/* cspell:ignore horizontalline */
+.ckeditor5-toolbar-button-horizontalLine {
+  background-image: url(../icons/horizontalline.svg);
+}
diff --git a/core/modules/ckeditor5/css/ie-warnings.css b/core/modules/ckeditor5/css/ie-warnings.css
new file mode 100644
index 0000000000000000000000000000000000000000..dcdcc362e3e7f3bec4169f35eeabefbf1d60bc71
--- /dev/null
+++ b/core/modules/ckeditor5/css/ie-warnings.css
@@ -0,0 +1,17 @@
+.quickedit-field.quickedit-highlighted.ck5-ie11,
+.quickedit-form.quickedit-highlighted.ck5-ie11,
+.quickedit-field .quickedit-highlighted.ck5-ie11 {
+  cursor: default;
+  box-shadow: 0 0 0 1px #f00, 0 0 0 2px #f00;
+}
+
+.quickedit .icon.ck5-ie11 {
+  margin-left: 0.5em;
+  padding-left: 1.5em;
+}
+
+.quickedit .icon.ck5-ie11:before {
+  background-image: url(../../../misc/icons/e32700/error.svg);
+  background-position: left center;
+  background-size: 1.3em;
+}
diff --git a/core/modules/ckeditor5/css/imageupload.admin.css b/core/modules/ckeditor5/css/imageupload.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..5d4f9549b0fd3a48d43a3332857fb4013812876a
--- /dev/null
+++ b/core/modules/ckeditor5/css/imageupload.admin.css
@@ -0,0 +1,4 @@
+/* cspell:ignore imageupload */
+.ckeditor5-toolbar-button-uploadImage {
+  background-image: url(../icons/imageupload.svg);
+}
diff --git a/core/modules/ckeditor5/css/indent.admin.css b/core/modules/ckeditor5/css/indent.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..1d6f8f04221ee26d79ea2ede79467a083c210063
--- /dev/null
+++ b/core/modules/ckeditor5/css/indent.admin.css
@@ -0,0 +1,7 @@
+.ckeditor5-toolbar-button-indent {
+  background-image: url(../icons/indent.svg);
+}
+
+.ckeditor5-toolbar-button-outdent {
+  background-image: url(../icons/outdent.svg);
+}
diff --git a/core/modules/ckeditor5/css/internal.admin.css b/core/modules/ckeditor5/css/internal.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..62a5ac434b9d3a019d288f078e79ef842662f0f3
--- /dev/null
+++ b/core/modules/ckeditor5/css/internal.admin.css
@@ -0,0 +1,45 @@
+.ckeditor5-toolbar-button-divider {
+  background-image: url(../icons/divider.svg);
+}
+.ckeditor5-toolbar-button-wrapping {
+  background-image: url(../icons/separator.svg);
+}
+
+.ckeditor5-toolbar-button-undo {
+  background-image: url(../icons/undo.svg);
+}
+
+.ckeditor5-toolbar-button-redo {
+  background-image: url(../icons/redo.svg);
+}
+
+.ckeditor5-toolbar-button-heading {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  width: 100px;
+  color: #000;
+}
+.ckeditor5-toolbar-button-heading::before {
+  margin-left: 10px;
+  content: "Heading";
+  font-size: 14px;
+}
+[dir="rtl"] .ckeditor5-toolbar-button-heading::before {
+  margin-right: 10px;
+  margin-left: 0;
+}
+.ckeditor5-toolbar-button-heading::after {
+  display: inline-block;
+  width: 7px;
+  height: 7px;
+  margin-right: 10px;
+  content: "";
+  transform: rotate(135deg);
+  border-width: 2px 2px 0 0;
+  border-style: solid;
+}
+[dir="rtl"] .ckeditor5-toolbar-button-heading::after {
+  margin-right: 0;
+  margin-left: 10px;
+}
diff --git a/core/modules/ckeditor5/css/language.admin.css b/core/modules/ckeditor5/css/language.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..42ebab47e99b3411a2b94070543587d03f3a4978
--- /dev/null
+++ b/core/modules/ckeditor5/css/language.admin.css
@@ -0,0 +1,30 @@
+.ckeditor5-toolbar-button-textPartLanguage {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  width: 110px;
+  color: #000;
+}
+.ckeditor5-toolbar-button-textPartLanguage::before {
+  margin-left: 10px;
+  content: "Language";
+  font-size: 14px;
+}
+[dir="rtl"] .ckeditor5-toolbar-button-textPartLanguage::before {
+  margin-right: 10px;
+  margin-left: 0;
+}
+.ckeditor5-toolbar-button-textPartLanguage::after {
+  display: inline-block;
+  width: 7px;
+  height: 7px;
+  margin-right: 10px;
+  content: "";
+  transform: rotate(135deg);
+  border-width: 2px 2px 0 0;
+  border-style: solid;
+}
+[dir="rtl"] .ckeditor5-toolbar-button-textPartLanguage::after {
+  margin-right: 0;
+  margin-left: 10px;
+}
diff --git a/core/modules/ckeditor5/css/language.css b/core/modules/ckeditor5/css/language.css
new file mode 100644
index 0000000000000000000000000000000000000000..b13e52150e2389cc5077f96644fe09da8112ff01
--- /dev/null
+++ b/core/modules/ckeditor5/css/language.css
@@ -0,0 +1,19 @@
+/**
+ * @file
+ * Language: add styling for elements that have a language attribute.
+ */
+
+/**
+ * Show the user that a 'lang' tag has been applied by adding a thin dotted
+ * border. We also append the value of the tag between brackets, for example:
+ * '(en)'. Since the html element has a 'lang' attribute too we only target
+ * elements within the html scope.
+ */
+.ck-content [lang] {
+  outline: 1px dotted gray;
+}
+.ck-content [lang]:after {
+  content: " ("attr(lang)")";
+  color: #666;
+  font-size: 10px;
+}
diff --git a/core/modules/ckeditor5/css/link.admin.css b/core/modules/ckeditor5/css/link.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..e6e2ccdb1138b3ab0e74ebfe22483d0cf248b1c9
--- /dev/null
+++ b/core/modules/ckeditor5/css/link.admin.css
@@ -0,0 +1,3 @@
+.ckeditor5-toolbar-button-link {
+  background-image: url(../icons/link.svg);
+}
diff --git a/core/modules/ckeditor5/css/list.admin.css b/core/modules/ckeditor5/css/list.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..7c37fa0cf05b5f95c2dc5b23c99f54d1c8f95f04
--- /dev/null
+++ b/core/modules/ckeditor5/css/list.admin.css
@@ -0,0 +1,8 @@
+/* cspell:ignore bulletedlist numberedlist */
+.ckeditor5-toolbar-button-bulletedList {
+  background-image: url(../icons/bulletedlist.svg);
+}
+
+.ckeditor5-toolbar-button-numberedList {
+  background-image: url(../icons/numberedlist.svg);
+}
diff --git a/core/modules/ckeditor5/css/quickedit-override.css b/core/modules/ckeditor5/css/quickedit-override.css
new file mode 100644
index 0000000000000000000000000000000000000000..e64eb0d03cf14d1f076da38d2ec8cf26e163aaa6
--- /dev/null
+++ b/core/modules/ckeditor5/css/quickedit-override.css
@@ -0,0 +1,9 @@
+.quickedit-editable,
+.quickedit-editing.ck.ck-editor__editable_inline {
+  top: inherit !important;
+  left: inherit !important;
+  margin-bottom: inherit !important;
+}
+.quickedit-editing.ck.ck-editor__editable_inline > :first-child {
+  margin-top: inherit;
+}
diff --git a/core/modules/ckeditor5/css/quickedit.css b/core/modules/ckeditor5/css/quickedit.css
new file mode 100644
index 0000000000000000000000000000000000000000..297adfc497be8302d7ae159e1ea162fcc2ad3069
--- /dev/null
+++ b/core/modules/ckeditor5/css/quickedit.css
@@ -0,0 +1,4 @@
+.quickedit-toolgroup.wysiwyg-main .ck.ck-toolbar {
+  border: none;
+  background: none;
+}
diff --git a/core/modules/ckeditor5/css/remove-format.css b/core/modules/ckeditor5/css/remove-format.css
new file mode 100644
index 0000000000000000000000000000000000000000..4796738743dd690062b5e40df282607f7fed0677
--- /dev/null
+++ b/core/modules/ckeditor5/css/remove-format.css
@@ -0,0 +1,3 @@
+.ckeditor5-toolbar-button-removeFormat {
+  background-image: url(../icons/remove-format.svg);
+}
diff --git a/core/modules/ckeditor5/css/source-editing.admin.css b/core/modules/ckeditor5/css/source-editing.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..3f23cc3f3d1cf4aed0531acc94432a85c0ac3390
--- /dev/null
+++ b/core/modules/ckeditor5/css/source-editing.admin.css
@@ -0,0 +1,3 @@
+.ckeditor5-toolbar-button-sourceEditing {
+  background-image: url(../icons/source-editing.svg);
+}
diff --git a/core/modules/ckeditor5/css/special-characters.css b/core/modules/ckeditor5/css/special-characters.css
new file mode 100644
index 0000000000000000000000000000000000000000..8f726e11a8efd386d718201db11a3f9ebc617820
--- /dev/null
+++ b/core/modules/ckeditor5/css/special-characters.css
@@ -0,0 +1,3 @@
+.ckeditor5-toolbar-button-specialCharacters {
+  background-image: url(../icons/special-characters.svg);
+}
diff --git a/core/modules/ckeditor5/css/table.admin.css b/core/modules/ckeditor5/css/table.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..807e961faa2b4e599dbd2c25fe91f4a8cf2e7758
--- /dev/null
+++ b/core/modules/ckeditor5/css/table.admin.css
@@ -0,0 +1,3 @@
+.ckeditor5-toolbar-button-insertTable {
+  background-image: url(../icons/table.svg);
+}
diff --git a/core/modules/ckeditor5/css/toolbar.admin.css b/core/modules/ckeditor5/css/toolbar.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..40b04dd951244e04e41468289d5ce8a86f137361
--- /dev/null
+++ b/core/modules/ckeditor5/css/toolbar.admin.css
@@ -0,0 +1,99 @@
+.ckeditor5-toolbar-disabled {
+  display: flex;
+  justify-content: space-between;
+}
+.ckeditor5-toolbar-available {
+  flex: 1;
+}
+
+.ckeditor5-toolbar-tray {
+  display: flex;
+  flex-flow: row wrap;
+  align-items: center;
+  min-height: 40px;
+  margin: 0 0 0.5em 0;
+  padding: 0;
+  list-style: none;
+  /* Disallow any user selections in the drag-and-drop toolbar config UI. */
+  user-select: none;
+}
+
+.ckeditor5-toolbar-active__buttons {
+  margin: 5px 0;
+  padding: 0.1667em 0.1667em 0.08em;
+  border: 1px solid #c4c4c4;
+  border-radius: 2px;
+  background: #fafafa;
+}
+
+.ckeditor5-toolbar-item,
+.ckeditor5-toolbar-button {
+  display: block;
+  min-width: 36px;
+  height: 36px;
+  cursor: move;
+  border-radius: 2px;
+}
+
+.ckeditor5-toolbar-item {
+  position: relative;
+  margin: 5px 8px 5px 0;
+}
+
+.ckeditor5-toolbar-disabled .ckeditor5-toolbar-item {
+  border: 1px solid #e6e6e6;
+}
+
+.ckeditor5-toolbar-button {
+  border: none;
+  background-color: #eee;
+  background-repeat: no-repeat;
+  background-position: center;
+  background-size: 20px;
+}
+
+.ckeditor5-toolbar-button:focus,
+.ckeditor5-toolbar-button:hover {
+  color: #000;
+  background-color: #e6e6e6;
+}
+
+.ckeditor5-toolbar-button:focus,
+.ckeditor5-toolbar-button:hover,
+.ckeditor5-toolbar-button {
+  text-decoration: none;
+}
+.ckeditor5-toolbar-tooltip {
+  position: absolute;
+  z-index: 1;
+  left: 50%;
+  display: block;
+  padding: 6px 10px;
+  transform: translate(-50%, 2px);
+  text-transform: capitalize;
+  color: #fff;
+  border-radius: 3px;
+  background: #333;
+  font-size: 12px;
+  line-height: 1;
+}
+
+.ckeditor5-toolbar-tooltip::before {
+  position: absolute;
+  top: -10px;
+  left: 50%;
+  width: 0;
+  height: 5px;
+  content: "";
+  transform: translateX(-50%);
+  border-right: solid 5px transparent;
+  border-bottom: solid 5px #333;
+  border-left: solid 5px transparent;
+}
+
+.ckeditor5-toolbar-button + .ckeditor5-toolbar-tooltip {
+  visibility: hidden;
+}
+.ckeditor5-toolbar-button[data-expanded="true"] + .ckeditor5-toolbar-tooltip {
+  visibility: visible;
+}
diff --git a/core/modules/ckeditor5/icons/align-center.svg b/core/modules/ckeditor5/icons/align-center.svg
new file mode 100644
index 0000000000000000000000000000000000000000..4d5a61dc2f3ca23705dffd08802c4192bc03e5d9
--- /dev/null
+++ b/core/modules/ckeditor5/icons/align-center.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm2.286 4c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/align-justify.svg b/core/modules/ckeditor5/icons/align-justify.svg
new file mode 100644
index 0000000000000000000000000000000000000000..277c3de58056d2c45af504ad7ab400c42b1b0f96
--- /dev/null
+++ b/core/modules/ckeditor5/icons/align-justify.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/align-left.svg b/core/modules/ckeditor5/icons/align-left.svg
new file mode 100644
index 0000000000000000000000000000000000000000..bf1a93259835f7c4e92ea1338a844474279df06e
--- /dev/null
+++ b/core/modules/ckeditor5/icons/align-left.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/align-right.svg b/core/modules/ckeditor5/icons/align-right.svg
new file mode 100644
index 0000000000000000000000000000000000000000..4d51b5bdfbbea98158798c9ec9e72a60e19f7b7c
--- /dev/null
+++ b/core/modules/ckeditor5/icons/align-right.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M18 3.75a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 8a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 4a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75zm0-8a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/blockquote.svg b/core/modules/ckeditor5/icons/blockquote.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9f67095ddc23fd848a3c16c9466e4d718b3b8668
--- /dev/null
+++ b/core/modules/ckeditor5/icons/blockquote.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 10.423a6.5 6.5 0 0 1 6.056-6.408l.038.67C6.448 5.423 5.354 7.663 5.22 10H9c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574zm8 0a6.5 6.5 0 0 1 6.056-6.408l.038.67c-2.646.739-3.74 2.979-3.873 5.315H17c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/bold.svg b/core/modules/ckeditor5/icons/bold.svg
new file mode 100644
index 0000000000000000000000000000000000000000..15b145fc7f5414e287e5c49f27982e9681c9f896
--- /dev/null
+++ b/core/modules/ckeditor5/icons/bold.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.187 17H5.773c-.637 0-1.092-.138-1.364-.415-.273-.277-.409-.718-.409-1.323V4.738c0-.617.14-1.062.419-1.332.279-.27.73-.406 1.354-.406h4.68c.69 0 1.288.041 1.793.124.506.083.96.242 1.36.478.341.197.644.447.906.75a3.262 3.262 0 0 1 .808 2.162c0 1.401-.722 2.426-2.167 3.075C15.05 10.175 16 11.315 16 13.01a3.756 3.756 0 0 1-2.296 3.504 6.1 6.1 0 0 1-1.517.377c-.571.073-1.238.11-2 .11zm-.217-6.217H7v4.087h3.069c1.977 0 2.965-.69 2.965-2.072 0-.707-.256-1.22-.768-1.537-.512-.319-1.277-.478-2.296-.478zM7 5.13v3.619h2.606c.729 0 1.292-.067 1.69-.2a1.6 1.6 0 0 0 .91-.765c.165-.267.247-.566.247-.897 0-.707-.26-1.176-.778-1.409-.519-.232-1.31-.348-2.375-.348H7z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/bulletedlist.svg b/core/modules/ckeditor5/icons/bulletedlist.svg
new file mode 100644
index 0000000000000000000000000000000000000000..cad4a657f26b3c1f15667ce2c774ec9817c6e24b
--- /dev/null
+++ b/core/modules/ckeditor5/icons/bulletedlist.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5.75c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zm-6 0C1 4.784 1.777 4 2.75 4c.966 0 1.75.777 1.75 1.75 0 .966-.777 1.75-1.75 1.75C1.784 7.5 1 6.723 1 5.75zm6 9c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zm-6 0c0-.966.777-1.75 1.75-1.75.966 0 1.75.777 1.75 1.75 0 .966-.777 1.75-1.75 1.75-.966 0-1.75-.777-1.75-1.75z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/code.svg b/core/modules/ckeditor5/icons/code.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fe08f7604f23b3690902edda19147383a8920a29
--- /dev/null
+++ b/core/modules/ckeditor5/icons/code.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m12.5 5.7 5.2 3.9v1.3l-5.6 4c-.1.2-.3.2-.5.2-.3-.1-.6-.7-.6-1l.3-.4 4.7-3.5L11.5 7l-.2-.2c-.1-.3-.1-.6 0-.8.2-.2.5-.4.8-.4a.8.8 0 0 1 .4.1zm-5.2 0L2 9.6v1.3l5.6 4c.1.2.3.2.5.2.3-.1.7-.7.6-1 0-.1 0-.3-.2-.4l-5-3.5L8.2 7l.2-.2c.1-.3.1-.6 0-.8-.2-.2-.5-.4-.8-.4a.8.8 0 0 0-.3.1z"/></svg>
diff --git a/core/modules/ckeditor5/icons/divider.svg b/core/modules/ckeditor5/icons/divider.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7d0545391cb819395fda97b76bd7d49390180407
--- /dev/null
+++ b/core/modules/ckeditor5/icons/divider.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><rect x="9" y="2" width="2" height="16" /></svg>
diff --git a/core/modules/ckeditor5/icons/horizontalline.svg b/core/modules/ckeditor5/icons/horizontalline.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a89a54851345a17ec1d47acf174ee3020b8e9ae3
--- /dev/null
+++ b/core/modules/ckeditor5/icons/horizontalline.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 9h16v2H2z"/></svg>
diff --git a/core/modules/ckeditor5/icons/imageupload.svg b/core/modules/ckeditor5/icons/imageupload.svg
new file mode 100644
index 0000000000000000000000000000000000000000..954eebdfe5235a14d833fe22c8016c572f17410a
--- /dev/null
+++ b/core/modules/ckeditor5/icons/imageupload.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.91 10.54c.26-.23.64-.21.88.03l3.36 3.14 2.23-2.06a.64.64 0 0 1 .87 0l2.52 2.97V4.5H3.2v10.12l3.71-4.08zm10.27-7.51c.6 0 1.09.47 1.09 1.05v11.84c0 .59-.49 1.06-1.09 1.06H2.79c-.6 0-1.09-.47-1.09-1.06V4.08c0-.58.49-1.05 1.1-1.05h14.38zm-5.22 5.56a1.96 1.96 0 1 1 3.4-1.96 1.96 1.96 0 0 1-3.4 1.96z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/indent.svg b/core/modules/ckeditor5/icons/indent.svg
new file mode 100644
index 0000000000000000000000000000000000000000..cd360e2f26f03b5dadd9b2c2737d81cc79bc9f51
--- /dev/null
+++ b/core/modules/ckeditor5/icons/indent.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm5 6c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM2.75 16.5h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 1 0 0 1.5zM1.632 6.95 5.02 9.358a.4.4 0 0 1-.013.661l-3.39 2.207A.4.4 0 0 1 1 11.892V7.275a.4.4 0 0 1 .632-.326z"/></svg>
diff --git a/core/modules/ckeditor5/icons/italic.svg b/core/modules/ckeditor5/icons/italic.svg
new file mode 100644
index 0000000000000000000000000000000000000000..43ca23085657a32db3398423c7beebc34d7c8bc6
--- /dev/null
+++ b/core/modules/ckeditor5/icons/italic.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m9.586 14.633.021.004c-.036.335.095.655.393.962.082.083.173.15.274.201h1.474a.6.6 0 1 1 0 1.2H5.304a.6.6 0 0 1 0-1.2h1.15c.474-.07.809-.182 1.005-.334.157-.122.291-.32.404-.597l2.416-9.55a1.053 1.053 0 0 0-.281-.823 1.12 1.12 0 0 0-.442-.296H8.15a.6.6 0 0 1 0-1.2h6.443a.6.6 0 1 1 0 1.2h-1.195c-.376.056-.65.155-.823.296-.215.175-.423.439-.623.79l-2.366 9.347z"/></svg>
diff --git a/core/modules/ckeditor5/icons/link.svg b/core/modules/ckeditor5/icons/link.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d88bdec3ef218b5578d8abbd60736fa6b4cf93fd
--- /dev/null
+++ b/core/modules/ckeditor5/icons/link.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.077 15 .991-1.416a.75.75 0 1 1 1.229.86l-1.148 1.64a.748.748 0 0 1-.217.206 5.251 5.251 0 0 1-8.503-5.955.741.741 0 0 1 .12-.274l1.147-1.639a.75.75 0 1 1 1.228.86L4.933 10.7l.006.003a3.75 3.75 0 0 0 6.132 4.294l.006.004zm5.494-5.335a.748.748 0 0 1-.12.274l-1.147 1.639a.75.75 0 1 1-1.228-.86l.86-1.23a3.75 3.75 0 0 0-6.144-4.301l-.86 1.229a.75.75 0 0 1-1.229-.86l1.148-1.64a.748.748 0 0 1 .217-.206 5.251 5.251 0 0 1 8.503 5.955zm-4.563-2.532a.75.75 0 0 1 .184 1.045l-3.155 4.505a.75.75 0 1 1-1.229-.86l3.155-4.506a.75.75 0 0 1 1.045-.184z"/></svg>
diff --git a/core/modules/ckeditor5/icons/medialibrary.svg b/core/modules/ckeditor5/icons/medialibrary.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e3e32bd9a23d67077d09aa6ba14fa041d3cc830d
--- /dev/null
+++ b/core/modules/ckeditor5/icons/medialibrary.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M19.1873 4.86414L10.2509 6.86414V7.02335H10.2499V15.5091C9.70972 15.1961 9.01793 15.1048 8.34069 15.3136C7.12086 15.6896 6.41013 16.8967 6.75322 18.0096C7.09631 19.1226 8.3633 19.72 9.58313 19.344C10.6666 19.01 11.3484 18.0203 11.2469 17.0234H11.2499V9.80173L18.1803 8.25067V14.3868C17.6401 14.0739 16.9483 13.9825 16.2711 14.1913C15.0513 14.5674 14.3406 15.7744 14.6836 16.8875C15.0267 18.0004 16.2937 18.5978 17.5136 18.2218C18.597 17.8877 19.2788 16.8982 19.1773 15.9011H19.1803V8.02687L19.1873 8.0253V4.86414Z" /><path fill-rule="evenodd" clip-rule="evenodd" d="M13.5039 0.743652H0.386932V12.1603H13.5039V0.743652ZM12.3379 1.75842H1.55289V11.1454H1.65715L4.00622 8.86353L6.06254 10.861L9.24985 5.91309L11.3812 9.22179L11.7761 8.6676L12.3379 9.45621V1.75842ZM6.22048 4.50869C6.22048 5.58193 5.35045 6.45196 4.27722 6.45196C3.20398 6.45196 2.33395 5.58193 2.33395 4.50869C2.33395 3.43546 3.20398 2.56543 4.27722 2.56543C5.35045 2.56543 6.22048 3.43546 6.22048 4.50869Z" /></svg>
diff --git a/core/modules/ckeditor5/icons/numberedlist.svg b/core/modules/ckeditor5/icons/numberedlist.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7828079102a67d6478e318ae059779f7a50222f7
--- /dev/null
+++ b/core/modules/ckeditor5/icons/numberedlist.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5.75c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM3.5 3v5H2V3.7H1v-1h2.5V3zM.343 17.857l2.59-3.257H2.92a.6.6 0 1 0-1.04 0H.302a2 2 0 1 1 3.995 0h-.001c-.048.405-.16.734-.333.988-.175.254-.59.692-1.244 1.312H4.3v1h-4l.043-.043zM7 14.75a.75.75 0 0 1 .75-.75h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/outdent.svg b/core/modules/ckeditor5/icons/outdent.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a8ddcdae54be4b8c570de0c293d495b7bb61afe2
--- /dev/null
+++ b/core/modules/ckeditor5/icons/outdent.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm5 6c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM2.75 16.5h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 1 0 0 1.5zm1.618-9.55L.98 9.358a.4.4 0 0 0 .013.661l3.39 2.207A.4.4 0 0 0 5 11.892V7.275a.4.4 0 0 0-.632-.326z"/></svg>
diff --git a/core/modules/ckeditor5/icons/redo.svg b/core/modules/ckeditor5/icons/redo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d175568124fb02eaa6c46777962b0baba7331372
--- /dev/null
+++ b/core/modules/ckeditor5/icons/redo.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m14.958 9.367-2.189 1.837a.75.75 0 0 0 .965 1.149l3.788-3.18a.747.747 0 0 0 .21-.284.75.75 0 0 0-.17-.945L13.77 4.762a.75.75 0 1 0-.964 1.15l2.331 1.955H6.22A.75.75 0 0 0 6 7.9a4 4 0 1 0 1.477 7.718l-.344-1.489A2.5 2.5 0 1 1 6.039 9.4l-.008-.032h8.927z"/></svg>
diff --git a/core/modules/ckeditor5/icons/remove-format.svg b/core/modules/ckeditor5/icons/remove-format.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0df1d6462db480c19a0b123fcd2e833dcaa0dad3
--- /dev/null
+++ b/core/modules/ckeditor5/icons/remove-format.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8.69 14.915c.053.052.173.083.36.093a.366.366 0 0 1 .345.485l-.003.01a.738.738 0 0 1-.697.497h-2.67a.374.374 0 0 1-.353-.496l.013-.038a.681.681 0 0 1 .644-.458c.197-.012.325-.043.386-.093a.28.28 0 0 0 .072-.11L9.592 4.5H6.269c-.359-.017-.609.013-.75.09-.142.078-.289.265-.442.563-.192.29-.516.464-.864.464H4.17a.43.43 0 0 1-.407-.569L4.46 3h13.08l-.62 2.043a.81.81 0 0 1-.775.574h-.114a.486.486 0 0 1-.486-.486c.001-.284-.054-.464-.167-.54-.112-.076-.367-.106-.766-.091h-3.28l-2.68 10.257c-.006.074.007.127.038.158zM3 17h8a.5.5 0 1 1 0 1H3a.5.5 0 1 1 0-1zm11.299 1.17a.75.75 0 1 1-1.06-1.06l1.414-1.415-1.415-1.414a.75.75 0 0 1 1.06-1.06l1.415 1.414 1.414-1.415a.75.75 0 1 1 1.06 1.06l-1.413 1.415 1.414 1.415a.75.75 0 0 1-1.06 1.06l-1.415-1.414-1.414 1.414z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/separator.svg b/core/modules/ckeditor5/icons/separator.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f8a6653939147edac4599034a3fa59587a1fcee2
--- /dev/null
+++ b/core/modules/ckeditor5/icons/separator.svg
@@ -0,0 +1 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="6.65" height="6.65" rx="1" fill="black"/><rect y="13" width="6.65" height="6.65" rx="1" fill="black"/><rect x="9" width="6.65" height="6.65" rx="1" fill="black"/><path d="M7.59998 16.3134L13.5799 12.8609L13.5799 19.7659L7.59998 16.3134Z" fill="black"/><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7307 16.7783H17.13C18.2346 16.7783 19.13 15.8829 19.13 14.7783V4.84961C19.13 3.74504 18.2346 2.84961 17.13 2.84961H16.9706V3.84961H17.13C17.6823 3.84961 18.13 4.29732 18.13 4.84961V14.7783C18.13 15.3306 17.6823 15.7783 17.13 15.7783H12.7307V16.7783Z" fill="black"/></svg>
diff --git a/core/modules/ckeditor5/icons/source-editing.svg b/core/modules/ckeditor5/icons/source-editing.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0bf9e953df58e78ebfd1d0a32dda74b8eb3ba5e2
--- /dev/null
+++ b/core/modules/ckeditor5/icons/source-editing.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m12.5 0 5 4.5v15.003h-16V0h11zM3 1.5v3.25l-1.497 1-.003 8 1.5 1v3.254L7.685 18l-.001 1.504H17.5V8.002L16 9.428l-.004-4.22-4.222-3.692L3 1.5z"/><path d="M4.06 6.64a.75.75 0 0 1 .958 1.15l-.085.07L2.29 9.75l2.646 1.89c.302.216.4.62.232.951l-.058.095a.75.75 0 0 1-.951.232l-.095-.058-3.5-2.5V9.14l3.496-2.5zm4.194 6.22a.75.75 0 0 1-.958-1.149l.085-.07 2.643-1.89-2.646-1.89a.75.75 0 0 1-.232-.952l.058-.095a.75.75 0 0 1 .95-.232l.096.058 3.5 2.5v1.22l-3.496 2.5zm7.644-.836 2.122 2.122-5.825 5.809-2.125-.005.003-2.116zm2.539-1.847 1.414 1.414a.5.5 0 0 1 0 .707l-1.06 1.06-2.122-2.12 1.061-1.061a.5.5 0 0 1 .707 0z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/special-characters.svg b/core/modules/ckeditor5/icons/special-characters.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8e0251be0782b33d0abd0bda6ce3cab56d4be8c5
--- /dev/null
+++ b/core/modules/ckeditor5/icons/special-characters.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10 2.5a7.47 7.47 0 0 1 4.231 1.31 7.268 7.268 0 0 1 2.703 3.454 7.128 7.128 0 0 1 .199 4.353c-.39 1.436-1.475 2.72-2.633 3.677h2.013c0-.226.092-.443.254-.603a.876.876 0 0 1 1.229 0c.163.16.254.377.254.603v.853c0 .209-.078.41-.22.567a.873.873 0 0 1-.547.28l-.101.006h-4.695a.517.517 0 0 1-.516-.518v-1.265c0-.21.128-.398.317-.489a5.601 5.601 0 0 0 2.492-2.371 5.459 5.459 0 0 0 .552-3.693 5.53 5.53 0 0 0-1.955-3.2A5.71 5.71 0 0 0 10 4.206 5.708 5.708 0 0 0 6.419 5.46 5.527 5.527 0 0 0 4.46 8.663a5.457 5.457 0 0 0 .554 3.695 5.6 5.6 0 0 0 2.497 2.37.55.55 0 0 1 .317.49v1.264c0 .286-.23.518-.516.518H2.618a.877.877 0 0 1-.614-.25.845.845 0 0 1-.254-.603v-.853c0-.226.091-.443.254-.603a.876.876 0 0 1 1.228 0c.163.16.255.377.255.603h1.925c-1.158-.958-2.155-2.241-2.545-3.678a7.128 7.128 0 0 1 .199-4.352 7.268 7.268 0 0 1 2.703-3.455A7.475 7.475 0 0 1 10 2.5z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/strikethrough.svg b/core/modules/ckeditor5/icons/strikethrough.svg
new file mode 100644
index 0000000000000000000000000000000000000000..756a6870ea13909c7c6b4fbe857d1e00426079a6
--- /dev/null
+++ b/core/modules/ckeditor5/icons/strikethrough.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 16.4c-.8-.4-1.5-.9-2.2-1.5a.6.6 0 0 1-.2-.5l.3-.6h1c1 1.2 2.1 1.7 3.7 1.7 1 0 1.8-.3 2.3-.6.6-.4.6-1.2.6-1.3.2-1.2-.9-2.1-.9-2.1h2.1c.3.7.4 1.2.4 1.7v.8l-.6 1.2c-.6.8-1.1 1-1.6 1.2a6 6 0 0 1-2.4.6c-1 0-1.8-.3-2.5-.6zM6.8 9 6 8.3c-.4-.5-.5-.8-.5-1.6 0-.7.1-1.3.5-1.8.4-.6 1-1 1.6-1.3a6.3 6.3 0 0 1 4.7 0 4 4 0 0 1 1.7 1l.3.7c0 .1.2.4-.2.7-.4.2-.9.1-1 0a3 3 0 0 0-1.2-1c-.4-.2-1-.3-2-.4-.7 0-1.4.2-2 .6-.8.6-1 .8-1 1.5 0 .8.5 1 1.2 1.5.6.4 1.1.7 1.9 1H6.8z"/><path d="M3 10.5V9h14v1.5z"/></svg>
diff --git a/core/modules/ckeditor5/icons/subscript.svg b/core/modules/ckeditor5/icons/subscript.svg
new file mode 100644
index 0000000000000000000000000000000000000000..da53b284a56216b7947c351b19aedc89ec0897e8
--- /dev/null
+++ b/core/modules/ckeditor5/icons/subscript.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m7.03 10.349 3.818-3.819a.8.8 0 1 1 1.132 1.132L8.16 11.48l3.819 3.818a.8.8 0 1 1-1.132 1.132L7.03 12.61l-3.818 3.82a.8.8 0 1 1-1.132-1.132L5.9 11.48 2.08 7.662A.8.8 0 1 1 3.212 6.53l3.818 3.82zm8.147 7.829h2.549c.254 0 .447.05.58.152a.49.49 0 0 1 .201.413.54.54 0 0 1-.159.393c-.105.108-.266.162-.48.162h-3.594c-.245 0-.435-.066-.572-.197a.621.621 0 0 1-.205-.463c0-.114.044-.265.132-.453a1.62 1.62 0 0 1 .288-.444c.433-.436.824-.81 1.172-1.122.348-.312.597-.517.747-.615.267-.183.49-.368.667-.553.177-.185.312-.375.405-.57.093-.194.139-.384.139-.57a1.008 1.008 0 0 0-.554-.917 1.197 1.197 0 0 0-.56-.133c-.426 0-.761.182-1.005.546a2.332 2.332 0 0 0-.164.39 1.609 1.609 0 0 1-.258.488c-.096.114-.237.17-.423.17a.558.558 0 0 1-.405-.156.568.568 0 0 1-.161-.427c0-.218.05-.446.151-.683.101-.238.252-.453.452-.646s.454-.349.762-.467a2.998 2.998 0 0 1 1.081-.178c.498 0 .923.076 1.274.228a1.916 1.916 0 0 1 1.004 1.032 1.984 1.984 0 0 1-.156 1.794c-.2.32-.405.572-.613.754-.208.182-.558.468-1.048.857-.49.39-.826.691-1.008.906a2.703 2.703 0 0 0-.24.309z"/></svg>
diff --git a/core/modules/ckeditor5/icons/superscript.svg b/core/modules/ckeditor5/icons/superscript.svg
new file mode 100644
index 0000000000000000000000000000000000000000..92c9be8064b8ce9d8258d6606430cb5455aa3276
--- /dev/null
+++ b/core/modules/ckeditor5/icons/superscript.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M15.677 8.678h2.549c.254 0 .447.05.58.152a.49.49 0 0 1 .201.413.54.54 0 0 1-.159.393c-.105.108-.266.162-.48.162h-3.594c-.245 0-.435-.066-.572-.197a.621.621 0 0 1-.205-.463c0-.114.044-.265.132-.453a1.62 1.62 0 0 1 .288-.444c.433-.436.824-.81 1.172-1.122.348-.312.597-.517.747-.615.267-.183.49-.368.667-.553.177-.185.312-.375.405-.57.093-.194.139-.384.139-.57a1.008 1.008 0 0 0-.554-.917 1.197 1.197 0 0 0-.56-.133c-.426 0-.761.182-1.005.546a2.332 2.332 0 0 0-.164.39 1.609 1.609 0 0 1-.258.488c-.096.114-.237.17-.423.17a.558.558 0 0 1-.405-.156.568.568 0 0 1-.161-.427c0-.218.05-.446.151-.683.101-.238.252-.453.452-.646s.454-.349.762-.467a2.998 2.998 0 0 1 1.081-.178c.498 0 .923.076 1.274.228a1.916 1.916 0 0 1 1.004 1.032 1.984 1.984 0 0 1-.156 1.794c-.2.32-.405.572-.613.754-.208.182-.558.468-1.048.857-.49.39-.826.691-1.008.906a2.703 2.703 0 0 0-.24.309zM7.03 10.349l3.818-3.819a.8.8 0 1 1 1.132 1.132L8.16 11.48l3.819 3.818a.8.8 0 1 1-1.132 1.132L7.03 12.61l-3.818 3.82a.8.8 0 1 1-1.132-1.132L5.9 11.48 2.08 7.662A.8.8 0 1 1 3.212 6.53l3.818 3.82z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/table.svg b/core/modules/ckeditor5/icons/table.svg
new file mode 100644
index 0000000000000000000000000000000000000000..374ef8863851bb7a610772177e4d7e884928f006
--- /dev/null
+++ b/core/modules/ckeditor5/icons/table.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 6v3h4V6H3zm0 4v3h4v-3H3zm0 4v3h4v-3H3zm5 3h4v-3H8v3zm5 0h4v-3h-4v3zm4-4v-3h-4v3h4zm0-4V6h-4v3h4zm1.5 8a1.5 1.5 0 0 1-1.5 1.5H3A1.5 1.5 0 0 1 1.5 17V4c.222-.863 1.068-1.5 2-1.5h13c.932 0 1.778.637 2 1.5v13zM12 13v-3H8v3h4zm0-4V6H8v3h4z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/underline.svg b/core/modules/ckeditor5/icons/underline.svg
new file mode 100644
index 0000000000000000000000000000000000000000..11bab0dde0d920070f813116d5005b5c8c24ab40
--- /dev/null
+++ b/core/modules/ckeditor5/icons/underline.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 18v-1.5h14V18zM5.2 10V3.6c0-.4.4-.6.8-.6.3 0 .7.2.7.6v6.2c0 2 1.3 2.8 3.2 2.8 1.9 0 3.4-.9 3.4-2.9V3.6c0-.3.4-.5.8-.5.3 0 .7.2.7.5V10c0 2.7-2.2 4-4.9 4-2.6 0-4.7-1.2-4.7-4z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/undo.svg b/core/modules/ckeditor5/icons/undo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0e01bcac287595cd3ac1384d9cf01a7ed81df6f8
--- /dev/null
+++ b/core/modules/ckeditor5/icons/undo.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m5.042 9.367 2.189 1.837a.75.75 0 0 1-.965 1.149l-3.788-3.18a.747.747 0 0 1-.21-.284.75.75 0 0 1 .17-.945L6.23 4.762a.75.75 0 1 1 .964 1.15L4.863 7.866h8.917A.75.75 0 0 1 14 7.9a4 4 0 1 1-1.477 7.718l.344-1.489a2.5 2.5 0 1 0 1.094-4.73l.008-.032H5.042z"/></svg>
diff --git a/core/modules/ckeditor5/js/build/drupalEmphasis.js b/core/modules/ckeditor5/js/build/drupalEmphasis.js
new file mode 100644
index 0000000000000000000000000000000000000000..7aa31a0b7fc954ac6c35c5fd072599f642f8297b
--- /dev/null
+++ b/core/modules/ckeditor5/js/build/drupalEmphasis.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.drupalEmphasis=t())}(self,(function(){return function(){var e={"ckeditor5/src/core.js":function(e,t,r){e.exports=r("dll-reference CKEditor5.dll")("./src/core.js")},"dll-reference CKEditor5.dll":function(e){"use strict";e.exports=CKEditor5.dll}},t={};function r(o){var i=t[o];if(void 0!==i)return i.exports;var n=t[o]={exports:{}};return e[o](n,n.exports,r),n.exports}r.d=function(e,t){for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var o={};return function(){"use strict";r.d(o,{default:function(){return s}});var e=r("ckeditor5/src/core.js");class t extends e.Plugin{static get pluginName(){return"DrupalEmphasisEditing"}init(){this.editor.conversion.for("downcast").attributeToElement({model:"italic",view:"em",converterPriority:"high"})}}var i=t;class n extends e.Plugin{static get requires(){return[i]}static get pluginName(){return"DrupalEmphasis"}}var s={DrupalEmphasis:n}}(),o=o.default}()}));
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/build/drupalHtmlEngine.js b/core/modules/ckeditor5/js/build/drupalHtmlEngine.js
new file mode 100644
index 0000000000000000000000000000000000000000..448883cc96838bd3db20246426614890dcae08e3
--- /dev/null
+++ b/core/modules/ckeditor5/js/build/drupalHtmlEngine.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.drupalHtmlEngine=t())}(self,(function(){return function(){var e={"ckeditor5/src/core.js":function(e,t,n){e.exports=n("dll-reference CKEditor5.dll")("./src/core.js")},"dll-reference CKEditor5.dll":function(e){"use strict";e.exports=CKEditor5.dll}},t={};function n(r){var p=t[r];if(void 0!==p)return p.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,n),i.exports}n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var r={};return function(){"use strict";n.d(r,{default:function(){return o}});var e=n("ckeditor5/src/core.js");class t{constructor(){this.chunks=[],this.selfClosingTags=["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]}build(){return this.chunks.join("")}appendNode(e){e.nodeType===Node.TEXT_NODE?this._appendText(e):e.nodeType===Node.ELEMENT_NODE?this._appendElement(e):e.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&this._appendChildren(e)}_appendElement(e){const t=e.nodeName.toLowerCase();this._append("<"),this._append(t),this._appendAttributes(e),this._append(">"),this.selfClosingTags.includes(t)||(this._appendChildren(e),this._append("</"),this._append(t),this._append(">"))}_appendChildren(e){Object.keys(e.childNodes).forEach((t=>{this.appendNode(e.childNodes[t])}))}_appendAttributes(e){Object.keys(e.attributes).forEach((t=>{this._append(" "),this._append(e.attributes[t].name),this._append('="'),this._append(this.constructor._escapeAttribute(e.attributes[t].value)),this._append('"')}))}_appendText(e){const t=document.implementation.createHTMLDocument("").createElement("p");t.textContent=e.textContent,this._append(t.innerHTML)}_append(e){this.chunks.push(e)}static _escapeAttribute(e){return e.replace(/&/g,"&amp;").replace(/'/g,"&apos;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r\n/g,"&#13;").replace(/[\r\n]/g,"&#13;")}}class p{getHtml(e){const n=new t;return n.appendNode(e),n.build()}}class i extends e.Plugin{init(){this.editor.data.processor.htmlWriter=new p}static get pluginName(){return"DrupalHtmlEngine"}}var o={DrupalHtmlEngine:i}}(),r=r.default}()}));
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/build/drupalImage.js b/core/modules/ckeditor5/js/build/drupalImage.js
new file mode 100644
index 0000000000000000000000000000000000000000..44d330d5c9a38d5c0d24e89dd2ee282aeaa87487
--- /dev/null
+++ b/core/modules/ckeditor5/js/build/drupalImage.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(t.CKEditor5=t.CKEditor5||{},t.CKEditor5.drupalImage=e())}(self,(function(){return function(){var t={"ckeditor5/src/core.js":function(t,e,i){t.exports=i("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/upload.js":function(t,e,i){t.exports=i("dll-reference CKEditor5.dll")("./src/upload.js")},"ckeditor5/src/utils.js":function(t,e,i){t.exports=i("dll-reference CKEditor5.dll")("./src/utils.js")},"dll-reference CKEditor5.dll":function(t){"use strict";t.exports=CKEditor5.dll}},e={};function i(r){var n=e[r];if(void 0!==n)return n.exports;var a=e[r]={exports:{}};return t[r](a,a.exports,i),a.exports}i.d=function(t,e){for(var r in e)i.o(e,r)&&!i.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)};var r={};return function(){"use strict";i.d(r,{default:function(){return p}});var t=i("ckeditor5/src/core.js");function e(t){return t.createEmptyElement("img")}function n(){function t(t,e,i){if(!i.consumable.consume(e.item,t.name))return;const r=i.mapper.toViewElement(e.item),n=i.writer,a=n.createContainerElement("a",{href:e.attributeNewValue});n.insert(n.createPositionBefore(r),a),n.move(n.createRangeOn(r),n.createPositionAt(a,0)),i.consumable.consume(e.item,"attribute:htmlLinkAttributes:imageBlock")&&function(t,e,i){if(e.attributes)for(const[r,n]of Object.entries(e.attributes))t.setAttribute(r,n,i);e.styles&&t.setStyle(e.styles,i),e.classes&&t.addClass(e.classes,i)}(i.writer,e.item.getAttribute("htmlLinkAttributes"),a)}return e=>{e.on("attribute:linkHref:imageBlock",t,{priority:"high"})}}class a extends t.Plugin{static get pluginName(){return"DrupalImageEditing"}init(){const{editor:t}=this,{conversion:i}=t,{schema:r}=t.model;r.isRegistered("imageInline")&&r.extend("imageInline",{allowAttributes:["dataEntityUuid","dataEntityType","width","height"]}),r.isRegistered("imageBlock")&&r.extend("imageBlock",{allowAttributes:["dataEntityUuid","dataEntityType","width","height"]}),i.for("upcast").add(function(t){function e(e,i,r){const{viewItem:n}=i,{writer:a,consumable:o,safeInsert:s,updateConversionResult:u,schema:l}=r,d=[];let c;if(o.test(n,{name:!0,attributes:"src"})){if(c=l.checkChild(i.modelCursor,"imageInline")?a.createElement("imageInline",{src:n.getAttribute("src")}):a.createElement("imageBlock",{src:n.getAttribute("src")}),t.plugins.has("ImageStyleEditing")&&o.test(n,{name:!0,attributes:"data-align"})){const t={left:"alignBlockLeft",center:"alignCenter",right:"alignBlockRight"},e={left:"alignLeft",right:"alignRight"},i=n.getAttribute("data-align"),r=c.is("element","imageBlock")?t[i]:e[i];a.setAttribute("imageStyle",r,c),d.push("data-align")}if(c.is("element","imageBlock")&&o.test(n,{name:!0,attributes:"data-caption"})){const e=a.createElement("caption"),i=t.data.processor.toView(n.getAttribute("data-caption")),o=a.createDocumentFragment();r.consumable.constructor.createFrom(i,r.consumable),r.convertChildren(i,o);for(const t of Array.from(o.getChildren()))a.append(t,e);a.append(e,c),d.push("data-caption")}o.test(n,{name:!0,attributes:"data-entity-uuid"})&&(a.setAttribute("dataEntityUuid",n.getAttribute("data-entity-uuid"),c),d.push("data-entity-uuid")),o.test(n,{name:!0,attributes:"data-entity-type"})&&(a.setAttribute("dataEntityType",n.getAttribute("data-entity-type"),c),d.push("data-entity-type")),s(c,i.modelCursor)&&(o.consume(n,{name:!0,attributes:d}),u(c,i))}}return t=>{t.on("element:img",e,{priority:"high"})}}(t)).attributeToAttribute({view:{name:"img",key:"width"},model:{key:"width",value:t=>`${t.getAttribute("width")}px`}}).attributeToAttribute({view:{name:"img",key:"height"},model:{key:"height",value:t=>`${t.getAttribute("height")}px`}}),i.for("downcast").add(function(){function t(t,e,i){const{item:r}=e,{consumable:n,writer:a}=i;if(!n.consume(r,t.name))return;const o=i.mapper.toViewElement(r),s=Array.from(o.getChildren()).find((t=>"img"===t.name));a.setAttribute("data-entity-uuid",e.attributeNewValue,s||o)}return e=>{e.on("attribute:dataEntityUuid",t)}}()).add(function(){function t(t,e,i){const{item:r}=e,{consumable:n,writer:a}=i;if(!n.consume(r,t.name))return;const o=i.mapper.toViewElement(r),s=Array.from(o.getChildren()).find((t=>"img"===t.name));a.setAttribute("data-entity-type",e.attributeNewValue,s||o)}return e=>{e.on("attribute:dataEntityType",t)}}()),i.for("dataDowncast").add(function(t){return e=>{e.on("insert:caption",((e,i,r)=>{const{consumable:n,writer:a,mapper:o}=r;if(!n.consume(i.item,"insert"))return;const s=t.model.createRangeIn(i.item),u=a.createDocumentFragment();o.bindElements(i.item,u);for(const{item:e}of Array.from(s)){const i={item:e,range:t.model.createRangeOn(e)},n=`insert:${e.name||"$text"}`;t.data.downcastDispatcher.fire(n,i,r);for(const n of e.getAttributeKeys())Object.assign(i,{attributeKey:n,attributeOldValue:null,attributeNewValue:i.item.getAttribute(n)}),t.data.downcastDispatcher.fire(`attribute:${n}`,i,r)}for(const t of a.createRangeIn(u).getItems())o.unbindViewElement(t);o.unbindViewElement(u);const l=t.data.processor.toData(u);if(l){const t=o.toViewElement(i.item.parent);a.setAttribute("data-caption",l,t)}}),{priority:"high"})}}(t)).elementToElement({model:"imageBlock",view:(t,{writer:i})=>e(i),converterPriority:"high"}).elementToElement({model:"imageInline",view:(t,{writer:i})=>e(i),converterPriority:"high"}).add(function(){function t(t,e,i){const{item:r}=e,{consumable:n,writer:a}=i,o={alignLeft:"left",alignRight:"right",alignCenter:"center",alignBlockRight:"right",alignBlockLeft:"left"};if(!o[e.attributeNewValue]||!n.consume(r,t.name))return;const s=i.mapper.toViewElement(r),u=Array.from(s.getChildren()).find((t=>"img"===t.name));a.setAttribute("data-align",o[e.attributeNewValue],u||s)}return e=>{e.on("attribute:imageStyle",t,{priority:"high"})}}()).add(function(){function t(t,e,i){const{item:r}=e,{consumable:n,writer:a}=i;if(!n.consume(r,t.name))return;const o=i.mapper.toViewElement(r),s=Array.from(o.getChildren()).find((t=>"img"===t.name));a.setAttribute("width",e.attributeNewValue.replace("px",""),s||o)}return e=>{e.on("attribute:width:imageInline",t,{priority:"high"}),e.on("attribute:width:imageBlock",t,{priority:"high"})}}()).add(function(){function t(t,e,i){const{item:r}=e,{consumable:n,writer:a}=i;if(!n.consume(r,t.name))return;const o=i.mapper.toViewElement(r),s=Array.from(o.getChildren()).find((t=>"img"===t.name));a.setAttribute("height",e.attributeNewValue.replace("px",""),s||o)}return e=>{e.on("attribute:height:imageInline",t,{priority:"high"}),e.on("attribute:height:imageBlock",t,{priority:"high"})}}()).add(n())}}class o extends t.Plugin{static get requires(){return[a]}static get pluginName(){return"DrupalImage"}}var s=o;class u extends t.Plugin{init(){const{editor:t}=this;t.plugins.get("ImageUploadEditing").on("uploadComplete",((e,{data:i,imageElement:r})=>{t.model.change((t=>{t.setAttribute("dataEntityUuid",i.dataEntityUuid,r),t.setAttribute("dataEntityType",i.dataEntityType,r)}))}))}static get pluginName(){return"DrupalImageUploadEditing"}}var l=i("ckeditor5/src/upload.js"),d=i("ckeditor5/src/utils.js");class c{constructor(t,e){this.loader=t,this.options=e}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(){this.xhr=new XMLHttpRequest,this.xhr.open("POST",this.options.uploadUrl,!0),this.xhr.responseType="json"}_initListeners(t,e,i){const r=this.xhr,n=this.loader,a=`Couldn't upload file: ${i.name}.`;r.addEventListener("error",(()=>e(a))),r.addEventListener("abort",(()=>e())),r.addEventListener("load",(()=>{const i=r.response;if(!i||i.error)return e(i&&i.error&&i.error.message?i.error.message:a);t({urls:{default:i.url},dataEntityUuid:i.uuid?i.uuid:"",dataEntityType:i.entity_type?i.entity_type:""})})),r.upload&&r.upload.addEventListener("progress",(t=>{t.lengthComputable&&(n.uploadTotal=t.total,n.uploaded=t.loaded)}))}_sendRequest(t){const e=this.options.headers||{},i=this.options.withCredentials||!1;Object.keys(e).forEach((t=>{this.xhr.setRequestHeader(t,e[t])})),this.xhr.withCredentials=i;const r=new FormData;r.append("upload",t),this.xhr.send(r)}}class m extends t.Plugin{static get requires(){return[l.FileRepository]}static get pluginName(){return"DrupalFileRepository"}init(){const t=this.editor.config.get("drupalImageUpload");t&&(t.uploadUrl?this.editor.plugins.get(l.FileRepository).createUploadAdapter=e=>new c(e,t):(0,d.logWarning)("simple-upload-adapter-missing-uploadurl"))}}class g extends t.Plugin{static get requires(){return[m,u]}static get pluginName(){return"DrupalImageUpload"}}var p={DrupalImage:s,DrupalImageUpload:g}}(),r=r.default}()}));
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/build/drupalMedia.js b/core/modules/ckeditor5/js/build/drupalMedia.js
new file mode 100644
index 0000000000000000000000000000000000000000..ee2cc68094affa54472aaa23204726e25a88676f
--- /dev/null
+++ b/core/modules/ckeditor5/js/build/drupalMedia.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.drupalMedia=t())}(self,(function(){return function(){var e={"ckeditor5/src/core.js":function(e,t,i){e.exports=i("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":function(e,t,i){e.exports=i("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/utils.js":function(e,t,i){e.exports=i("dll-reference CKEditor5.dll")("./src/utils.js")},"ckeditor5/src/widget.js":function(e,t,i){e.exports=i("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":function(e){"use strict";e.exports=CKEditor5.dll}},t={};function i(r){var n=t[r];if(void 0!==n)return n.exports;var a=t[r]={exports:{}};return e[r](a,a.exports,i),a.exports}i.d=function(e,t){for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var r={};return function(){"use strict";i.d(r,{default:function(){return y}});var e=i("ckeditor5/src/core.js"),t=i("ckeditor5/src/widget.js");class n extends e.Command{execute(e){const t=this.editor.plugins.get("DrupalMediaEditing"),i=Object.entries(t.attrs).reduce(((e,[t,i])=>(e[i]=t,e)),{}),r=Object.keys(e).reduce(((t,r)=>(i[r]&&(t[i[r]]=e[r]),t)),{});this.editor.model.change((e=>{this.editor.model.insertContent(function(e,t){return e.createElement("drupalMedia",t)}(e,r))}))}refresh(){const e=this.editor.model,t=e.document.selection,i=e.schema.findAllowedParent(t.getFirstPosition(),"drupalMedia");this.isEnabled=null!==i}}class a extends e.Plugin{static get requires(){return[t.Widget]}init(){this.attrs={drupalMediaAlt:"alt",drupalMediaAlign:"data-align",drupalMediaCaption:"data-caption",drupalMediaEntityType:"data-entity-type",drupalMediaEntityUuid:"data-entity-uuid",drupalMediaViewMode:"data-view-mode"};const e=this.editor.config.get("drupalMedia");if(!e)return;const{previewURL:t,themeError:i}=e;this.previewURL=t,this.labelError=this.editor.t("Preview failed"),this.themeError=i||`\n      <p>${this.editor.t("An error occurred while trying to preview the media. Please save your work and reload this page.")}<p>\n    `,this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertDrupalMedia",new n(this.editor))}async _fetchPreview(e,t){const i=await fetch(`${e}?${new URLSearchParams(t)}`,{headers:{"X-Drupal-MediaPreview-CSRF-Token":this.editor.config.get("drupalMedia").previewCsrfToken}});if(i.ok){return{label:i.headers.get("drupal-media-label"),preview:await i.text()}}return{label:this.labelError,preview:this.themeError}}_defineSchema(){this.editor.model.schema.register("drupalMedia",{allowWhere:"$block",isObject:!0,isContent:!0,allowAttributes:Object.keys(this.attrs)})}_defineConverters(){const e=this.editor.conversion;e.for("upcast").elementToElement({view:{name:"drupal-media"},model:"drupalMedia"}),e.for("dataDowncast").elementToElement({model:"drupalMedia",view:{name:"drupal-media"}}),e.for("editingDowncast").elementToElement({model:"drupalMedia",view:(e,{writer:i})=>{const r=i.createContainerElement("div",{class:"drupal-media"}),n=i.createRawElement("div",{"data-drupal-media-preview":"loading"},(t=>{this.previewURL?this._fetchPreview(this.previewURL,{text:this._renderElement(e),uuid:e.getAttribute("drupalMediaEntityUuid")}).then((({label:e,preview:i})=>{t.innerHTML=i,t.setAttribute("aria-label",e),t.setAttribute("data-drupal-media-preview","ready")})):(t.innerHTML=this.themeError,t.setAttribute("aria-label","drupal-media"),t.setAttribute("data-drupal-media-preview","unavailable"))}));return i.insert(i.createPositionAt(r,0),n),i.setCustomProperty("drupalMedia",!0,r),(0,t.toWidget)(r,i,{label:"media widget"})}}),Object.keys(this.attrs).forEach((t=>{e.attributeToAttribute({model:{key:t,name:"drupalMedia"},view:{name:"drupal-media",key:this.attrs[t]}})}))}_renderElement(e){const t=e.getAttributes();let i="<drupal-media";return Array.from(t).forEach((e=>{this.attrs[e[0]]&&"drupalMediaCaption"!==e[0]&&(i+=` ${this.attrs[e[0]]}="${e[1]}"`)})),i+="></drupal-media>",i}static get pluginName(){return"DrupalMediaEditing"}}var s=i("ckeditor5/src/ui.js");class o extends e.Plugin{init(){const e=this.editor,t=this.editor.config.get("drupalMedia");if(!t)return;const{libraryURL:i,openDialog:r,dialogSettings:n={}}=t;i&&"function"==typeof r&&e.ui.componentFactory.add("drupalMedia",(t=>{const a=e.commands.get("insertDrupalMedia"),o=new s.ButtonView(t);return o.set({label:e.t("Insert Drupal Media"),icon:'<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M19.1873 4.86414L10.2509 6.86414V7.02335H10.2499V15.5091C9.70972 15.1961 9.01793 15.1048 8.34069 15.3136C7.12086 15.6896 6.41013 16.8967 6.75322 18.0096C7.09631 19.1226 8.3633 19.72 9.58313 19.344C10.6666 19.01 11.3484 18.0203 11.2469 17.0234H11.2499V9.80173L18.1803 8.25067V14.3868C17.6401 14.0739 16.9483 13.9825 16.2711 14.1913C15.0513 14.5674 14.3406 15.7744 14.6836 16.8875C15.0267 18.0004 16.2937 18.5978 17.5136 18.2218C18.597 17.8877 19.2788 16.8982 19.1773 15.9011H19.1803V8.02687L19.1873 8.0253V4.86414Z" fill="black"/><path fill-rule="evenodd" clip-rule="evenodd" d="M13.5039 0.743652H0.386932V12.1603H13.5039V0.743652ZM12.3379 1.75842H1.55289V11.1454H1.65715L4.00622 8.86353L6.06254 10.861L9.24985 5.91309L11.3812 9.22179L11.7761 8.6676L12.3379 9.45621V1.75842ZM6.22048 4.50869C6.22048 5.58193 5.35045 6.45196 4.27722 6.45196C3.20398 6.45196 2.33395 5.58193 2.33395 4.50869C2.33395 3.43546 3.20398 2.56543 4.27722 2.56543C5.35045 2.56543 6.22048 3.43546 6.22048 4.50869Z" fill="black"/></svg>\n',tooltip:!0}),o.bind("isOn","isEnabled").to(a,"value","isEnabled"),this.listenTo(o,"execute",(()=>{r(i,(({attributes:t})=>{e.execute("insertDrupalMedia",t)}),n)})),o}))}}function l(e){return!!e&&e.is("element","drupalMedia")}function d(e){const i=e.getSelectedElement();return i&&function(e){return(0,t.isWidget)(e)&&!!e.getCustomProperty("drupalMedia")}(i)?i:null}class u extends e.Plugin{static get requires(){return[t.WidgetToolbarRepository]}static get pluginName(){return"DrupalMediaToolbar"}afterInit(){const e=this.editor,{t:i}=e;e.plugins.get(t.WidgetToolbarRepository).register("drupalMedia",{ariaLabel:i("Drupal Media toolbar"),items:e.config.get("drupalMedia.toolbar")||[],getRelatedElement:e=>d(e)})}}class c extends e.Command{refresh(){const e=this.editor.model.document.selection.getSelectedElement();this.isEnabled=!1,l(e)&&this._isMediaImage(e).then((e=>{this.isEnabled=e})),l(e)&&e.hasAttribute("drupalMediaAlt")?this.value=e.getAttribute("drupalMediaAlt"):this.value=!1}execute(e){const{model:t}=this.editor,i=t.document.selection.getSelectedElement();e.newValue=e.newValue.trim(),t.change((t=>{e.newValue.length>0?t.setAttribute("drupalMediaAlt",e.newValue,i):t.removeAttribute("drupalMediaAlt",i)}))}async _isMediaImage(e){const t=this.editor.config.get("drupalMedia");if(!t)return null;const{isMediaUrl:i}=t,r=new URLSearchParams({uuid:e.getAttribute("drupalMediaEntityUuid")}),n=await fetch(`${i}&${r}`);return n.ok?JSON.parse(await n.text()):null}}class m extends e.Plugin{static get pluginName(){return"MediaImageTextAlternativeEditing"}init(){this.editor.commands.add("mediaImageTextAlternative",new c(this.editor))}}function h(e){const t=e.editing.view,i=s.BalloonPanelView.defaultPositions;return{target:t.domConverter.viewToDom(t.document.selection.getSelectedElement()),positions:[i.northArrowSouth,i.northArrowSouthWest,i.northArrowSouthEast,i.southArrowNorth,i.southArrowNorthWest,i.southArrowNorthEast]}}var p=i("ckeditor5/src/utils.js");class f extends s.View{constructor(t){super(t);const i=this.locale.t;this.focusTracker=new p.FocusTracker,this.keystrokes=new p.KeystrokeHandler,this.labeledInput=this._createLabeledInputView(),this.saveButtonView=this._createButton(i("Save"),e.icons.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(i("Cancel"),e.icons.cancel,"ck-button-cancel","cancel"),this._focusables=new s.ViewCollection,this._focusCycler=new s.FocusCycler({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","ck-responsive-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]}),(0,s.injectCssTransitionDisabler)(this)}render(){super.render(),this.keystrokes.listenTo(this.element),(0,s.submitHandler)({view:this}),[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach((e=>{this._focusables.add(e),this.focusTracker.add(e.element)}))}_createButton(e,t,i,r){const n=new s.ButtonView(this.locale);return n.set({label:e,icon:t,tooltip:!0}),n.extendTemplate({attributes:{class:i}}),r&&n.delegate("execute").to(this,r),n}_createLabeledInputView(){const e=this.locale.t,t=new s.LabeledFieldView(this.locale,s.createLabeledInputText);return t.label=e("Override text alternative"),t}}class g extends e.Plugin{static get requires(){return[s.ContextualBalloon]}static get pluginName(){return"MediaImageTextAlternativeUi"}init(){this._createButton(),this._createForm()}destroy(){super.destroy(),this._form.destroy()}_createButton(){const t=this.editor,i=t.t;t.ui.componentFactory.add("mediaImageTextAlternative",(r=>{const n=t.commands.get("mediaImageTextAlternative"),a=new s.ButtonView(r);return a.set({label:i("Override media image text alternative"),icon:e.icons.lowVision,tooltip:!0}),a.bind("isVisible").to(n,"isEnabled"),this.listenTo(a,"execute",(()=>{this._showForm()})),a}))}_createForm(){const e=this.editor,t=e.editing.view.document;this._balloon=this.editor.plugins.get("ContextualBalloon"),this._form=new f(e.locale),this._form.render(),this.listenTo(this._form,"submit",(()=>{e.execute("mediaImageTextAlternative",{newValue:this._form.labeledInput.fieldView.element.value}),this._hideForm(!0)})),this.listenTo(this._form,"cancel",(()=>{this._hideForm(!0)})),this._form.keystrokes.set("Esc",((e,t)=>{this._hideForm(!0),t()})),this.listenTo(e.ui,"update",(()=>{d(t.selection)?this._isVisible&&function(e){const t=e.plugins.get("ContextualBalloon");if(d(e.editing.view.document.selection)){const i=h(e);t.updatePosition(i)}}(e):this._hideForm(!0)})),(0,s.clickOutsideHandler)({emitter:this._form,activator:()=>this._isVisible,contextElements:[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible)return;const e=this.editor,t=e.commands.get("mediaImageTextAlternative"),i=this._form.labeledInput;this._form.disableCssTransitions(),this._isInBalloon||this._balloon.add({view:this._form,position:h(e)}),i.fieldView.element.value=t.value||"",i.fieldView.value=i.fieldView.element.value,this._form.labeledInput.fieldView.select(),this._form.enableCssTransitions()}_hideForm(e){this._isInBalloon&&(this._form.focusTracker.isFocused&&this._form.saveButtonView.focus(),this._balloon.remove(this._form),e&&this.editor.editing.view.focus())}get _isVisible(){return this._balloon.visibleView===this._form}get _isInBalloon(){return this._balloon.hasView(this._form)}}class b extends e.Plugin{static get requires(){return[m,g]}static get pluginName(){return"MediaImageTextAlternative"}}function w(e,t,i){if(t.attributes)for(const[r,n]of Object.entries(t.attributes))e.setAttribute(r,n,i);t.styles&&e.setStyle(t.styles,i),t.classes&&e.addClass(t.classes,i)}function v(e){return t=>{t.on("element:drupal-media",((t,i,r)=>{const n=i.viewItem.parent;n.is("element","a")&&function(t,n){const a=e._consumeAllowedAttributes(t,r);a&&r.writer.setAttribute(n,a,i.modelRange)}(n,"htmlLinkAttributes")}),{priority:"low"})}}class M extends e.Plugin{init(){const{editor:e}=this;if(!e.plugins.has("GeneralHtmlSupport"))return;const{schema:t}=e.model,{conversion:i}=e,r=e.plugins.get("DataFilter");t.extend("drupalMedia",{allowAttributes:["htmlLinkAttributes"]}),i.for("upcast").add(v(r)),i.for("editingDowncast").add((e=>e.on("attribute:linkHref:drupalMedia",((e,t,i)=>{if(!i.consumable.consume(t.item,"attribute:htmlLinkAttributes:drupalMedia"))return;const r=i.mapper.toViewElement(t.item),n=function(e,t,i){const r=e.createRangeOn(t);for(const{item:e}of r.getWalker())if(e.is("element",i))return e}(i.writer,r,"a");w(i.writer,t.item.getAttribute("htmlLinkAttributes"),n)}),{priority:"low"}))),i.for("dataDowncast").add((e=>e.on("attribute:linkHref:drupalMedia",((e,t,i)=>{if(!i.consumable.consume(t.item,"attribute:htmlLinkAttributes:drupalMedia"))return;const r=i.mapper.toViewElement(t.item).parent;w(i.writer,t.item.getAttribute("htmlLinkAttributes"),r)}),{priority:"low"})))}static get pluginName(){return"DrupalMediaGeneralHtmlSupport"}}class k extends e.Plugin{static get requires(){return[a,M,o,u,b]}}function _(){return e=>{e.on("element:a",((e,t,i)=>{const r=t.viewItem,n=(a=r,Array.from(a.getChildren()).find((e=>"drupal-media"===e.name)));var a;if(!n)return;if(!i.consumable.consume(r,{attributes:["href"]}))return;const s=r.getAttribute("href");if(!s)return;const o=i.convertItem(n,t.modelCursor);t.modelRange=o.modelRange,t.modelCursor=o.modelCursor;const l=t.modelCursor.nodeBefore;l&&l.is("element","drupalMedia")&&i.writer.setAttribute("linkHref",s,l)}),{priority:"high"})}}class A extends e.Plugin{static get requires(){return["LinkEditing","DrupalMediaEditing"]}static get pluginName(){return"DrupalLinkMediaEditing"}init(){const{editor:e}=this;e.model.schema.extend("drupalMedia",{allowAttributes:["linkHref"]}),e.conversion.for("upcast").add(_()),e.conversion.for("editingDowncast").add((e=>{e.on("attribute:linkHref:drupalMedia",((e,t,i)=>{const{writer:r}=i;if(!i.consumable.consume(t.item,e.name))return;const n=i.mapper.toViewElement(t.item),a=Array.from(n.getChildren()).find((e=>"a"===e.name));if(a)t.attributeNewValue?r.setAttribute("href",t.attributeNewValue,a):(r.move(r.createRangeIn(a),r.createPositionAt(n,0)),r.remove(a));else{const e=Array.from(n.getChildren()).find((e=>e.getAttribute("data-drupal-media-preview"))),i=r.createContainerElement("a",{href:t.attributeNewValue});r.insert(r.createPositionAt(n,0),i),r.move(r.createRangeOn(e),r.createPositionAt(i,0))}}),{priority:"high"})})),e.conversion.for("dataDowncast").add((e=>{e.on("attribute:linkHref:drupalMedia",((e,t,i)=>{const{writer:r}=i;if(!i.consumable.consume(t.item,e.name))return;const n=i.mapper.toViewElement(t.item),a=r.createContainerElement("a",{href:t.attributeNewValue});r.insert(r.createPositionBefore(n),a),r.move(r.createRangeOn(n),r.createPositionAt(a,0))}),{priority:"high"})}))}}class x extends e.Plugin{static get requires(){return["LinkEditing","LinkUI","DrupalMediaEditing"]}static get pluginName(){return"DrupalLinkMediaUi"}init(){const{editor:e}=this,t=e.editing.view.document;this.listenTo(t,"click",((t,i)=>{this._isSelectedLinkedMedia(e.model.document.selection)&&(i.preventDefault(),t.stop())}),{priority:"high"}),this._createToolbarLinkMediaButton()}_createToolbarLinkMediaButton(){const{editor:e}=this,{t:t}=e;e.ui.componentFactory.add("drupalLinkMedia",(i=>{const r=new s.ButtonView(i),n=e.plugins.get("LinkUI"),a=e.commands.get("link");return r.set({isEnabled:!0,label:t("Link media"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.077 15 .991-1.416a.75.75 0 1 1 1.229.86l-1.148 1.64a.748.748 0 0 1-.217.206 5.251 5.251 0 0 1-8.503-5.955.741.741 0 0 1 .12-.274l1.147-1.639a.75.75 0 1 1 1.228.86L4.933 10.7l.006.003a3.75 3.75 0 0 0 6.132 4.294l.006.004zm5.494-5.335a.748.748 0 0 1-.12.274l-1.147 1.639a.75.75 0 1 1-1.228-.86l.86-1.23a3.75 3.75 0 0 0-6.144-4.301l-.86 1.229a.75.75 0 0 1-1.229-.86l1.148-1.64a.748.748 0 0 1 .217-.206 5.251 5.251 0 0 1 8.503 5.955zm-4.563-2.532a.75.75 0 0 1 .184 1.045l-3.155 4.505a.75.75 0 1 1-1.229-.86l3.155-4.506a.75.75 0 0 1 1.045-.184z"/></svg>\n',keystroke:"Ctrl+K",tooltip:!0,isToggleable:!0}),r.bind("isEnabled").to(a,"isEnabled"),r.bind("isOn").to(a,"value",(e=>!!e)),this.listenTo(r,"execute",(()=>{this._isSelectedLinkedMedia(e.model.document.selection)?n._addActionsView():n._showUI(!0)})),r}))}_isSelectedLinkedMedia(e){const t=e.getSelectedElement();return!!t&&t.is("element","drupalMedia")&&t.hasAttribute("linkHref")}}class E extends e.Plugin{static get requires(){return[A,x]}static get pluginName(){return"DrupalLinkMedia"}}var y={DrupalMedia:k,MediaImageTextAlternative:b,MediaImageTextAlternativeEditing:m,MediaImageTextAlternativeUi:g,DrupalLinkMedia:E}}(),r=r.default}()}));
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/ckeditor5.admin.es6.js b/core/modules/ckeditor5/js/ckeditor5.admin.es6.js
new file mode 100644
index 0000000000000000000000000000000000000000..f40f4b0e96de4a64a5e348d0214ae5d52f43611a
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5.admin.es6.js
@@ -0,0 +1,1025 @@
+/**
+ * @file
+ * Provides admin UI for the CKEditor 5.
+ */
+
+((Drupal, drupalSettings, $, JSON, once, Sortable) => {
+  const toolbarHelp = [
+    {
+      message: Drupal.t(
+        "The toolbar buttons that don't fit the user's browser window width will be grouped in a dropdown. If multiple toolbar rows are preferred, those can be configured by adding an explicit wrapping breakpoint wherever you want to start a new row.",
+        null,
+        {
+          context:
+            'CKEditor 5 toolbar help text, default, no explicit wrapping breakpoint',
+        },
+      ),
+      button: 'wrapping',
+      condition: false,
+    },
+    {
+      message: Drupal.t(
+        'You have configured a multi-row toolbar by using an explicit wrapping breakpoint. This may not work well in narrow browser windows. To use automatic grouping, remove any of these divider buttons.',
+        null,
+        {
+          context:
+            'CKEditor 5 toolbar help text, with explicit wrapping breakpoint',
+        },
+      ),
+      button: 'wrapping',
+      condition: true,
+    },
+  ];
+
+  /**
+   * Allows attaching listeners to a value.
+   *
+   * @type {Observable}
+   */
+  const Observable = class {
+    /**
+     * Creates new Observable with a value.
+     *
+     * @param {*} value
+     *   The value to be observed.
+     */
+    constructor(value) {
+      this._listeners = [];
+      this._value = value;
+    }
+
+    /**
+     * Notifies subscribers about new value.
+     */
+    notify() {
+      this._listeners.forEach((listener) => listener(this._value));
+    }
+
+    /**
+     * Subscribes to be notified for changes.
+     *
+     * @param {Function} listener
+     *   The function to be called when a new value is set.
+     */
+    subscribe(listener) {
+      this._listeners.push(listener);
+    }
+
+    /**
+     * The value of the observable.
+     *
+     * @return {*}
+     *   The current value.
+     */
+    get value() {
+      return this._value;
+    }
+
+    /**
+     * Sets the value of the observable and notifies subscribers.
+     *
+     * @param {*} val
+     *   The new value of the observable.
+     */
+    set value(val) {
+      if (val !== this._value) {
+        this._value = val;
+        this.notify();
+      }
+    }
+  };
+
+  /**
+   * Gets selected buttons.
+   *
+   * @param {Array} selected
+   *   The selected buttons retrieved from state.
+   * @param {Array} dividers
+   *   The available dividers.
+   * @param {Array} available
+   *   The available buttons.
+   * @return {Array}
+   *   An array containing selected buttons.
+   */
+  const getSelectedButtons = (selected, dividers, available) => {
+    return selected.map((id) => ({
+      ...[...dividers, ...available].find((button) => button.id === id),
+    }));
+  };
+
+  /**
+   * Updates selected buttons to the textarea.
+   *
+   * @param {Array} selection
+   *   The current selection.
+   * @param {Element} textarea
+   *   The textarea element.
+   */
+  const updateSelectedButtons = (selection, textarea) => {
+    const newValue = JSON.stringify(selection);
+
+    const priorValue = textarea.innerHTML;
+    textarea.value = newValue;
+    textarea.innerHTML = newValue;
+
+    // The textarea is programmatically updated, so no native JavaScript
+    // event is triggered. Event listeners need to be aware of this config
+    // update, so a custom event is dispatched immediately after the
+    // config update.
+    textarea.dispatchEvent(
+      new CustomEvent('change', {
+        detail: {
+          priorValue,
+        },
+      }),
+    );
+  };
+
+  /**
+   * Function to add button to selected buttons.
+   *
+   * @param {Observable} selection
+   *   The currently selected buttons.
+   * @param {Element} element
+   *   The element which is being added.
+   * @param {function} announceChange
+   *   Function to call to announce the change.
+   */
+  const addToSelectedButtons = (selection, element, announceChange) => {
+    const list = [...selection.value];
+    list.push(element.dataset.id);
+    selection.value = list;
+
+    if (announceChange) {
+      setTimeout(() => {
+        announceChange(element.dataset.label);
+      });
+    }
+  };
+
+  /**
+   * Function to remove button from selected buttons.
+   *
+   * @param {Observable} selection
+   *   The currently selected buttons.
+   * @param {Element} element
+   *   The element which is being removed.
+   * @param {function} announceChange
+   *   Function to call to announce the change.
+   */
+  const removeFromSelectedButtons = (selection, element, announceChange) => {
+    const list = [...selection.value];
+    const index = Array.from(element.parentElement.children).findIndex(
+      (child) => {
+        return child === element;
+      },
+    );
+    list.splice(index, 1);
+    selection.value = list;
+
+    if (announceChange) {
+      setTimeout(() => {
+        announceChange(element.dataset.label);
+      });
+    }
+  };
+
+  /**
+   * Moves element within active buttons.
+   *
+   * @param {Observable} selection
+   *   The currently selected buttons.
+   * @param {Element} element
+   *   The element being moved.
+   * @param {Number} dir
+   *   The direction which the element is being moved.
+   */
+  const moveWithinSelectedButtons = (selection, element, dir) => {
+    const list = [...selection.value];
+    const index = Array.from(element.parentElement.children).findIndex(
+      (child) => {
+        return child === element;
+      },
+    );
+    // If moving up, check it is not the first, else check it is not the last.
+    const condition = dir < 0 ? index > 0 : index < list.length - 1;
+    if (condition) {
+      list.splice(index + dir, 0, list.splice(index, 1)[0]);
+      selection.value = list;
+    }
+  };
+
+  /**
+   * Copies element to active buttons.
+   *
+   * @param {Observable} selection
+   *   The currently selected buttons.
+   * @param {Element} element
+   *   The element to be copied.
+   * @param {Function} announceChange
+   *   A function to call to announce the change.
+   */
+  const copyToActiveButtons = (selection, element, announceChange) => {
+    const list = [...selection.value];
+    list.push(element.dataset.id);
+    selection.value = list;
+
+    setTimeout(() => {
+      if (announceChange) {
+        announceChange(element.dataset.label);
+      }
+    });
+  };
+
+  /**
+   * Renders the CKEditor 5 button admin UI.
+   *
+   * @param {Element} root
+   *   The element where the admin UI should be rendered.
+   * @param {Observable} selectedButtons
+   *   An Observable object containing selected buttons.
+   * @param {Array} availableButtons
+   *   An array containing available buttons.
+   * @param {Array} dividerButtons
+   *   An array containing available divider buttons.
+   */
+  const render = (root, selectedButtons, availableButtons, dividerButtons) => {
+    const toolbarHelpText = toolbarHelp
+      .filter(
+        (helpItem) =>
+          selectedButtons.value.includes(helpItem.button) ===
+          helpItem.condition,
+      )
+      .map((helpItem) => helpItem.message);
+    root.innerHTML = Drupal.theme.ckeditor5Admin({
+      availableButtons: Drupal.theme.ckeditor5AvailableButtons({
+        buttons: availableButtons.filter(
+          (button) => !selectedButtons.value.includes(button.id),
+        ),
+      }),
+      dividerButtons: Drupal.theme.ckeditor5DividerButtons({
+        buttons: dividerButtons,
+      }),
+      activeToolbar: Drupal.theme.ckeditor5SelectedButtons({
+        buttons: getSelectedButtons(
+          selectedButtons.value,
+          dividerButtons,
+          availableButtons,
+        ),
+      }),
+      helpMessage: toolbarHelpText,
+    });
+
+    // Create sortable groups for available buttons, current toolbar items,
+    // and dividers.
+    new Sortable(
+      root.querySelector(
+        '[data-button-list="ckeditor5-toolbar-active-buttons"]',
+      ),
+      {
+        group: { name: 'toolbar', put: ['divider', 'available'] },
+        sort: true,
+        store: {
+          set: (sortable) => {
+            selectedButtons.value = sortable.toArray();
+          },
+        },
+      },
+    );
+    const toolbarAvailableButtons = new Sortable(
+      root.querySelector(
+        '[data-button-list="ckeditor5-toolbar-available-buttons"]',
+      ),
+      {
+        group: { name: 'available', put: ['toolbar'] },
+        sort: false,
+        onAdd: (event) => {
+          // If the moved item is a divider, it should not be added to
+          // the available buttons list.
+          if (
+            dividerButtons.find(
+              (dividerButton) => dividerButton.id === event.item.dataset.id,
+            )
+          ) {
+            const { newIndex } = event;
+            setTimeout(() => {
+              // Remove the divider button from the available buttons
+              // list. Draggable reassesses the lists during each drag
+              // event, so the DOM removal should not be disruptive.
+              document
+                .querySelectorAll('.ckeditor5-toolbar-available__buttons li')
+                [newIndex].remove();
+            });
+          }
+        },
+      },
+    );
+    new Sortable(
+      root.querySelector(
+        '[data-button-list="ckeditor5-toolbar-divider-buttons"]',
+      ),
+      {
+        group: { name: 'divider', put: false, pull: 'clone', sort: 'false' },
+      },
+    );
+
+    root
+      .querySelectorAll('[data-drupal-selector="ckeditor5-toolbar-button"]')
+      .forEach((element) => {
+        const expandButton = (event) => {
+          event.currentTarget
+            .querySelectorAll('.ckeditor5-toolbar-button')
+            .forEach((buttonElement) => {
+              buttonElement.setAttribute('data-expanded', true);
+            });
+        };
+        const retractButton = (event) => {
+          event.currentTarget
+            .querySelectorAll('.ckeditor5-toolbar-button')
+            .forEach((buttonElement) => {
+              buttonElement.setAttribute('data-expanded', false);
+            });
+        };
+        element.addEventListener('mouseenter', expandButton);
+        element.addEventListener('focus', expandButton);
+        element.addEventListener('mouseleave', retractButton);
+        element.addEventListener('blur', retractButton);
+
+        element.addEventListener('keyup', (event) => {
+          // Keys supported by the admin UI. Depending on the element that is
+          // triggering the event, the event could trigger changes in the state.
+          // Changes to the state trigger re-rendering of the admin UI, which
+          // means that for consistent navigation, each action modifying state
+          // needs to set focus back on the button that is being moved. The state
+          // change also triggers an AJAX request which re-renders parts of the
+          // form, and moves the focus to the triggering form element, meaning
+          // that focus needs to be set back on the button again.
+          const supportedKeys = [
+            'ArrowLeft',
+            'ArrowRight',
+            'ArrowUp',
+            'ArrowDown',
+          ];
+          const dir = document.documentElement.dir;
+          if (supportedKeys.includes(event.key)) {
+            if (event.currentTarget.dataset.divider.toLowerCase() === 'true') {
+              switch (event.key) {
+                case 'ArrowDown': {
+                  const announceChange = (name) => {
+                    Drupal.announce(
+                      Drupal.t(
+                        'Button @name has been copied to the active toolbar.',
+                        { '@name': name },
+                      ),
+                    );
+                  };
+                  copyToActiveButtons(
+                    selectedButtons,
+                    event.currentTarget,
+                    announceChange,
+                  );
+                  // Focus the last button since new button is always added to the
+                  // end of the list.
+                  root
+                    .querySelector(
+                      '[data-button-list="ckeditor5-toolbar-active-buttons"] li:last-child',
+                    )
+                    .focus();
+                  break;
+                }
+              }
+            } else if (
+              selectedButtons.value.includes(event.currentTarget.dataset.id)
+            ) {
+              const index = Array.from(
+                element.parentElement.children,
+              ).findIndex((child) => {
+                return child === element;
+              });
+              switch (event.key) {
+                case 'ArrowLeft': {
+                  const leftOffset = dir === 'ltr' ? -1 : 1;
+                  moveWithinSelectedButtons(
+                    selectedButtons,
+                    event.currentTarget,
+                    leftOffset,
+                  );
+                  // Move focus to left or right from the current index depending
+                  // on current language direction. Use index instead of the
+                  // data-id because dividers don't have a unique ID.
+                  root
+                    .querySelectorAll(
+                      '[data-button-list="ckeditor5-toolbar-active-buttons"] li',
+                    )
+                    [index + leftOffset].focus();
+                  break;
+                }
+                case 'ArrowRight': {
+                  const rightOffset = dir === 'ltr' ? 1 : -1;
+                  moveWithinSelectedButtons(
+                    selectedButtons,
+                    event.currentTarget,
+                    rightOffset,
+                  );
+                  // Move focus to right or left from the current index depending
+                  // on current language direction. Use index instead of the
+                  // data-id because dividers don't have a unique ID.
+                  root
+                    .querySelectorAll(
+                      '[data-button-list="ckeditor5-toolbar-active-buttons"] li',
+                    )
+                    [index + rightOffset].focus();
+                  break;
+                }
+                case 'ArrowUp': {
+                  const announceChange = (name) => {
+                    Drupal.announce(
+                      Drupal.t(
+                        'Button @name has been removed from the active toolbar.',
+                        { '@name': name },
+                      ),
+                    );
+                  };
+                  removeFromSelectedButtons(
+                    selectedButtons,
+                    event.currentTarget,
+                    announceChange,
+                  );
+                  // Focus only if the button wasn't a divider because dividers
+                  // are simply removed from the active buttons instead of moving
+                  // to another list.
+                  if (
+                    !dividerButtons.find(
+                      (dividerButton) =>
+                        event.currentTarget.dataset.id === dividerButton.id,
+                    )
+                  ) {
+                    // Focus button based on the data-id attribute from the
+                    // available buttons list.
+                    root
+                      .querySelector(
+                        `[data-button-list="ckeditor5-toolbar-available-buttons"] [data-id="${event.currentTarget.dataset.id}"]`,
+                      )
+                      .focus();
+                  }
+                  break;
+                }
+              }
+            } else if (
+              toolbarAvailableButtons
+                .toArray()
+                .includes(event.currentTarget.dataset.id)
+            ) {
+              switch (event.key) {
+                case 'ArrowDown': {
+                  const announceChange = (name) => {
+                    Drupal.announce(
+                      Drupal.t(
+                        'Button @name has been moved to the active toolbar.',
+                        { '@name': name },
+                      ),
+                    );
+                  };
+                  addToSelectedButtons(
+                    selectedButtons,
+                    event.currentTarget,
+                    announceChange,
+                  );
+                  // Focus the last button since new button is always added to the
+                  // end of the list.
+                  root
+                    .querySelector(
+                      '[data-button-list="ckeditor5-toolbar-active-buttons"] li:last-child',
+                    )
+                    .focus();
+                  break;
+                }
+              }
+            }
+          }
+        });
+      });
+  };
+
+  /**
+   * Attach CKEditor 5 admin UI.
+   *
+   * @type {Drupal~behavior}
+   *
+   * @prop {Drupal~behaviorAttach} attach
+   *   Attaches admin app to edit the CKEditor 5 toolbar.
+   * @prop {Drupal~behaviorDetach} detach
+   *   Detaches admin app from the CKEditor 5 configuration form on 'unload'.
+   */
+  Drupal.behaviors.ckeditor5Admin = {
+    attach(context) {
+      once('ckeditor5-admin-toolbar', '#ckeditor5-toolbar-app').forEach(
+        (container) => {
+          const selectedTextarea = context.querySelector(
+            '#ckeditor5-toolbar-buttons-selected',
+          );
+          const available = Object.entries(
+            JSON.parse(
+              context.querySelector('#ckeditor5-toolbar-buttons-available')
+                .innerHTML,
+            ),
+          ).map(([name, attrs]) => ({ name, id: name, ...attrs }));
+          const dividers = [
+            {
+              id: 'divider',
+              name: '|',
+              label: Drupal.t('Divider'),
+            },
+            {
+              id: 'wrapping',
+              name: '-',
+              label: Drupal.t('Wrapping'),
+            },
+          ];
+
+          // Selected is used for managing the state. Sortable is handling updates
+          // to the state when the system is operated by mouse. There are
+          // functions making direct modifications to the state when system is
+          // operated by keyboard.
+          const selected = new Observable(
+            JSON.parse(selectedTextarea.innerHTML).map((name) => {
+              return [...dividers, ...available].find((button) => {
+                return button.name === name;
+              }).id;
+            }),
+          );
+
+          const mapSelection = (selection) => {
+            return selection.map((id) => {
+              return [...dividers, ...available].find((button) => {
+                return button.id === id;
+              }).name;
+            });
+          };
+          // Whenever the state is changed, update the textarea with the changes.
+          // This will also trigger re-render of the admin UI to reinitialize the
+          // Sortable state.
+          selected.subscribe((selection) => {
+            updateSelectedButtons(mapSelection(selection), selectedTextarea);
+            render(container, selected, available, dividers);
+          });
+
+          [
+            context.querySelector('#ckeditor5-toolbar-buttons-available'),
+            context.querySelector('[class*="editor-settings-toolbar-items"]'),
+          ]
+            .filter((el) => el)
+            .forEach((el) => {
+              el.classList.add('visually-hidden');
+            });
+
+          render(container, selected, available, dividers);
+        },
+      );
+      // Safari's focus outlines take into account absolute positioned elements.
+      // When a toolbar option is blurred, the portion of the focus outline
+      // surrounding the absolutely positioned tooltip does not go away. To
+      // prevent keyboard navigation users from seeing outline artifacts for
+      // every option they've tabbed through, we provide a keydown listener
+      // that can catch blur-causing events before the blur happens. If the
+      // tooltip is hidden before the blur event, the outline will disappear
+      // correctly.
+      once(
+        'safari-focus-fix',
+        document.querySelectorAll('.ckeditor5-toolbar-item'),
+      ).forEach((item) => {
+        item.addEventListener('keydown', (e) => {
+          const keyCodeDirections = {
+            9: 'tab',
+            37: 'left',
+            38: 'up',
+            39: 'right',
+            40: 'down',
+          };
+          if (
+            ['tab', 'left', 'up', 'right', 'down'].includes(
+              keyCodeDirections[e.keyCode],
+            )
+          ) {
+            let hideTip = false;
+            const isActive = e.target.closest(
+              '[data-button-list="ckeditor5-toolbar-active__buttons"]',
+            );
+            if (isActive) {
+              if (
+                ['tab', 'left', 'up', 'right'].includes(
+                  keyCodeDirections[e.keyCode],
+                )
+              ) {
+                hideTip = true;
+              }
+            } else if (['tab', 'down'].includes(keyCodeDirections[e.keyCode])) {
+              hideTip = true;
+            }
+            if (hideTip) {
+              e.target
+                .querySelector('[data-expanded]')
+                .setAttribute('data-expanded', 'false');
+            }
+          }
+        });
+      });
+
+      /**
+       * Updates the UI state info in the form's 'data-drupal-ui-state' attribute.
+       *
+       * @param {object} states
+       *   An object with one or more items with the structure { ui-property: stored-value }
+       */
+      const updateUiStateStorage = (states) => {
+        const form = document.querySelector(
+          '#filter-format-edit-form, #filter-format-add-form',
+        );
+
+        // Get the current stored UI state as an object.
+        const currentStates = form.hasAttribute('data-drupal-ui-state')
+          ? JSON.parse(form.getAttribute('data-drupal-ui-state'))
+          : {};
+
+        // Store the updated UI state object as an object literal in the parent
+        // form's 'data-drupal-ui-state' attribute.
+        form.setAttribute(
+          'data-drupal-ui-state',
+          JSON.stringify({ ...currentStates, ...states }),
+        );
+      };
+
+      /**
+       * Gets a stored UI state property.
+       *
+       * @param {string} property
+       *   The UI state property to retrieve the value of.
+       *
+       * @return {string|null}
+       *   When present, the stored value of the property.
+       */
+      const getUiStateStorage = (property) => {
+        const form = document.querySelector(
+          '#filter-format-edit-form, #filter-format-add-form',
+        );
+
+        if (form === null) {
+          return;
+        }
+
+        // Parse the object literal stored in the form's 'data-drupal-ui-state'
+        // attribute and return the value of the object property that matches
+        // the 'property' argument.
+        return form.hasAttribute('data-drupal-ui-state')
+          ? JSON.parse(form.getAttribute('data-drupal-ui-state'))[property]
+          : null;
+      };
+
+      // Add an attribute to the parent form for storing UI states, so this
+      // information can be retrieved after AJAX rebuilds.
+      once(
+        'ui-state-storage',
+        document.querySelector(
+          '#filter-format-edit-form, #filter-format-add-form',
+        ),
+      ).forEach((form) => {
+        form.setAttribute('data-drupal-ui-state', JSON.stringify({}));
+      });
+
+      /**
+       * Maintains the active vertical tab after AJAX rebuild.
+       *
+       * @param {Element} verticalTabs
+       *   The vertical tabs element.
+       */
+      const maintainActiveVerticalTab = (verticalTabs) => {
+        const id = verticalTabs.id;
+
+        // If the UI state storage has an active tab, click that tab.
+        const activeTab = getUiStateStorage(`${id}-active-tab`);
+        if (activeTab) {
+          setTimeout(() => {
+            document.querySelector(activeTab).click();
+          });
+        }
+
+        // Add click listener that adds any tab click into UI storage.
+        verticalTabs.querySelectorAll('.vertical-tabs__menu').forEach((tab) => {
+          tab.addEventListener('click', (e) => {
+            const state = {};
+            const href = e.target
+              .closest('[href]')
+              .getAttribute('href')
+              .split('--')[0];
+            state[`${id}-active-tab`] = `#${id} [href^='${href}']`;
+            updateUiStateStorage(state);
+          });
+        });
+      };
+
+      once(
+        'plugin-settings',
+        document.querySelector('#plugin-settings-wrapper'),
+      ).forEach(maintainActiveVerticalTab);
+      once(
+        'filter-settings',
+        document.querySelector('#filter-settings-wrapper'),
+      ).forEach(maintainActiveVerticalTab);
+
+      // Add listeners to maintain focus after AJAX rebuilds.
+      const selectedButtons = document.querySelector(
+        '#ckeditor5-toolbar-buttons-selected',
+      );
+
+      once('textarea-listener', selectedButtons).forEach((textarea) => {
+        textarea.addEventListener('change', (e) => {
+          const buttonName = document.activeElement.getAttribute('data-id');
+          if (!buttonName) {
+            // If there is no 'data-id' attribute, then the config
+            // is happening via mouse.
+            return;
+          }
+          let focusSelector = '';
+
+          // Divider elements are treated differently as there can be multiple
+          // elements with the same button name.
+          if (['divider', 'wrapping'].includes(buttonName)) {
+            const oldConfig = JSON.parse(e.detail.priorValue);
+            const newConfig = JSON.parse(e.target.innerHTML);
+
+            // If the divider is being removed from active buttons, it does not
+            // 'move' anywhere. Move focus to the prior active button
+            if (oldConfig.length > newConfig.length) {
+              for (let item = 0; item < newConfig.length; item++) {
+                if (newConfig[item] !== oldConfig[item]) {
+                  focusSelector = `[data-button-list="ckeditor5-toolbar-active-buttons"] li:nth-child(${Math.min(
+                    item - 1,
+                    0,
+                  )})`;
+                  break;
+                }
+              }
+            } else if (oldConfig.length < newConfig.length) {
+              // If the divider is being added, it will be the last active item.
+              focusSelector =
+                '[data-button-list="ckeditor5-toolbar-active-buttons"] li:last-child';
+            } else {
+              // When moving a dividers position within the active buttons.
+              document
+                .querySelectorAll(
+                  `[data-button-list="ckeditor5-toolbar-active-buttons"] [data-id='${buttonName}']`,
+                )
+                .forEach((divider, index) => {
+                  if (divider === document.activeElement) {
+                    focusSelector = `${buttonName}|${index}`;
+                  }
+                });
+            }
+          } else {
+            focusSelector = `[data-id='${buttonName}']`;
+          }
+
+          // Store the focus selector in an attribute on the form itself, which
+          // will not be overwritten after the AJAX rebuild. This makes it
+          // the value available to the textarea focus listener that is
+          // triggered after the AJAX rebuild.
+          updateUiStateStorage({ focusSelector });
+        });
+
+        textarea.addEventListener('focus', () => {
+          // The selector that should receive focus is stored in the parent
+          // form element. Move focus to that selector.
+          const focusSelector = getUiStateStorage('focusSelector');
+
+          if (focusSelector) {
+            // If focusSelector includes '|', it is a separator that is being
+            // moved within the active button list. Different logic us used to
+            // determine focus since there can be multiple separators of the
+            // same type within the active buttons list.
+            if (focusSelector.includes('|')) {
+              const [buttonName, count] = focusSelector.split('|');
+              document
+                .querySelectorAll(
+                  `[data-button-list="ckeditor5-toolbar-active-buttons"] [data-id='${buttonName}']`,
+                )
+                .forEach((item, index) => {
+                  if (index === parseInt(count, 10)) {
+                    item.focus();
+                  }
+                });
+            } else {
+              const toFocus = document.querySelector(focusSelector);
+              if (toFocus) {
+                toFocus.focus();
+              }
+            }
+          }
+        });
+      });
+    },
+  };
+
+  /**
+   * Theme function for CKEditor 5 selected buttons.
+   *
+   * @param {Object} options
+   *   An object containing options.
+   * @param {Array} options.buttons
+   *   An array of selected buttons.
+   * @return {string}
+   *   The selected buttons markup.
+   *
+   * @internal
+   */
+  Drupal.theme.ckeditor5SelectedButtons = ({ buttons }) => {
+    return `
+      <ul class="ckeditor5-toolbar-tray ckeditor5-toolbar-active__buttons" data-button-list="ckeditor5-toolbar-active-buttons" role="listbox" aria-orientation="horizontal" aria-labelledby="ckeditor5-toolbar-active-buttons-label">
+        ${buttons
+          .map((button) =>
+            Drupal.theme.ckeditor5Button({ button, listType: 'active' }),
+          )
+          .join('')}
+      </ul>
+    `;
+  };
+
+  /**
+   * Theme function for CKEditor 5 divider buttons.
+   *
+   * @param {Object} options
+   *   An object containing options.
+   * @param {Array} options.buttons
+   *   An array of divider buttons.
+   * @return {string}
+   *   The CKEditor 5 divider buttons markup.
+   *
+   * @internal
+   */
+  Drupal.theme.ckeditor5DividerButtons = ({ buttons }) => {
+    return `
+      <ul class="ckeditor5-toolbar-tray ckeditor5-toolbar-divider__buttons" data-button-list="ckeditor5-toolbar-divider-buttons" role="listbox" aria-orientation="horizontal" aria-labelledby="ckeditor5-toolbar-divider-buttons-label">
+        ${buttons
+          .map((button) =>
+            Drupal.theme.ckeditor5Button({ button, listType: 'divider' }),
+          )
+          .join('')}
+      </ul>
+    `;
+  };
+
+  /**
+   * Theme function for CKEditor 5 available buttons.
+   *
+   * @param {Object} options
+   *   An object containing options.
+   * @param {Array} options.buttons
+   *   An array of available buttons.
+   * @return {string}
+   *   The CKEditor 5 available buttons markup.
+   *
+   * @internal
+   */
+  Drupal.theme.ckeditor5AvailableButtons = ({ buttons }) => {
+    return `
+      <ul class="ckeditor5-toolbar-tray ckeditor5-toolbar-available__buttons" data-button-list="ckeditor5-toolbar-available-buttons" role="listbox" aria-orientation="horizontal" aria-labelledby="ckeditor5-toolbar-available-buttons-label">
+        ${buttons
+          .map((button) =>
+            Drupal.theme.ckeditor5Button({ button, listType: 'available' }),
+          )
+          .join('')}
+      </ul>
+    `;
+  };
+
+  /**
+   * Theme function for CKEditor 5 buttons.
+   *
+   * @param {Object} options
+   *  An object containing options.
+   * @param {Object} options.button
+   *   An object containing button options.
+   * @param {String} options.button.label
+   *   Button label.
+   * @param {String} options.button.id
+   *   Button id.
+   * @param {String} options.listType
+   *   The type of the list.
+   * @return {string}
+   *   The CKEditor 5 buttons markup.
+   *
+   * @internal
+   */
+  Drupal.theme.ckeditor5Button = ({ button: { label, id }, listType }) => {
+    const visuallyHiddenLabel = Drupal.t(`@listType button @label`, {
+      '@listType': listType !== 'divider' ? listType : 'available',
+      '@label': label,
+    });
+    return `
+      <li class="ckeditor5-toolbar-item ckeditor5-toolbar-item-${id}" role="option" tabindex="0" data-drupal-selector="ckeditor5-toolbar-button" data-id="${id}" data-label="${label}" data-divider="${
+      listType === 'divider'
+    }">
+        <span class="ckeditor5-toolbar-button ckeditor5-toolbar-button-${id}">
+          <span class="visually-hidden">${visuallyHiddenLabel})}</span>
+        </span>
+        <span class="ckeditor5-toolbar-tooltip" aria-hidden="true">${label}</span>
+      </li>
+    `;
+  };
+
+  /**
+   * Theme function for CKEditor 5 admin UI.
+   *
+   * @param {Object} options
+   *   An object containing options.
+   * @param {String} options.availableButtons
+   *   Markup for available buttons.
+   * @param {String} options.dividerButtons
+   *   Markup for divider buttons.
+   * @param {String} options.activeToolbar
+   *   Markup for active toolbar.
+   * @param {Array} options.helpMessage
+   *   An array of help messages.
+   * @return {string}
+   *   The CKEditor 5 admin UI markup.
+   *
+   * @internal
+   */
+  Drupal.theme.ckeditor5Admin = ({
+    availableButtons,
+    dividerButtons,
+    activeToolbar,
+    helpMessage,
+  }) => {
+    return `
+    <div aria-live="polite" data-drupal-selector="ckeditor5-admin-help-message">
+      <p>${helpMessage.join('</p><p>')}</p>
+    </div>
+    <div class="ckeditor5-toolbar-disabled">
+      <div class="ckeditor5-toolbar-available">
+        <label id="ckeditor5-toolbar-available-buttons-label">${Drupal.t(
+          'Available buttons',
+        )}</label>
+        ${availableButtons}
+      </div>
+      <div class="ckeditor5-toolbar-divider">
+        <label id="ckeditor5-toolbar-divider-buttons-label">${Drupal.t(
+          'Button divider',
+        )}</label>
+        ${dividerButtons}
+      </div>
+    </div>
+    <div class="ckeditor5-toolbar-active">
+      <label id="ckeditor5-toolbar-active-buttons-label">${Drupal.t(
+        'Active toolbar',
+      )}</label>
+      ${activeToolbar}
+    </div>
+    `;
+  };
+
+  // Make a copy of the default filterStatus attach behaviors so it can be
+  // called within this module's override of it.
+  const originalFilterStatusAttach = Drupal.behaviors.filterStatus.attach;
+
+  // Overrides the default filterStatus to provided functionality needs
+  // specific to CKEditor 5.
+  Drupal.behaviors.filterStatus.attach = (context, settings) => {
+    const filterStatusCheckboxes = document.querySelectorAll(
+      '#filters-status-wrapper input.form-checkbox',
+    );
+
+    // CKEditor 5 has uses cases that require updating the filter settings via
+    // AJAX. When this happens, the checkboxes that enable filters must be
+    // reprocessed by the filterStatus behavior. For this to occur:
+    // 1. 'filter-status' must be removed from the element's once registry so
+    //    the process can run again and take into account any filter settings
+    //    elements that have been added or removed from the DOM.
+    //    @see core/assets/vendor/once/once.js
+    once.remove('filter-status', filterStatusCheckboxes);
+
+    // 2. Any listeners to the 'click.filterUpdate' event should be removed so
+    //    they do not conflict with event listeners that are added as part of
+    //    the AJAX refresh.
+    $(filterStatusCheckboxes).off('click.filterUpdate');
+
+    // Call the original behavior.
+    originalFilterStatusAttach(context, settings);
+  };
+
+  // Activates otherwise-inactive tabs that have form elements with validation
+  // errors.
+  // @todo Remove when https://www.drupal.org/project/drupal/issues/2911932 lands.
+  Drupal.behaviors.tabErrorsVisible = {
+    attach(context) {
+      context.querySelectorAll('details .form-item .error').forEach((item) => {
+        const details = item.closest('details');
+        if (details.style.display === 'none') {
+          const tabSelect = document.querySelector(`[href='#${details.id}']`);
+          if (tabSelect) {
+            tabSelect.click();
+          }
+        }
+      });
+    },
+  };
+})(Drupal, drupalSettings, jQuery, JSON, once, Sortable);
diff --git a/core/modules/ckeditor5/js/ckeditor5.admin.js b/core/modules/ckeditor5/js/ckeditor5.admin.js
new file mode 100644
index 0000000000000000000000000000000000000000..1d031035f35e8dc68e1aa4c8459cbaf0e0df1f74
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5.admin.js
@@ -0,0 +1,584 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
+
+function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
+
+function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+
+function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
+
+function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
+
+function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
+
+function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+(function (Drupal, drupalSettings, $, JSON, once, Sortable) {
+  var toolbarHelp = [{
+    message: Drupal.t("The toolbar buttons that don't fit the user's browser window width will be grouped in a dropdown. If multiple toolbar rows are preferred, those can be configured by adding an explicit wrapping breakpoint wherever you want to start a new row.", null, {
+      context: 'CKEditor 5 toolbar help text, default, no explicit wrapping breakpoint'
+    }),
+    button: 'wrapping',
+    condition: false
+  }, {
+    message: Drupal.t('You have configured a multi-row toolbar by using an explicit wrapping breakpoint. This may not work well in narrow browser windows. To use automatic grouping, remove any of these divider buttons.', null, {
+      context: 'CKEditor 5 toolbar help text, with explicit wrapping breakpoint'
+    }),
+    button: 'wrapping',
+    condition: true
+  }];
+
+  var Observable = function () {
+    function Observable(value) {
+      _classCallCheck(this, Observable);
+
+      this._listeners = [];
+      this._value = value;
+    }
+
+    _createClass(Observable, [{
+      key: "notify",
+      value: function notify() {
+        var _this = this;
+
+        this._listeners.forEach(function (listener) {
+          return listener(_this._value);
+        });
+      }
+    }, {
+      key: "subscribe",
+      value: function subscribe(listener) {
+        this._listeners.push(listener);
+      }
+    }, {
+      key: "value",
+      get: function get() {
+        return this._value;
+      },
+      set: function set(val) {
+        if (val !== this._value) {
+          this._value = val;
+          this.notify();
+        }
+      }
+    }]);
+
+    return Observable;
+  }();
+
+  var getSelectedButtons = function getSelectedButtons(selected, dividers, available) {
+    return selected.map(function (id) {
+      return _objectSpread({}, [].concat(_toConsumableArray(dividers), _toConsumableArray(available)).find(function (button) {
+        return button.id === id;
+      }));
+    });
+  };
+
+  var updateSelectedButtons = function updateSelectedButtons(selection, textarea) {
+    var newValue = JSON.stringify(selection);
+    var priorValue = textarea.innerHTML;
+    textarea.value = newValue;
+    textarea.innerHTML = newValue;
+    textarea.dispatchEvent(new CustomEvent('change', {
+      detail: {
+        priorValue: priorValue
+      }
+    }));
+  };
+
+  var addToSelectedButtons = function addToSelectedButtons(selection, element, announceChange) {
+    var list = _toConsumableArray(selection.value);
+
+    list.push(element.dataset.id);
+    selection.value = list;
+
+    if (announceChange) {
+      setTimeout(function () {
+        announceChange(element.dataset.label);
+      });
+    }
+  };
+
+  var removeFromSelectedButtons = function removeFromSelectedButtons(selection, element, announceChange) {
+    var list = _toConsumableArray(selection.value);
+
+    var index = Array.from(element.parentElement.children).findIndex(function (child) {
+      return child === element;
+    });
+    list.splice(index, 1);
+    selection.value = list;
+
+    if (announceChange) {
+      setTimeout(function () {
+        announceChange(element.dataset.label);
+      });
+    }
+  };
+
+  var moveWithinSelectedButtons = function moveWithinSelectedButtons(selection, element, dir) {
+    var list = _toConsumableArray(selection.value);
+
+    var index = Array.from(element.parentElement.children).findIndex(function (child) {
+      return child === element;
+    });
+    var condition = dir < 0 ? index > 0 : index < list.length - 1;
+
+    if (condition) {
+      list.splice(index + dir, 0, list.splice(index, 1)[0]);
+      selection.value = list;
+    }
+  };
+
+  var copyToActiveButtons = function copyToActiveButtons(selection, element, announceChange) {
+    var list = _toConsumableArray(selection.value);
+
+    list.push(element.dataset.id);
+    selection.value = list;
+    setTimeout(function () {
+      if (announceChange) {
+        announceChange(element.dataset.label);
+      }
+    });
+  };
+
+  var render = function render(root, selectedButtons, availableButtons, dividerButtons) {
+    var toolbarHelpText = toolbarHelp.filter(function (helpItem) {
+      return selectedButtons.value.includes(helpItem.button) === helpItem.condition;
+    }).map(function (helpItem) {
+      return helpItem.message;
+    });
+    root.innerHTML = Drupal.theme.ckeditor5Admin({
+      availableButtons: Drupal.theme.ckeditor5AvailableButtons({
+        buttons: availableButtons.filter(function (button) {
+          return !selectedButtons.value.includes(button.id);
+        })
+      }),
+      dividerButtons: Drupal.theme.ckeditor5DividerButtons({
+        buttons: dividerButtons
+      }),
+      activeToolbar: Drupal.theme.ckeditor5SelectedButtons({
+        buttons: getSelectedButtons(selectedButtons.value, dividerButtons, availableButtons)
+      }),
+      helpMessage: toolbarHelpText
+    });
+    new Sortable(root.querySelector('[data-button-list="ckeditor5-toolbar-active-buttons"]'), {
+      group: {
+        name: 'toolbar',
+        put: ['divider', 'available']
+      },
+      sort: true,
+      store: {
+        set: function set(sortable) {
+          selectedButtons.value = sortable.toArray();
+        }
+      }
+    });
+    var toolbarAvailableButtons = new Sortable(root.querySelector('[data-button-list="ckeditor5-toolbar-available-buttons"]'), {
+      group: {
+        name: 'available',
+        put: ['toolbar']
+      },
+      sort: false,
+      onAdd: function onAdd(event) {
+        if (dividerButtons.find(function (dividerButton) {
+          return dividerButton.id === event.item.dataset.id;
+        })) {
+          var newIndex = event.newIndex;
+          setTimeout(function () {
+            document.querySelectorAll('.ckeditor5-toolbar-available__buttons li')[newIndex].remove();
+          });
+        }
+      }
+    });
+    new Sortable(root.querySelector('[data-button-list="ckeditor5-toolbar-divider-buttons"]'), {
+      group: {
+        name: 'divider',
+        put: false,
+        pull: 'clone',
+        sort: 'false'
+      }
+    });
+    root.querySelectorAll('[data-drupal-selector="ckeditor5-toolbar-button"]').forEach(function (element) {
+      var expandButton = function expandButton(event) {
+        event.currentTarget.querySelectorAll('.ckeditor5-toolbar-button').forEach(function (buttonElement) {
+          buttonElement.setAttribute('data-expanded', true);
+        });
+      };
+
+      var retractButton = function retractButton(event) {
+        event.currentTarget.querySelectorAll('.ckeditor5-toolbar-button').forEach(function (buttonElement) {
+          buttonElement.setAttribute('data-expanded', false);
+        });
+      };
+
+      element.addEventListener('mouseenter', expandButton);
+      element.addEventListener('focus', expandButton);
+      element.addEventListener('mouseleave', retractButton);
+      element.addEventListener('blur', retractButton);
+      element.addEventListener('keyup', function (event) {
+        var supportedKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'];
+        var dir = document.documentElement.dir;
+
+        if (supportedKeys.includes(event.key)) {
+          if (event.currentTarget.dataset.divider.toLowerCase() === 'true') {
+            switch (event.key) {
+              case 'ArrowDown':
+                {
+                  var announceChange = function announceChange(name) {
+                    Drupal.announce(Drupal.t('Button @name has been copied to the active toolbar.', {
+                      '@name': name
+                    }));
+                  };
+
+                  copyToActiveButtons(selectedButtons, event.currentTarget, announceChange);
+                  root.querySelector('[data-button-list="ckeditor5-toolbar-active-buttons"] li:last-child').focus();
+                  break;
+                }
+            }
+          } else if (selectedButtons.value.includes(event.currentTarget.dataset.id)) {
+            var index = Array.from(element.parentElement.children).findIndex(function (child) {
+              return child === element;
+            });
+
+            switch (event.key) {
+              case 'ArrowLeft':
+                {
+                  var leftOffset = dir === 'ltr' ? -1 : 1;
+                  moveWithinSelectedButtons(selectedButtons, event.currentTarget, leftOffset);
+                  root.querySelectorAll('[data-button-list="ckeditor5-toolbar-active-buttons"] li')[index + leftOffset].focus();
+                  break;
+                }
+
+              case 'ArrowRight':
+                {
+                  var rightOffset = dir === 'ltr' ? 1 : -1;
+                  moveWithinSelectedButtons(selectedButtons, event.currentTarget, rightOffset);
+                  root.querySelectorAll('[data-button-list="ckeditor5-toolbar-active-buttons"] li')[index + rightOffset].focus();
+                  break;
+                }
+
+              case 'ArrowUp':
+                {
+                  var _announceChange = function _announceChange(name) {
+                    Drupal.announce(Drupal.t('Button @name has been removed from the active toolbar.', {
+                      '@name': name
+                    }));
+                  };
+
+                  removeFromSelectedButtons(selectedButtons, event.currentTarget, _announceChange);
+
+                  if (!dividerButtons.find(function (dividerButton) {
+                    return event.currentTarget.dataset.id === dividerButton.id;
+                  })) {
+                    root.querySelector("[data-button-list=\"ckeditor5-toolbar-available-buttons\"] [data-id=\"".concat(event.currentTarget.dataset.id, "\"]")).focus();
+                  }
+
+                  break;
+                }
+            }
+          } else if (toolbarAvailableButtons.toArray().includes(event.currentTarget.dataset.id)) {
+            switch (event.key) {
+              case 'ArrowDown':
+                {
+                  var _announceChange2 = function _announceChange2(name) {
+                    Drupal.announce(Drupal.t('Button @name has been moved to the active toolbar.', {
+                      '@name': name
+                    }));
+                  };
+
+                  addToSelectedButtons(selectedButtons, event.currentTarget, _announceChange2);
+                  root.querySelector('[data-button-list="ckeditor5-toolbar-active-buttons"] li:last-child').focus();
+                  break;
+                }
+            }
+          }
+        }
+      });
+    });
+  };
+
+  Drupal.behaviors.ckeditor5Admin = {
+    attach: function attach(context) {
+      once('ckeditor5-admin-toolbar', '#ckeditor5-toolbar-app').forEach(function (container) {
+        var selectedTextarea = context.querySelector('#ckeditor5-toolbar-buttons-selected');
+        var available = Object.entries(JSON.parse(context.querySelector('#ckeditor5-toolbar-buttons-available').innerHTML)).map(function (_ref) {
+          var _ref2 = _slicedToArray(_ref, 2),
+              name = _ref2[0],
+              attrs = _ref2[1];
+
+          return _objectSpread({
+            name: name,
+            id: name
+          }, attrs);
+        });
+        var dividers = [{
+          id: 'divider',
+          name: '|',
+          label: Drupal.t('Divider')
+        }, {
+          id: 'wrapping',
+          name: '-',
+          label: Drupal.t('Wrapping')
+        }];
+        var selected = new Observable(JSON.parse(selectedTextarea.innerHTML).map(function (name) {
+          return [].concat(dividers, _toConsumableArray(available)).find(function (button) {
+            return button.name === name;
+          }).id;
+        }));
+
+        var mapSelection = function mapSelection(selection) {
+          return selection.map(function (id) {
+            return [].concat(dividers, _toConsumableArray(available)).find(function (button) {
+              return button.id === id;
+            }).name;
+          });
+        };
+
+        selected.subscribe(function (selection) {
+          updateSelectedButtons(mapSelection(selection), selectedTextarea);
+          render(container, selected, available, dividers);
+        });
+        [context.querySelector('#ckeditor5-toolbar-buttons-available'), context.querySelector('[class*="editor-settings-toolbar-items"]')].filter(function (el) {
+          return el;
+        }).forEach(function (el) {
+          el.classList.add('visually-hidden');
+        });
+        render(container, selected, available, dividers);
+      });
+      once('safari-focus-fix', document.querySelectorAll('.ckeditor5-toolbar-item')).forEach(function (item) {
+        item.addEventListener('keydown', function (e) {
+          var keyCodeDirections = {
+            9: 'tab',
+            37: 'left',
+            38: 'up',
+            39: 'right',
+            40: 'down'
+          };
+
+          if (['tab', 'left', 'up', 'right', 'down'].includes(keyCodeDirections[e.keyCode])) {
+            var hideTip = false;
+            var isActive = e.target.closest('[data-button-list="ckeditor5-toolbar-active__buttons"]');
+
+            if (isActive) {
+              if (['tab', 'left', 'up', 'right'].includes(keyCodeDirections[e.keyCode])) {
+                hideTip = true;
+              }
+            } else if (['tab', 'down'].includes(keyCodeDirections[e.keyCode])) {
+              hideTip = true;
+            }
+
+            if (hideTip) {
+              e.target.querySelector('[data-expanded]').setAttribute('data-expanded', 'false');
+            }
+          }
+        });
+      });
+
+      var updateUiStateStorage = function updateUiStateStorage(states) {
+        var form = document.querySelector('#filter-format-edit-form, #filter-format-add-form');
+        var currentStates = form.hasAttribute('data-drupal-ui-state') ? JSON.parse(form.getAttribute('data-drupal-ui-state')) : {};
+        form.setAttribute('data-drupal-ui-state', JSON.stringify(_objectSpread(_objectSpread({}, currentStates), states)));
+      };
+
+      var getUiStateStorage = function getUiStateStorage(property) {
+        var form = document.querySelector('#filter-format-edit-form, #filter-format-add-form');
+
+        if (form === null) {
+          return;
+        }
+
+        return form.hasAttribute('data-drupal-ui-state') ? JSON.parse(form.getAttribute('data-drupal-ui-state'))[property] : null;
+      };
+
+      once('ui-state-storage', document.querySelector('#filter-format-edit-form, #filter-format-add-form')).forEach(function (form) {
+        form.setAttribute('data-drupal-ui-state', JSON.stringify({}));
+      });
+
+      var maintainActiveVerticalTab = function maintainActiveVerticalTab(verticalTabs) {
+        var id = verticalTabs.id;
+        var activeTab = getUiStateStorage("".concat(id, "-active-tab"));
+
+        if (activeTab) {
+          setTimeout(function () {
+            document.querySelector(activeTab).click();
+          });
+        }
+
+        verticalTabs.querySelectorAll('.vertical-tabs__menu').forEach(function (tab) {
+          tab.addEventListener('click', function (e) {
+            var state = {};
+            var href = e.target.closest('[href]').getAttribute('href').split('--')[0];
+            state["".concat(id, "-active-tab")] = "#".concat(id, " [href^='").concat(href, "']");
+            updateUiStateStorage(state);
+          });
+        });
+      };
+
+      once('plugin-settings', document.querySelector('#plugin-settings-wrapper')).forEach(maintainActiveVerticalTab);
+      once('filter-settings', document.querySelector('#filter-settings-wrapper')).forEach(maintainActiveVerticalTab);
+      var selectedButtons = document.querySelector('#ckeditor5-toolbar-buttons-selected');
+      once('textarea-listener', selectedButtons).forEach(function (textarea) {
+        textarea.addEventListener('change', function (e) {
+          var buttonName = document.activeElement.getAttribute('data-id');
+
+          if (!buttonName) {
+            return;
+          }
+
+          var focusSelector = '';
+
+          if (['divider', 'wrapping'].includes(buttonName)) {
+            var oldConfig = JSON.parse(e.detail.priorValue);
+            var newConfig = JSON.parse(e.target.innerHTML);
+
+            if (oldConfig.length > newConfig.length) {
+              for (var item = 0; item < newConfig.length; item++) {
+                if (newConfig[item] !== oldConfig[item]) {
+                  focusSelector = "[data-button-list=\"ckeditor5-toolbar-active-buttons\"] li:nth-child(".concat(Math.min(item - 1, 0), ")");
+                  break;
+                }
+              }
+            } else if (oldConfig.length < newConfig.length) {
+              focusSelector = '[data-button-list="ckeditor5-toolbar-active-buttons"] li:last-child';
+            } else {
+              document.querySelectorAll("[data-button-list=\"ckeditor5-toolbar-active-buttons\"] [data-id='".concat(buttonName, "']")).forEach(function (divider, index) {
+                if (divider === document.activeElement) {
+                  focusSelector = "".concat(buttonName, "|").concat(index);
+                }
+              });
+            }
+          } else {
+            focusSelector = "[data-id='".concat(buttonName, "']");
+          }
+
+          updateUiStateStorage({
+            focusSelector: focusSelector
+          });
+        });
+        textarea.addEventListener('focus', function () {
+          var focusSelector = getUiStateStorage('focusSelector');
+
+          if (focusSelector) {
+            if (focusSelector.includes('|')) {
+              var _focusSelector$split = focusSelector.split('|'),
+                  _focusSelector$split2 = _slicedToArray(_focusSelector$split, 2),
+                  buttonName = _focusSelector$split2[0],
+                  count = _focusSelector$split2[1];
+
+              document.querySelectorAll("[data-button-list=\"ckeditor5-toolbar-active-buttons\"] [data-id='".concat(buttonName, "']")).forEach(function (item, index) {
+                if (index === parseInt(count, 10)) {
+                  item.focus();
+                }
+              });
+            } else {
+              var toFocus = document.querySelector(focusSelector);
+
+              if (toFocus) {
+                toFocus.focus();
+              }
+            }
+          }
+        });
+      });
+    }
+  };
+
+  Drupal.theme.ckeditor5SelectedButtons = function (_ref3) {
+    var buttons = _ref3.buttons;
+    return "\n      <ul class=\"ckeditor5-toolbar-tray ckeditor5-toolbar-active__buttons\" data-button-list=\"ckeditor5-toolbar-active-buttons\" role=\"listbox\" aria-orientation=\"horizontal\" aria-labelledby=\"ckeditor5-toolbar-active-buttons-label\">\n        ".concat(buttons.map(function (button) {
+      return Drupal.theme.ckeditor5Button({
+        button: button,
+        listType: 'active'
+      });
+    }).join(''), "\n      </ul>\n    ");
+  };
+
+  Drupal.theme.ckeditor5DividerButtons = function (_ref4) {
+    var buttons = _ref4.buttons;
+    return "\n      <ul class=\"ckeditor5-toolbar-tray ckeditor5-toolbar-divider__buttons\" data-button-list=\"ckeditor5-toolbar-divider-buttons\" role=\"listbox\" aria-orientation=\"horizontal\" aria-labelledby=\"ckeditor5-toolbar-divider-buttons-label\">\n        ".concat(buttons.map(function (button) {
+      return Drupal.theme.ckeditor5Button({
+        button: button,
+        listType: 'divider'
+      });
+    }).join(''), "\n      </ul>\n    ");
+  };
+
+  Drupal.theme.ckeditor5AvailableButtons = function (_ref5) {
+    var buttons = _ref5.buttons;
+    return "\n      <ul class=\"ckeditor5-toolbar-tray ckeditor5-toolbar-available__buttons\" data-button-list=\"ckeditor5-toolbar-available-buttons\" role=\"listbox\" aria-orientation=\"horizontal\" aria-labelledby=\"ckeditor5-toolbar-available-buttons-label\">\n        ".concat(buttons.map(function (button) {
+      return Drupal.theme.ckeditor5Button({
+        button: button,
+        listType: 'available'
+      });
+    }).join(''), "\n      </ul>\n    ");
+  };
+
+  Drupal.theme.ckeditor5Button = function (_ref6) {
+    var _ref6$button = _ref6.button,
+        label = _ref6$button.label,
+        id = _ref6$button.id,
+        listType = _ref6.listType;
+    var visuallyHiddenLabel = Drupal.t("@listType button @label", {
+      '@listType': listType !== 'divider' ? listType : 'available',
+      '@label': label
+    });
+    return "\n      <li class=\"ckeditor5-toolbar-item ckeditor5-toolbar-item-".concat(id, "\" role=\"option\" tabindex=\"0\" data-drupal-selector=\"ckeditor5-toolbar-button\" data-id=\"").concat(id, "\" data-label=\"").concat(label, "\" data-divider=\"").concat(listType === 'divider', "\">\n        <span class=\"ckeditor5-toolbar-button ckeditor5-toolbar-button-").concat(id, "\">\n          <span class=\"visually-hidden\">").concat(visuallyHiddenLabel, ")}</span>\n        </span>\n        <span class=\"ckeditor5-toolbar-tooltip\" aria-hidden=\"true\">").concat(label, "</span>\n      </li>\n    ");
+  };
+
+  Drupal.theme.ckeditor5Admin = function (_ref7) {
+    var availableButtons = _ref7.availableButtons,
+        dividerButtons = _ref7.dividerButtons,
+        activeToolbar = _ref7.activeToolbar,
+        helpMessage = _ref7.helpMessage;
+    return "\n    <div aria-live=\"polite\" data-drupal-selector=\"ckeditor5-admin-help-message\">\n      <p>".concat(helpMessage.join('</p><p>'), "</p>\n    </div>\n    <div class=\"ckeditor5-toolbar-disabled\">\n      <div class=\"ckeditor5-toolbar-available\">\n        <label id=\"ckeditor5-toolbar-available-buttons-label\">").concat(Drupal.t('Available buttons'), "</label>\n        ").concat(availableButtons, "\n      </div>\n      <div class=\"ckeditor5-toolbar-divider\">\n        <label id=\"ckeditor5-toolbar-divider-buttons-label\">").concat(Drupal.t('Button divider'), "</label>\n        ").concat(dividerButtons, "\n      </div>\n    </div>\n    <div class=\"ckeditor5-toolbar-active\">\n      <label id=\"ckeditor5-toolbar-active-buttons-label\">").concat(Drupal.t('Active toolbar'), "</label>\n      ").concat(activeToolbar, "\n    </div>\n    ");
+  };
+
+  var originalFilterStatusAttach = Drupal.behaviors.filterStatus.attach;
+
+  Drupal.behaviors.filterStatus.attach = function (context, settings) {
+    var filterStatusCheckboxes = document.querySelectorAll('#filters-status-wrapper input.form-checkbox');
+    once.remove('filter-status', filterStatusCheckboxes);
+    $(filterStatusCheckboxes).off('click.filterUpdate');
+    originalFilterStatusAttach(context, settings);
+  };
+
+  Drupal.behaviors.tabErrorsVisible = {
+    attach: function attach(context) {
+      context.querySelectorAll('details .form-item .error').forEach(function (item) {
+        var details = item.closest('details');
+
+        if (details.style.display === 'none') {
+          var tabSelect = document.querySelector("[href='#".concat(details.id, "']"));
+
+          if (tabSelect) {
+            tabSelect.click();
+          }
+        }
+      });
+    }
+  };
+})(Drupal, drupalSettings, jQuery, JSON, once, Sortable);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/ckeditor5.es6.js b/core/modules/ckeditor5/js/ckeditor5.es6.js
new file mode 100644
index 0000000000000000000000000000000000000000..5f97a7b079655aa88c9d60b8e0206ded34f10557
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5.es6.js
@@ -0,0 +1,560 @@
+/**
+ * @file
+ * CKEditor 5 implementation of {@link Drupal.editors} API.
+ */
+/* global CKEditor5 */
+((Drupal, debounce, CKEditor5, $) => {
+  /**
+   * The CKEDITOR instances.
+   *
+   * @type {Map}
+   */
+  Drupal.CKEditor5Instances = new Map();
+
+  /**
+   * The callback functions.
+   *
+   * @type {Map}
+   */
+  const callbacks = new Map();
+
+  /**
+   * List of element ids with the required attribute.
+   *
+   * @type {Set}
+   */
+  const required = new Set();
+
+  function findFunc(scope, name) {
+    if (!scope) {
+      return null;
+    }
+    const parts = name.includes('.') ? name.split('.') : name;
+
+    if (parts.length > 1) {
+      return findFunc(scope[parts.shift()], parts);
+    }
+    return typeof scope[parts[0]] === 'function' ? scope[parts[0]] : null;
+  }
+
+  function buildFunc(config) {
+    const { func } = config;
+    // Assuming a global object.
+    const fn = findFunc(window, func.name);
+    if (typeof fn === 'function') {
+      const result = func.invoke ? fn(...func.args) : fn;
+      return result;
+    }
+    return null;
+  }
+
+  /**
+   * Converts a string representing regexp to a RegExp object.
+   *
+   * @param {Object} config
+   *   An object containing configuration.
+   * @param {string} config.pattern
+   *   The regexp pattern that is used to create the RegExp object.
+   *
+   * @return {RegExp}
+   *   Regexp object built from the string regexp.
+   */
+  function buildRegexp(config) {
+    const { pattern } = config.regexp;
+
+    const main = pattern.match(/\/(.+)\/.*/)[1];
+    const options = pattern.match(/\/.+\/(.*)/)[1];
+
+    return new RegExp(main, options);
+  }
+
+  /**
+   * Casts configuration items to correct types.
+   *
+   * @param {Object} config
+   *   The config object.
+   * @return {Object}
+   *   The config object with items transformed to correct type.
+   */
+  function processConfig(config) {
+    /**
+     * Processes an array in config recursively.
+     *
+     * @param {Array} config
+     *   An array that should be processed recursively.
+     * @return {Array}
+     *   An array that has been processed recursively.
+     */
+    function processArray(config) {
+      return config.map((item) => {
+        if (typeof item === 'object') {
+          return processConfig(item);
+        }
+
+        return item;
+      });
+    }
+
+    return Object.entries(config).reduce((processed, [key, value]) => {
+      if (typeof value === 'object') {
+        if (value.hasOwnProperty('func')) {
+          processed[key] = buildFunc(value);
+        } else if (value.hasOwnProperty('regexp')) {
+          processed[key] = buildRegexp(value);
+        } else if (Array.isArray(value)) {
+          processed[key] = processArray(value);
+        } else {
+          processed[key] = processConfig(value);
+        }
+      } else {
+        processed[key] = value;
+      }
+
+      return processed;
+    }, {});
+  }
+
+  /**
+   * Set an id to a data-attribute for registering this element instance.
+   *
+   * @param {Element} element
+   *   An element that should receive unique ID.
+   *
+   * @return {string}
+   *   The id to use for this element.
+   */
+  const setElementId = (element) => {
+    const id = Math.random().toString().slice(2, 9);
+    element.setAttribute('data-ckeditor5-id', id);
+
+    return id;
+  };
+
+  /**
+   * Return a unique selector for the element.
+   *
+   * @param {HTMLElement} element
+   *   An element which unique ID should be retrieved.
+   *
+   * @return {string}
+   *   The id to use for this element.
+   */
+  const getElementId = (element) => element.getAttribute('data-ckeditor5-id');
+
+  /**
+   * Select CKEditor5 plugin classes to include.
+   *
+   * Found in the CKEditor5 global js object as {package.Class}.
+   *
+   * @param {Array} plugins
+   *  List of package and Class name of plugins
+   *
+   * @return {Array}
+   *   List of JavaScript Classes to add in the extraPlugins property of config.
+   */
+  function selectPlugins(plugins) {
+    return plugins.map((pluginDefinition) => {
+      const [build, name] = pluginDefinition.split('.');
+      if (CKEditor5[build] && CKEditor5[build][name]) {
+        return CKEditor5[build][name];
+      }
+
+      // eslint-disable-next-line no-console
+      console.warn(`Failed to load ${build} - ${name}`);
+      return null;
+    });
+  }
+
+  /**
+   * Adds CSS to ensure proper styling of CKEditor 5 inside off-canvas dialogs.
+   *
+   * @param {HTMLElement} element
+   *   The element the editor is attached to.
+   */
+  const offCanvasCss = (element) => {
+    element.parentNode.setAttribute('data-drupal-ck-style-fence', true);
+
+    // Only proceed if the styles haven't been added yet.
+    if (!document.querySelector('#ckeditor5-off-canvas-reset')) {
+      const prefix = `#drupal-off-canvas [data-drupal-ck-style-fence]`;
+      let existingCss = '';
+
+      // Find every existing style that doesn't come from off-canvas resets and
+      // copy them to new styles with a prefix targeting CKEditor inside an
+      // off-canvas dialog.
+      [...document.styleSheets].forEach((sheet) => {
+        if (
+          !sheet.href ||
+          (sheet.href && sheet.href.indexOf('off-canvas') === -1)
+        ) {
+          // This is wrapped in a try/catch as Chromium browsers will fail if
+          // the stylesheet was provided via a CORS request.
+          // @see https://bugs.chromium.org/p/chromium/issues/detail?id=775525
+          try {
+            const rules = sheet.cssRules;
+            [...rules].forEach((rule) => {
+              let { cssText } = rule;
+              const selector = rule.cssText.split('{')[0];
+
+              // Prefix all selectors added after a comma.
+              cssText = cssText.replace(
+                selector,
+                selector.replace(/,/g, `, ${prefix}`),
+              );
+
+              // When adding to existingCss, prefix the first selector as well.
+              existingCss += `${prefix} ${cssText}`;
+            });
+          } catch (e) {
+            // eslint-disable-next-line no-console
+            console.warn(
+              `Stylesheet ${sheet.href} not included in CKEditor reset due to the browser's CORS policy.`,
+            );
+          }
+        }
+      });
+
+      // Additional styles that need to be explicity added in addition to the
+      // prefixed versions of existing css in `existingCss`.
+      const addedCss = [
+        `${prefix} .ck.ck-content {display:block;min-height:5rem;}`,
+        `${prefix} .ck.ck-content * {display:initial;background:initial;color:initial;padding:initial;}`,
+        `${prefix} .ck.ck-content li {display:list-item}`,
+        `${prefix} .ck.ck-content ol li {list-style-type: decimal}`,
+        `${prefix} .ck[contenteditable], ${prefix} .ck[contenteditable] * {-webkit-user-modify: read-write;-moz-user-modify: read-write;}`,
+      ];
+
+      // Styles to ensure block elements are displayed as such inside
+      // off-canvas dialogs. These are all element types that are styled with
+      // ` all: initial;` in the off-canvas reset that should default to being
+      // displayed as blocks within CKEditor.
+      // @see core/misc/dialog/off-canvas.reset.pcss.css
+      const blockSelectors = [
+        'h1',
+        'h2',
+        'h3',
+        'h4',
+        'h5',
+        'h6',
+        'p',
+        'ol',
+        'ul',
+        'address',
+        'article',
+        'aside',
+        'blockquote',
+        'body',
+        'dd',
+        'div',
+        'dl',
+        'dt',
+        'fieldset',
+        'figcaption',
+        'figure',
+        'footer',
+        'form',
+        'header',
+        'hgroup',
+        'hr',
+        'html',
+        'legend',
+        'main',
+        'menu',
+        'pre',
+        'section',
+        'xmp',
+      ]
+        .map((blockElement) => `${prefix} .ck.ck-content ${blockElement}`)
+        .join(', \n');
+      const blockCss = `${blockSelectors} { display: block; }`;
+
+      const prefixedCss = [...addedCss, existingCss, blockCss].join('\n');
+
+      // Create a new style tag with the prefixed styles added above.
+      const offCanvasCss = document.createElement('style');
+      offCanvasCss.innerHTML = prefixedCss;
+      offCanvasCss.setAttribute('id', 'ckeditor5-off-canvas-reset');
+      document.body.appendChild(offCanvasCss);
+    }
+  };
+
+  /**
+   * @namespace
+   */
+  Drupal.editors.ckeditor5 = {
+    /**
+     * Editor attach callback.
+     *
+     * @param {HTMLElement} element
+     *   The element to attach the editor to.
+     * @param {string} format
+     *   The text format for the editor.
+     */
+    attach(element, format) {
+      const { editorClassic } = CKEditor5;
+      const {
+        toolbar,
+        plugins,
+        config: pluginConfig,
+        language,
+      } = format.editorSettings;
+      const extraPlugins = selectPlugins(plugins);
+
+      const config = {
+        extraPlugins,
+        toolbar,
+        language,
+        ...processConfig(pluginConfig),
+      };
+      // Set the id immediately so that it is available when onChange is called.
+      const id = setElementId(element);
+      const { ClassicEditor } = editorClassic;
+
+      ClassicEditor.create(element, config)
+        .then((editor) => {
+          // Save a reference to the initialized instance.
+          Drupal.CKEditor5Instances.set(id, editor);
+
+          // CKEditor4 had a feature to remove the required attribute
+          // see: https://www.drupal.org/project/drupal/issues/1954968
+          if (element.hasAttribute('required')) {
+            required.add(id);
+            element.removeAttribute('required');
+          }
+
+          editor.model.document.on('change:data', () => {
+            const callback = callbacks.get(id);
+            if (callback) {
+              if (editor.plugins.has('SourceEditing')) {
+                // If the change:data is being called while in source editing
+                // mode, it means that the form is being submitted. To avoid
+                // race conditions, in this case the callback gets called
+                // without decorating the callback with debounce.
+                // @see https://www.drupal.org/i/3229174
+                // @see Drupal.editorDetach
+                if (editor.plugins.get('SourceEditing').isSourceEditingMode) {
+                  callback();
+                  return;
+                }
+              }
+
+              // Marks the field as changed.
+              // @see Drupal.editorAttach
+              debounce(callback, 400)();
+            }
+          });
+
+          const isOffCanvas = element.closest('#drupal-off-canvas');
+
+          if (isOffCanvas) {
+            offCanvasCss(element);
+          }
+        })
+        .catch((error) => {
+          // eslint-disable-next-line no-console
+          console.error(error);
+        });
+    },
+
+    /**
+     * Editor detach callback.
+     *
+     * @param {HTMLElement} element
+     *   The element to detach the editor from.
+     * @param {string} format
+     *   The text format used for the editor.
+     * @param {string} trigger
+     *   The event trigger for the detach.
+     */
+    detach(element, format, trigger) {
+      const id = getElementId(element);
+      const editor = Drupal.CKEditor5Instances.get(id);
+      if (!editor) {
+        return;
+      }
+      if (trigger === 'serialize') {
+        editor.updateSourceElement();
+      } else {
+        element.removeAttribute('contentEditable');
+
+        // Prepare variables that will be used when discarding Quickedit changes.
+        let textElement = null;
+        let originalValue = null;
+        const usingQuickEdit = (((Drupal || {}).quickedit || {}).editors || {})
+          .editor;
+        if (usingQuickEdit) {
+          // The revert() function in QuickEdit's text editor does not work with
+          // CKEditor 5, as it is triggered before CKEditor 5 is fully
+          // destroyed. This function is overridden so the functionality it
+          // provides can happen after the CKEditor destroy() promise is
+          // fulfilled.
+          // This pulls the necessary values from the QuickEdit Backbone Model
+          // before it is destroyed, so they can be used by
+          // `editor.destroy().then()` to perform the expected revert.
+          Drupal.quickedit.editors.editor.prototype.revert =
+            function revertQuickeditChanges() {
+              textElement = this.$textElement[0];
+              originalValue = this.model.get('originalValue');
+            };
+        }
+
+        editor
+          .destroy()
+          .then(() => {
+            // If textElement and originalValue are not null, a QuickEdit
+            // revert has been requested. Perform the revert here as it
+            // can't happen until the CKEditor instance is destroyed.
+            if (textElement && originalValue) {
+              textElement.innerHTML = originalValue;
+            }
+
+            // Clean up stored references.
+            Drupal.CKEditor5Instances.delete(id);
+            callbacks.delete(id);
+            if (required.has(id)) {
+              element.setAttribute('required', 'required');
+              required.delete(id);
+            }
+          })
+          .catch((error) => {
+            // eslint-disable-next-line no-console
+            console.error(error);
+          });
+      }
+    },
+
+    /**
+     * Registers a callback which CKEditor5 will call on change:data event.
+     *
+     * @param {HTMLElement} element
+     *   The element where the change occurred.
+     * @param {function} callback
+     *   Callback called with the value of the editor.
+     */
+    onChange(element, callback) {
+      callbacks.set(getElementId(element), callback);
+    },
+
+    /**
+     * Attaches an inline editor to a DOM element.
+     *
+     * @param {HTMLElement} element
+     *   The element to attach the editor to.
+     * @param {object} format
+     *   The text format used in the editor.
+     * @param {string} [mainToolbarId]
+     *   The id attribute for the main editor toolbar, if any.
+     *
+     * @see Drupal.quickedit.editors.editor
+     */
+    attachInlineEditor(element, format, mainToolbarId) {
+      const { editorDecoupled } = CKEditor5;
+      const {
+        toolbar,
+        plugins,
+        config: pluginConfig,
+        language,
+      } = format.editorSettings;
+      const extraPlugins = selectPlugins(plugins);
+      const config = {
+        extraPlugins,
+        toolbar,
+        language,
+        ...processConfig(pluginConfig),
+      };
+      const id = setElementId(element);
+      const { DecoupledEditor } = editorDecoupled;
+
+      DecoupledEditor.create(element, config)
+        .then((editor) => {
+          Drupal.CKEditor5Instances.set(id, editor);
+          const toolbar = document.getElementById(mainToolbarId);
+          toolbar.appendChild(editor.ui.view.toolbar.element);
+          editor.model.document.on('change:data', () => {
+            const callback = callbacks.get(id);
+            if (callback) {
+              // Quick Edit requires the current data to update EditorModel.
+              // @see Drupal.quickedit.editors.editor
+              debounce(callback, 400)(editor.getData());
+            }
+          });
+        })
+        .catch((error) => {
+          // eslint-disable-next-line no-console
+          console.error(error);
+        });
+    },
+  };
+
+  Drupal.ckeditor5 = {
+    /**
+     * Variable storing the current dialog's save callback.
+     *
+     * @type {?function}
+     */
+    saveCallback: null,
+
+    openDialog(url, saveCallback, dialogSettings) {
+      // Add a consistent dialog class.
+      const classes = dialogSettings.dialogClass
+        ? dialogSettings.dialogClass.split(' ')
+        : [];
+      classes.push('ui-dialog--narrow');
+      dialogSettings.dialogClass = classes.join(' ');
+      dialogSettings.autoResize =
+        window.matchMedia('(min-width: 600px)').matches;
+      dialogSettings.width = 'auto';
+
+      const $content = $(
+        `<div class="ckeditor5-dialog-loading"><span style="top: -40px;" class="ckeditor5-dialog-loading-link">${Drupal.t(
+          'Loading...',
+        )}</span></div>`,
+      );
+      $content.appendTo($('body'));
+
+      const ckeditorAjaxDialog = Drupal.ajax({
+        dialog: dialogSettings,
+        dialogType: 'modal',
+        selector: '.ckeditor5-dialog-loading-link',
+        url,
+        progress: { type: 'throbber' },
+        submit: {
+          editor_object: {},
+        },
+      });
+      ckeditorAjaxDialog.execute();
+
+      // After a short delay, show "Loading…" message.
+      window.setTimeout(() => {
+        $content.find('span').animate({ top: '0px' });
+      }, 1000);
+
+      // Store the save callback to be executed when this dialog is closed.
+      Drupal.ckeditor5.saveCallback = saveCallback;
+    },
+  };
+
+  // Respond to new dialogs that are opened by CKEditor, closing the AJAX loader.
+  $(window).on('dialog:beforecreate', () => {
+    $('.ckeditor5-dialog-loading').animate(
+      { top: '-40px' },
+      function removeDialogLoading() {
+        $(this).remove();
+      },
+    );
+  });
+
+  // Respond to dialogs that are saved, sending data back to CKEditor.
+  $(window).on('editor:dialogsave', (e, values) => {
+    if (Drupal.ckeditor5.saveCallback) {
+      Drupal.ckeditor5.saveCallback(values);
+    }
+  });
+
+  // Respond to dialogs that are closed, removing the current save handler.
+  $(window).on('dialog:afterclose', () => {
+    if (Drupal.ckeditor5.saveCallback) {
+      Drupal.ckeditor5.saveCallback = null;
+    }
+  });
+})(Drupal, Drupal.debounce, CKEditor5, jQuery);
diff --git a/core/modules/ckeditor5/js/ckeditor5.filter.admin.es6.js b/core/modules/ckeditor5/js/ckeditor5.filter.admin.es6.js
new file mode 100644
index 0000000000000000000000000000000000000000..0e837f7f83264b36332e8f0f97963e93145e0727
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5.filter.admin.es6.js
@@ -0,0 +1,156 @@
+/**
+ * @file
+ * Provides Text Editor UI improvements specific to CKEditor 5.
+ */
+
+((Drupal, once) => {
+  Drupal.behaviors.allowedTagsListener = {
+    attach: function attach(context) {
+      once(
+        'allowed-tags-listener',
+        context.querySelector(
+          '[data-drupal-selector="edit-filters-filter-html-settings-allowed-html"]',
+        ),
+      ).forEach((textarea) => {
+        const editorSelect = document.querySelector(
+          '[data-drupal-selector="edit-editor-editor"]',
+        );
+        const filterCheckbox = document.querySelector(
+          '[data-drupal-selector="edit-filters-filter-html-status"]',
+        );
+        const formSubmit = document.querySelector(
+          '[data-drupal-selector="edit-actions-submit"]',
+        );
+        const wrapper = textarea.closest('div');
+
+        const resetChanges = () => {
+          const updateButtonContainer = document.querySelector(
+            '[data-ckeditor5-allowed-tags-info]',
+          );
+          if (updateButtonContainer) {
+            updateButtonContainer.remove();
+          }
+
+          const allowedTagsDisabledHelp = document.querySelector(
+            '[data-ckeditor5-allowed-tags-disabled-help]',
+          );
+          if (allowedTagsDisabledHelp) {
+            allowedTagsDisabledHelp.remove();
+          }
+
+          formSubmit.removeAttribute('disabled');
+          wrapper.classList.remove('ckeditor5-filter-attention');
+        };
+
+        resetChanges();
+
+        const addAllowedTagsUpdateButton = () => {
+          resetChanges();
+
+          if (
+            editorSelect.value === 'ckeditor5' &&
+            filterCheckbox &&
+            filterCheckbox.checked
+          ) {
+            if (!textarea.hasAttribute('readonly')) {
+              wrapper.classList.add('ckeditor5-filter-attention');
+
+              const container = document.createElement('div');
+              container.setAttribute('data-ckeditor5-allowed-tags-info', true);
+              const description = document.createElement('p');
+
+              description.innerText = Drupal.t(
+                'Switching to CKEditor 5 requires, at minimum, the tags "<p> <br>". After switching to CKEditor 5, this field will be read only, and will be updated based on which CKEditor 5 plugins are enabled. When switching to CKEditor 5 from an existing text format with content, we recommend documenting what tags are in use and then enabling the CKEditor 5 tags that support them.',
+              );
+
+              const updateButton = document.createElement('button');
+              updateButton.setAttribute(
+                'name',
+                'update-ckeditor5-allowed-tags',
+              );
+              updateButton.innerText = Drupal.t(
+                'Apply changes to allowed tags.',
+              );
+              updateButton.addEventListener('click', () => {
+                editorSelect.dispatchEvent(new CustomEvent('change'));
+                setTimeout(() => {
+                  resetChanges();
+                });
+              });
+
+              container.appendChild(description);
+              container.appendChild(updateButton);
+
+              wrapper.appendChild(container);
+
+              // In this very specific use case, submitting the filter form must
+              // be prevented.
+              // - CKEditor 5 is the selected editor, but it's not yet accepted
+              //   by the form because it's not passing the validation restraint
+              //   requiring CKEditor 5 compatible "Allowed Tags". This validator,
+              //   by necessity fires before CKEditor 5 is registered with the
+              //   form.
+              // - The registering of an editor with the form typically occurs
+              //   when a change
+              formSubmit.setAttribute('disabled', true);
+              const formSubmitHelp = document.createElement('p');
+              formSubmitHelp.setAttribute(
+                'data-ckeditor5-allowed-tags-disabled-help',
+                true,
+              );
+              formSubmitHelp.textContent = Drupal.t(
+                'This form is not submittable when the editor is set to CKEditor 5 unless the "Limit allowed HTML tags and correct faulty HTML" filter\'s "Allowed HTML tags" field includes the tags required by CKEDitor 5',
+              );
+              formSubmit.parentNode.append(formSubmitHelp);
+            }
+          }
+        };
+        editorSelect.addEventListener('change', addAllowedTagsUpdateButton);
+        filterCheckbox.addEventListener('change', addAllowedTagsUpdateButton);
+      });
+    },
+  };
+
+  // Copy the function that is about to be overridden so it can be invoked
+  // inside the override.
+  const originalAjaxEventResponse = Drupal.Ajax.prototype.eventResponse;
+
+  /**
+   * Overrides Ajax.eventResponse with CKEditor 5 specific customizations.
+   *
+   * This is the handler for events that will ultimately trigger an AJAX
+   * response. It is overridden here to provide additional logic to prevent
+   * specific CKEditor 5-related events from triggering that AJAX response
+   * unless certain criteria are met.
+   */
+  Drupal.Ajax.prototype.eventResponse = function ckeditor5AjaxEventResponse(
+    ...args
+  ) {
+    // There are AJAX callbacks that should only be triggered if the editor
+    // <select> is set to 'ckeditor5'. They should be active when the text
+    // format is using CKEditor 5 and when a user is attempting to switch to
+    // CKEditor 5 but is prevented from doing so by validation. Triggering these
+    // AJAX callback when trying to switch to CKEditor 5 but blocked by
+    // validation benefits the user as they get real time feedback as they
+    // configure the text format to be CKEditor 5 compatible. This spares them
+    // from having to submit the form multiple times in order to determine if
+    // their settings are compatible.
+    // This validation stage is also why the AJAX callbacks can't be
+    // conditionally added server side, as validation errors interrupt the form
+    // rebuild before the AJAX callbacks could be added via form_alter.
+    if (this.ckeditor5_only) {
+      // The ckeditor5_only property is added to form elements that should only
+      // trigger AJAX callbacks when the editor <select> value is 'ckeditor5'.
+      // These callbacks provide real-time validation that should be present for
+      // both text formats using CKEditor 5 and text formats in the process of
+      // switching to CKEditor 5, but prevented from doing so by validation.
+      if (
+        this.$form[0].querySelector('#edit-editor-editor').value !== 'ckeditor5'
+      ) {
+        return;
+      }
+    }
+
+    originalAjaxEventResponse.apply(this, args);
+  };
+})(Drupal, once);
diff --git a/core/modules/ckeditor5/js/ckeditor5.filter.admin.js b/core/modules/ckeditor5/js/ckeditor5.filter.admin.js
new file mode 100644
index 0000000000000000000000000000000000000000..2e8a0a0d970d933fb4e934cc0ca4f7e816bd9fba
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5.filter.admin.js
@@ -0,0 +1,87 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function (Drupal, once) {
+  Drupal.behaviors.allowedTagsListener = {
+    attach: function attach(context) {
+      once('allowed-tags-listener', context.querySelector('[data-drupal-selector="edit-filters-filter-html-settings-allowed-html"]')).forEach(function (textarea) {
+        var editorSelect = document.querySelector('[data-drupal-selector="edit-editor-editor"]');
+        var filterCheckbox = document.querySelector('[data-drupal-selector="edit-filters-filter-html-status"]');
+        var formSubmit = document.querySelector('[data-drupal-selector="edit-actions-submit"]');
+        var wrapper = textarea.closest('div');
+
+        var resetChanges = function resetChanges() {
+          var updateButtonContainer = document.querySelector('[data-ckeditor5-allowed-tags-info]');
+
+          if (updateButtonContainer) {
+            updateButtonContainer.remove();
+          }
+
+          var allowedTagsDisabledHelp = document.querySelector('[data-ckeditor5-allowed-tags-disabled-help]');
+
+          if (allowedTagsDisabledHelp) {
+            allowedTagsDisabledHelp.remove();
+          }
+
+          formSubmit.removeAttribute('disabled');
+          wrapper.classList.remove('ckeditor5-filter-attention');
+        };
+
+        resetChanges();
+
+        var addAllowedTagsUpdateButton = function addAllowedTagsUpdateButton() {
+          resetChanges();
+
+          if (editorSelect.value === 'ckeditor5' && filterCheckbox && filterCheckbox.checked) {
+            if (!textarea.hasAttribute('readonly')) {
+              wrapper.classList.add('ckeditor5-filter-attention');
+              var container = document.createElement('div');
+              container.setAttribute('data-ckeditor5-allowed-tags-info', true);
+              var description = document.createElement('p');
+              description.innerText = Drupal.t('Switching to CKEditor 5 requires, at minimum, the tags "<p> <br>". After switching to CKEditor 5, this field will be read only, and will be updated based on which CKEditor 5 plugins are enabled. When switching to CKEditor 5 from an existing text format with content, we recommend documenting what tags are in use and then enabling the CKEditor 5 tags that support them.');
+              var updateButton = document.createElement('button');
+              updateButton.setAttribute('name', 'update-ckeditor5-allowed-tags');
+              updateButton.innerText = Drupal.t('Apply changes to allowed tags.');
+              updateButton.addEventListener('click', function () {
+                editorSelect.dispatchEvent(new CustomEvent('change'));
+                setTimeout(function () {
+                  resetChanges();
+                });
+              });
+              container.appendChild(description);
+              container.appendChild(updateButton);
+              wrapper.appendChild(container);
+              formSubmit.setAttribute('disabled', true);
+              var formSubmitHelp = document.createElement('p');
+              formSubmitHelp.setAttribute('data-ckeditor5-allowed-tags-disabled-help', true);
+              formSubmitHelp.textContent = Drupal.t('This form is not submittable when the editor is set to CKEditor 5 unless the "Limit allowed HTML tags and correct faulty HTML" filter\'s "Allowed HTML tags" field includes the tags required by CKEDitor 5');
+              formSubmit.parentNode.append(formSubmitHelp);
+            }
+          }
+        };
+
+        editorSelect.addEventListener('change', addAllowedTagsUpdateButton);
+        filterCheckbox.addEventListener('change', addAllowedTagsUpdateButton);
+      });
+    }
+  };
+  var originalAjaxEventResponse = Drupal.Ajax.prototype.eventResponse;
+
+  Drupal.Ajax.prototype.eventResponse = function ckeditor5AjaxEventResponse() {
+    if (this.ckeditor5_only) {
+      if (this.$form[0].querySelector('#edit-editor-editor').value !== 'ckeditor5') {
+        return;
+      }
+    }
+
+    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    originalAjaxEventResponse.apply(this, args);
+  };
+})(Drupal, once);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/ckeditor5.js b/core/modules/ckeditor5/js/ckeditor5.js
new file mode 100644
index 0000000000000000000000000000000000000000..e216c1228f43df4e9f5c35609ad2ec12405b4117
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5.js
@@ -0,0 +1,348 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
+
+function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
+
+function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+
+function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
+
+function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
+
+function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+(function (Drupal, debounce, CKEditor5, $) {
+  Drupal.CKEditor5Instances = new Map();
+  var callbacks = new Map();
+  var required = new Set();
+
+  function findFunc(scope, name) {
+    if (!scope) {
+      return null;
+    }
+
+    var parts = name.includes('.') ? name.split('.') : name;
+
+    if (parts.length > 1) {
+      return findFunc(scope[parts.shift()], parts);
+    }
+
+    return typeof scope[parts[0]] === 'function' ? scope[parts[0]] : null;
+  }
+
+  function buildFunc(config) {
+    var func = config.func;
+    var fn = findFunc(window, func.name);
+
+    if (typeof fn === 'function') {
+      var result = func.invoke ? fn.apply(void 0, _toConsumableArray(func.args)) : fn;
+      return result;
+    }
+
+    return null;
+  }
+
+  function buildRegexp(config) {
+    var pattern = config.regexp.pattern;
+    var main = pattern.match(/\/(.+)\/.*/)[1];
+    var options = pattern.match(/\/.+\/(.*)/)[1];
+    return new RegExp(main, options);
+  }
+
+  function processConfig(config) {
+    function processArray(config) {
+      return config.map(function (item) {
+        if (_typeof(item) === 'object') {
+          return processConfig(item);
+        }
+
+        return item;
+      });
+    }
+
+    return Object.entries(config).reduce(function (processed, _ref) {
+      var _ref2 = _slicedToArray(_ref, 2),
+          key = _ref2[0],
+          value = _ref2[1];
+
+      if (_typeof(value) === 'object') {
+        if (value.hasOwnProperty('func')) {
+          processed[key] = buildFunc(value);
+        } else if (value.hasOwnProperty('regexp')) {
+          processed[key] = buildRegexp(value);
+        } else if (Array.isArray(value)) {
+          processed[key] = processArray(value);
+        } else {
+          processed[key] = processConfig(value);
+        }
+      } else {
+        processed[key] = value;
+      }
+
+      return processed;
+    }, {});
+  }
+
+  var setElementId = function setElementId(element) {
+    var id = Math.random().toString().slice(2, 9);
+    element.setAttribute('data-ckeditor5-id', id);
+    return id;
+  };
+
+  var getElementId = function getElementId(element) {
+    return element.getAttribute('data-ckeditor5-id');
+  };
+
+  function selectPlugins(plugins) {
+    return plugins.map(function (pluginDefinition) {
+      var _pluginDefinition$spl = pluginDefinition.split('.'),
+          _pluginDefinition$spl2 = _slicedToArray(_pluginDefinition$spl, 2),
+          build = _pluginDefinition$spl2[0],
+          name = _pluginDefinition$spl2[1];
+
+      if (CKEditor5[build] && CKEditor5[build][name]) {
+        return CKEditor5[build][name];
+      }
+
+      console.warn("Failed to load ".concat(build, " - ").concat(name));
+      return null;
+    });
+  }
+
+  var offCanvasCss = function offCanvasCss(element) {
+    element.parentNode.setAttribute('data-drupal-ck-style-fence', true);
+
+    if (!document.querySelector('#ckeditor5-off-canvas-reset')) {
+      var prefix = "#drupal-off-canvas [data-drupal-ck-style-fence]";
+      var existingCss = '';
+
+      _toConsumableArray(document.styleSheets).forEach(function (sheet) {
+        if (!sheet.href || sheet.href && sheet.href.indexOf('off-canvas') === -1) {
+          try {
+            var rules = sheet.cssRules;
+
+            _toConsumableArray(rules).forEach(function (rule) {
+              var cssText = rule.cssText;
+              var selector = rule.cssText.split('{')[0];
+              cssText = cssText.replace(selector, selector.replace(/,/g, ", ".concat(prefix)));
+              existingCss += "".concat(prefix, " ").concat(cssText);
+            });
+          } catch (e) {
+            console.warn("Stylesheet ".concat(sheet.href, " not included in CKEditor reset due to the browser's CORS policy."));
+          }
+        }
+      });
+
+      var addedCss = ["".concat(prefix, " .ck.ck-content {display:block;min-height:5rem;}"), "".concat(prefix, " .ck.ck-content * {display:initial;background:initial;color:initial;padding:initial;}"), "".concat(prefix, " .ck.ck-content li {display:list-item}"), "".concat(prefix, " .ck.ck-content ol li {list-style-type: decimal}"), "".concat(prefix, " .ck[contenteditable], ").concat(prefix, " .ck[contenteditable] * {-webkit-user-modify: read-write;-moz-user-modify: read-write;}")];
+      var blockSelectors = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'ol', 'ul', 'address', 'article', 'aside', 'blockquote', 'body', 'dd', 'div', 'dl', 'dt', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'header', 'hgroup', 'hr', 'html', 'legend', 'main', 'menu', 'pre', 'section', 'xmp'].map(function (blockElement) {
+        return "".concat(prefix, " .ck.ck-content ").concat(blockElement);
+      }).join(', \n');
+      var blockCss = "".concat(blockSelectors, " { display: block; }");
+      var prefixedCss = [].concat(addedCss, [existingCss, blockCss]).join('\n');
+
+      var _offCanvasCss = document.createElement('style');
+
+      _offCanvasCss.innerHTML = prefixedCss;
+
+      _offCanvasCss.setAttribute('id', 'ckeditor5-off-canvas-reset');
+
+      document.body.appendChild(_offCanvasCss);
+    }
+  };
+
+  Drupal.editors.ckeditor5 = {
+    attach: function attach(element, format) {
+      var editorClassic = CKEditor5.editorClassic;
+      var _format$editorSetting = format.editorSettings,
+          toolbar = _format$editorSetting.toolbar,
+          plugins = _format$editorSetting.plugins,
+          pluginConfig = _format$editorSetting.config,
+          language = _format$editorSetting.language;
+      var extraPlugins = selectPlugins(plugins);
+
+      var config = _objectSpread({
+        extraPlugins: extraPlugins,
+        toolbar: toolbar,
+        language: language
+      }, processConfig(pluginConfig));
+
+      var id = setElementId(element);
+      var ClassicEditor = editorClassic.ClassicEditor;
+      ClassicEditor.create(element, config).then(function (editor) {
+        Drupal.CKEditor5Instances.set(id, editor);
+
+        if (element.hasAttribute('required')) {
+          required.add(id);
+          element.removeAttribute('required');
+        }
+
+        editor.model.document.on('change:data', function () {
+          var callback = callbacks.get(id);
+
+          if (callback) {
+            if (editor.plugins.has('SourceEditing')) {
+              if (editor.plugins.get('SourceEditing').isSourceEditingMode) {
+                callback();
+                return;
+              }
+            }
+
+            debounce(callback, 400)();
+          }
+        });
+        var isOffCanvas = element.closest('#drupal-off-canvas');
+
+        if (isOffCanvas) {
+          offCanvasCss(element);
+        }
+      }).catch(function (error) {
+        console.error(error);
+      });
+    },
+    detach: function detach(element, format, trigger) {
+      var id = getElementId(element);
+      var editor = Drupal.CKEditor5Instances.get(id);
+
+      if (!editor) {
+        return;
+      }
+
+      if (trigger === 'serialize') {
+        editor.updateSourceElement();
+      } else {
+        element.removeAttribute('contentEditable');
+        var textElement = null;
+        var originalValue = null;
+        var usingQuickEdit = (((Drupal || {}).quickedit || {}).editors || {}).editor;
+
+        if (usingQuickEdit) {
+          Drupal.quickedit.editors.editor.prototype.revert = function revertQuickeditChanges() {
+            textElement = this.$textElement[0];
+            originalValue = this.model.get('originalValue');
+          };
+        }
+
+        editor.destroy().then(function () {
+          if (textElement && originalValue) {
+            textElement.innerHTML = originalValue;
+          }
+
+          Drupal.CKEditor5Instances.delete(id);
+          callbacks.delete(id);
+
+          if (required.has(id)) {
+            element.setAttribute('required', 'required');
+            required.delete(id);
+          }
+        }).catch(function (error) {
+          console.error(error);
+        });
+      }
+    },
+    onChange: function onChange(element, callback) {
+      callbacks.set(getElementId(element), callback);
+    },
+    attachInlineEditor: function attachInlineEditor(element, format, mainToolbarId) {
+      var editorDecoupled = CKEditor5.editorDecoupled;
+      var _format$editorSetting2 = format.editorSettings,
+          toolbar = _format$editorSetting2.toolbar,
+          plugins = _format$editorSetting2.plugins,
+          pluginConfig = _format$editorSetting2.config,
+          language = _format$editorSetting2.language;
+      var extraPlugins = selectPlugins(plugins);
+
+      var config = _objectSpread({
+        extraPlugins: extraPlugins,
+        toolbar: toolbar,
+        language: language
+      }, processConfig(pluginConfig));
+
+      var id = setElementId(element);
+      var DecoupledEditor = editorDecoupled.DecoupledEditor;
+      DecoupledEditor.create(element, config).then(function (editor) {
+        Drupal.CKEditor5Instances.set(id, editor);
+        var toolbar = document.getElementById(mainToolbarId);
+        toolbar.appendChild(editor.ui.view.toolbar.element);
+        editor.model.document.on('change:data', function () {
+          var callback = callbacks.get(id);
+
+          if (callback) {
+            debounce(callback, 400)(editor.getData());
+          }
+        });
+      }).catch(function (error) {
+        console.error(error);
+      });
+    }
+  };
+  Drupal.ckeditor5 = {
+    saveCallback: null,
+    openDialog: function openDialog(url, saveCallback, dialogSettings) {
+      var classes = dialogSettings.dialogClass ? dialogSettings.dialogClass.split(' ') : [];
+      classes.push('ui-dialog--narrow');
+      dialogSettings.dialogClass = classes.join(' ');
+      dialogSettings.autoResize = window.matchMedia('(min-width: 600px)').matches;
+      dialogSettings.width = 'auto';
+      var $content = $("<div class=\"ckeditor5-dialog-loading\"><span style=\"top: -40px;\" class=\"ckeditor5-dialog-loading-link\">".concat(Drupal.t('Loading...'), "</span></div>"));
+      $content.appendTo($('body'));
+      var ckeditorAjaxDialog = Drupal.ajax({
+        dialog: dialogSettings,
+        dialogType: 'modal',
+        selector: '.ckeditor5-dialog-loading-link',
+        url: url,
+        progress: {
+          type: 'throbber'
+        },
+        submit: {
+          editor_object: {}
+        }
+      });
+      ckeditorAjaxDialog.execute();
+      window.setTimeout(function () {
+        $content.find('span').animate({
+          top: '0px'
+        });
+      }, 1000);
+      Drupal.ckeditor5.saveCallback = saveCallback;
+    }
+  };
+  $(window).on('dialog:beforecreate', function () {
+    $('.ckeditor5-dialog-loading').animate({
+      top: '-40px'
+    }, function removeDialogLoading() {
+      $(this).remove();
+    });
+  });
+  $(window).on('editor:dialogsave', function (e, values) {
+    if (Drupal.ckeditor5.saveCallback) {
+      Drupal.ckeditor5.saveCallback(values);
+    }
+  });
+  $(window).on('dialog:afterclose', function () {
+    if (Drupal.ckeditor5.saveCallback) {
+      Drupal.ckeditor5.saveCallback = null;
+    }
+  });
+})(Drupal, Drupal.debounce, CKEditor5, jQuery);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalEmphasis/src/drupalemphasis.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalEmphasis/src/drupalemphasis.js
new file mode 100644
index 0000000000000000000000000000000000000000..8fc5bab54230641e91f13a43b5cd4e82f47315d1
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalEmphasis/src/drupalemphasis.js
@@ -0,0 +1,26 @@
+/* eslint-disable import/no-extraneous-dependencies */
+// cspell:ignore drupalemphasisediting
+
+import { Plugin } from 'ckeditor5/src/core';
+import DrupalEmphasisEditing from './drupalemphasisediting';
+
+/**
+ * @internal
+ */
+class DrupalEmphasis extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get requires() {
+    return [DrupalEmphasisEditing];
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalEmphasis';
+  }
+}
+
+export default DrupalEmphasis;
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalEmphasis/src/drupalemphasisediting.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalEmphasis/src/drupalemphasisediting.js
new file mode 100644
index 0000000000000000000000000000000000000000..aba92b33e8fc236e6f7d8e9103df96805fedcd39
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalEmphasis/src/drupalemphasisediting.js
@@ -0,0 +1,30 @@
+/* eslint-disable import/no-extraneous-dependencies */
+import { Plugin } from 'ckeditor5/src/core';
+
+/**
+ * @internal
+ */
+/**
+ * Converts italic text into em.
+ */
+class DrupalEmphasisEditing extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalEmphasisEditing';
+  }
+
+  /**
+   * @inheritdoc
+   */
+  init() {
+    this.editor.conversion.for('downcast').attributeToElement({
+      model: 'italic',
+      view: 'em',
+      converterPriority: 'high',
+    });
+  }
+}
+
+export default DrupalEmphasisEditing;
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalEmphasis/src/index.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalEmphasis/src/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..b557f9d2ee59c96c0f310c3ae2bbdf732f5902bf
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalEmphasis/src/index.js
@@ -0,0 +1,10 @@
+// cspell:ignore drupalemphasis
+
+import DrupalEmphasis from './drupalemphasis';
+
+/**
+ * @internal
+ */
+export default {
+  DrupalEmphasis,
+};
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalHtmlEngine/src/drupalhtmlbuilder.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalHtmlEngine/src/drupalhtmlbuilder.js
new file mode 100644
index 0000000000000000000000000000000000000000..1bdf25e1bdc7e91d08cfc3ec3989f17f35465b8a
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalHtmlEngine/src/drupalhtmlbuilder.js
@@ -0,0 +1,176 @@
+// cSpell:words apos
+
+/**
+ * HTML builder that converts document fragments into strings.
+ *
+ * @internal
+ */
+export default class DrupalHtmlBuilder {
+  /**
+   * Constructs a new object.
+   */
+  constructor() {
+    this.chunks = [];
+    // @see https://html.spec.whatwg.org/multipage/syntax.html#elements-2
+    this.selfClosingTags = [
+      'area',
+      'base',
+      'br',
+      'col',
+      'embed',
+      'hr',
+      'img',
+      'input',
+      'link',
+      'meta',
+      'param',
+      'source',
+      'track',
+      'wbr',
+    ];
+  }
+
+  /**
+   * Returns the current HTML string built from document fragments.
+   *
+   * @return {string}
+   *   The HTML string built from document fragments.
+   */
+  build() {
+    return this.chunks.join('');
+  }
+
+  /**
+   * Converts document fragment into HTML string and appends to the value.
+   *
+   * @param {DocumentFragment} node
+   *   A document fragment to be appended to the value.
+   */
+  appendNode(node) {
+    if (node.nodeType === Node.TEXT_NODE) {
+      this._appendText(node);
+    } else if (node.nodeType === Node.ELEMENT_NODE) {
+      this._appendElement(node);
+    } else if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
+      this._appendChildren(node);
+    }
+  }
+
+  /**
+   * Appends element node to the value.
+   *
+   * @param {DocumentFragment} node
+   *   A document fragment to be appended to the value.
+   *
+   * @private
+   */
+  _appendElement(node) {
+    const nodeName = node.nodeName.toLowerCase();
+
+    this._append('<');
+    this._append(nodeName);
+    this._appendAttributes(node);
+    this._append('>');
+    if (!this.selfClosingTags.includes(nodeName)) {
+      this._appendChildren(node);
+      this._append('</');
+      this._append(nodeName);
+      this._append('>');
+    }
+  }
+
+  /**
+   * Appends child nodes to the value.
+   *
+   * @param {DocumentFragment} node
+   *  A document fragment to be appended to the value.
+   *
+   * @private
+   */
+  _appendChildren(node) {
+    Object.keys(node.childNodes).forEach((child) => {
+      this.appendNode(node.childNodes[child]);
+    });
+  }
+
+  /**
+   * Appends attributes to the value.
+   *
+   * @param {DocumentFragment} node
+   *  A document fragment to be appended to the value.
+   *
+   * @private
+   */
+  _appendAttributes(node) {
+    Object.keys(node.attributes).forEach((attr) => {
+      this._append(' ');
+      this._append(node.attributes[attr].name);
+      this._append('="');
+      this._append(
+        this.constructor._escapeAttribute(node.attributes[attr].value),
+      );
+      this._append('"');
+    });
+  }
+
+  /**
+   * Appends text to the value.
+   *
+   * @param {DocumentFragment} node
+   *  A document fragment to be appended to the value.
+   *
+   * @private
+   */
+  _appendText(node) {
+    // Text node doesn't have innerHTML property and textContent doesn't encode
+    // entities. That's why the text is repacked into another node and extracted
+    // using innerHTML.
+    const doc = document.implementation.createHTMLDocument('');
+    const container = doc.createElement('p');
+    container.textContent = node.textContent;
+
+    this._append(container.innerHTML);
+  }
+
+  /**
+   * Appends string to the value.
+   *
+   * @param {string} str
+   *  A string to be appended to the value.
+   *
+   * @private
+   */
+  _append(str) {
+    this.chunks.push(str);
+  }
+
+  /**
+   * Escapes attribute value for compatibility with Drupal's XSS filtering.
+   *
+   * Drupal's XSS filtering cannot handle entities inside element attribute
+   * values. The XSS filtering was written based on W3C XML recommendations
+   * which constituted that the ampersand character (&) and the angle
+   * brackets (< and >) must not appear in their literal form in attribute
+   * values. This differs from the HTML living standard which permits angle
+   * brackets.
+   *
+   * @param {string} text
+   *  A string to be escaped.
+   *
+   * @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-AttValue
+   * @see https://html.spec.whatwg.org/multipage/parsing.html#attribute-value-(single-quoted)-state
+   * @see https://www.drupal.org/project/drupal/issues/3227831
+   *
+   * @private
+   */
+  static _escapeAttribute(text) {
+    return text
+      .replace(/&/g, '&amp;')
+      .replace(/'/g, '&apos;')
+      .replace(/"/g, '&quot;')
+      .replace(/</g, '&lt;')
+      .replace(/>/g, '&gt;')
+      .replace(/\r\n/g, '&#13;')
+      .replace(/[\r\n]/g, '&#13;');
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalHtmlEngine/src/drupalhtmlengine.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalHtmlEngine/src/drupalhtmlengine.js
new file mode 100644
index 0000000000000000000000000000000000000000..6b101b32604bbb12069f69a8befe3541e50726a5
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalHtmlEngine/src/drupalhtmlengine.js
@@ -0,0 +1,35 @@
+/* eslint-disable import/no-extraneous-dependencies */
+// cSpell:words drupalhtmlwriter
+import { Plugin } from 'ckeditor5/src/core';
+import DrupalHtmlWriter from './drupalhtmlwriter';
+
+/**
+ * A plugin that overrides the CKEditor HTML writer.
+ *
+ * Override the CKEditor 5 HTML writer to escape ampersand characters (&) and
+ * the angle brackets (< and >). This is required because
+ * \Drupal\Component\Utility\Xss::filter fails to parse element attributes with
+ * unescaped entities in value.
+ *
+ * @see https://www.drupal.org/project/drupal/issues/3227831
+ * @see DrupalHtmlBuilder._escapeAttribute
+ *
+ * @internal
+ */
+class DrupalHtmlEngine extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  init() {
+    this.editor.data.processor.htmlWriter = new DrupalHtmlWriter();
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalHtmlEngine';
+  }
+}
+
+export default DrupalHtmlEngine;
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalHtmlEngine/src/drupalhtmlwriter.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalHtmlEngine/src/drupalhtmlwriter.js
new file mode 100644
index 0000000000000000000000000000000000000000..56fe94ff18e0308ddd6a666b0ff6a6b82ecd6204
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalHtmlEngine/src/drupalhtmlwriter.js
@@ -0,0 +1,31 @@
+// cSpell:words drupalhtmlbuilder dataprocessor basichtmlwriter htmlwriter
+import DrupalHtmlBuilder from './drupalhtmlbuilder';
+
+/**
+ * Custom HTML writer. It creates HTML by traversing DOM nodes.
+ *
+ * It differs to BasicHtmlWriter in the way it encodes entities in element
+ * attributes.
+ *
+ * @see module:engine/dataprocessor/basichtmlwriter~BasicHtmlWriter
+ * @implements {module:engine/dataprocessor/htmlwriter~HtmlWriter}
+ *
+ * @see https://www.drupal.org/project/drupal/issues/3227831
+ *
+ * @internal
+ */
+export default class DrupalHtmlWriter {
+  /**
+   * Returns an HTML string created from the document fragment.
+   *
+   * @param {DocumentFragment} fragment
+   * @return {String}
+   */
+  // eslint-disable-next-line class-methods-use-this
+  getHtml(fragment) {
+    const builder = new DrupalHtmlBuilder();
+    builder.appendNode(fragment);
+
+    return builder.build();
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalHtmlEngine/src/index.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalHtmlEngine/src/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..f58f6764fd0a5b7549ea2f63b1ef42c0c2ca5f6f
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalHtmlEngine/src/index.js
@@ -0,0 +1,9 @@
+// cspell:ignore drupalengine drupalhtmlengine
+import DrupalHtmlEngine from './drupalhtmlengine';
+
+/**
+ * @internal
+ */
+export default {
+  DrupalHtmlEngine,
+};
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/README.md b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..d127535e5c5deb491e5a18cc97bc5dc84873eced
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/README.md
@@ -0,0 +1,16 @@
+# ckeditor5-drupal-image
+
+Drupal image plugin for CKEditor5
+
+Provides required attributes `data-entity-uuid` and `data-entity-type`.
+
+## Usage
+
+This project is for creating minified js for [Drupal CKEditor5](http://drupal.org/project/ckeditor5)
+
+## Build
+
+Run `npm run build:dll` to create the minified js.
+
+Check the file path in `webpack.config.js` to ensure it points to the dll
+manifest in your copy of `ckeditor5`.
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/drupalimage.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/drupalimage.js
new file mode 100644
index 0000000000000000000000000000000000000000..88de3fc0f485e51ee0695bd7d81e38485c28198e
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/drupalimage.js
@@ -0,0 +1,26 @@
+/* eslint-disable import/no-extraneous-dependencies */
+/* cspell:words drupalimageediting */
+
+import { Plugin } from 'ckeditor5/src/core';
+import DrupalImageEditing from './drupalimageediting';
+
+/**
+ * @internal
+ */
+class DrupalImage extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get requires() {
+    return [DrupalImageEditing];
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalImage';
+  }
+}
+
+export default DrupalImage;
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/drupalimageediting.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/drupalimageediting.js
new file mode 100644
index 0000000000000000000000000000000000000000..5fc34039dce7dd42d1588c1c4f1346a8a188d2a0
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/drupalimageediting.js
@@ -0,0 +1,521 @@
+/* eslint-disable import/no-extraneous-dependencies */
+// cSpell:words conversionutils downcasted linkimageediting
+import { Plugin } from 'ckeditor5/src/core';
+import { setViewAttributes } from '@ckeditor/ckeditor5-html-support/src/conversionutils';
+
+function createImageViewElement(writer) {
+  return writer.createEmptyElement('img');
+}
+
+function modelEntityUuidToDataAttribute() {
+  function converter(evt, data, conversionApi) {
+    const { item } = data;
+    const { consumable, writer } = conversionApi;
+
+    if (!consumable.consume(item, evt.name)) {
+      return;
+    }
+
+    const viewElement = conversionApi.mapper.toViewElement(item);
+    const imageInFigure = Array.from(viewElement.getChildren()).find(
+      (child) => child.name === 'img',
+    );
+
+    writer.setAttribute(
+      'data-entity-uuid',
+      data.attributeNewValue,
+      imageInFigure || viewElement,
+    );
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('attribute:dataEntityUuid', converter);
+  };
+}
+
+// Downcast `caption` model to `data-caption` attribute with its content
+// downcasted to plain HTML. This is needed because CKEditor 5 uses <caption>
+// element internally in various places, which differs from Drupal which uses
+// an attribute. For now to support that we have to manually repeat work done in
+// the DowncastDispatcher's private methods.
+function viewCaptionToCaptionAttribute(editor) {
+  return (dispatcher) => {
+    dispatcher.on(
+      'insert:caption',
+      (evt, data, conversionApi) => {
+        const { consumable, writer, mapper } = conversionApi;
+        if (!consumable.consume(data.item, 'insert')) {
+          return;
+        }
+
+        const range = editor.model.createRangeIn(data.item);
+        const viewDocumentFragment = writer.createDocumentFragment();
+
+        // Bind caption model element to the detached view document fragment so
+        // all content of the caption will be downcasted into that document
+        // fragment.
+        mapper.bindElements(data.item, viewDocumentFragment);
+
+        // eslint-disable-next-line no-restricted-syntax
+        for (const { item } of Array.from(range)) {
+          const itemData = {
+            item,
+            range: editor.model.createRangeOn(item),
+          };
+
+          // The following lines are extracted from
+          // DowncastDispatcher._convertInsertWithAttributes().
+          const eventName = `insert:${item.name || '$text'}`;
+
+          editor.data.downcastDispatcher.fire(
+            eventName,
+            itemData,
+            conversionApi,
+          );
+
+          // eslint-disable-next-line no-restricted-syntax
+          for (const key of item.getAttributeKeys()) {
+            Object.assign(itemData, {
+              attributeKey: key,
+              attributeOldValue: null,
+              attributeNewValue: itemData.item.getAttribute(key),
+            });
+
+            editor.data.downcastDispatcher.fire(
+              `attribute:${key}`,
+              itemData,
+              conversionApi,
+            );
+          }
+        }
+
+        // Unbind all the view elements that were downcasted to the document
+        // fragment.
+        // eslint-disable-next-line no-restricted-syntax
+        for (const child of writer
+          .createRangeIn(viewDocumentFragment)
+          .getItems()) {
+          mapper.unbindViewElement(child);
+        }
+
+        mapper.unbindViewElement(viewDocumentFragment);
+
+        // Stringify view document fragment to HTML string.
+        const captionText = editor.data.processor.toData(viewDocumentFragment);
+
+        if (captionText) {
+          const imageViewElement = mapper.toViewElement(data.item.parent);
+
+          writer.setAttribute('data-caption', captionText, imageViewElement);
+        }
+      },
+      // Override default caption converter.
+      { priority: 'high' },
+    );
+  };
+}
+
+function modelEntityTypeToDataAttribute() {
+  function converter(evt, data, conversionApi) {
+    const { item } = data;
+    const { consumable, writer } = conversionApi;
+
+    if (!consumable.consume(item, evt.name)) {
+      return;
+    }
+
+    const viewElement = conversionApi.mapper.toViewElement(item);
+    const imageInFigure = Array.from(viewElement.getChildren()).find(
+      (child) => child.name === 'img',
+    );
+
+    writer.setAttribute(
+      'data-entity-type',
+      data.attributeNewValue,
+      imageInFigure || viewElement,
+    );
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('attribute:dataEntityType', converter);
+  };
+}
+
+function modelImageStyleToDataAttribute() {
+  function converter(evt, data, conversionApi) {
+    const { item } = data;
+    const { consumable, writer } = conversionApi;
+
+    const mapping = {
+      alignLeft: 'left',
+      alignRight: 'right',
+      alignCenter: 'center',
+      alignBlockRight: 'right',
+      alignBlockLeft: 'left',
+    };
+
+    // Consume only for the values that can be converted into data-align.
+    if (
+      !mapping[data.attributeNewValue] ||
+      !consumable.consume(item, evt.name)
+    ) {
+      return;
+    }
+
+    const viewElement = conversionApi.mapper.toViewElement(item);
+    const imageInFigure = Array.from(viewElement.getChildren()).find(
+      (child) => child.name === 'img',
+    );
+
+    writer.setAttribute(
+      'data-align',
+      mapping[data.attributeNewValue],
+      imageInFigure || viewElement,
+    );
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('attribute:imageStyle', converter, { priority: 'high' });
+  };
+}
+
+function modelImageWidthToAttribute() {
+  function converter(evt, data, conversionApi) {
+    const { item } = data;
+    const { consumable, writer } = conversionApi;
+
+    if (!consumable.consume(item, evt.name)) {
+      return;
+    }
+
+    const viewElement = conversionApi.mapper.toViewElement(item);
+    const imageInFigure = Array.from(viewElement.getChildren()).find(
+      (child) => child.name === 'img',
+    );
+
+    writer.setAttribute(
+      'width',
+      data.attributeNewValue.replace('px', ''),
+      imageInFigure || viewElement,
+    );
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('attribute:width:imageInline', converter, {
+      priority: 'high',
+    });
+    dispatcher.on('attribute:width:imageBlock', converter, {
+      priority: 'high',
+    });
+  };
+}
+
+function modelImageHeightToAttribute() {
+  function converter(evt, data, conversionApi) {
+    const { item } = data;
+    const { consumable, writer } = conversionApi;
+
+    if (!consumable.consume(item, evt.name)) {
+      return;
+    }
+
+    const viewElement = conversionApi.mapper.toViewElement(item);
+    const imageInFigure = Array.from(viewElement.getChildren()).find(
+      (child) => child.name === 'img',
+    );
+
+    writer.setAttribute(
+      'height',
+      data.attributeNewValue.replace('px', ''),
+      imageInFigure || viewElement,
+    );
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('attribute:height:imageInline', converter, {
+      priority: 'high',
+    });
+    dispatcher.on('attribute:height:imageBlock', converter, {
+      priority: 'high',
+    });
+  };
+}
+
+function viewImageToModelImage(editor) {
+  function converter(evt, data, conversionApi) {
+    const { viewItem } = data;
+    const { writer, consumable, safeInsert, updateConversionResult, schema } =
+      conversionApi;
+    const attributesToConsume = [];
+
+    let image;
+
+    // Not only check if a given `img` view element has been consumed, but also
+    // verify it has `src` attribute present.
+    if (!consumable.test(viewItem, { name: true, attributes: 'src' })) {
+      return;
+    }
+
+    // Create image that's allowed in the given context.
+    if (schema.checkChild(data.modelCursor, 'imageInline')) {
+      image = writer.createElement('imageInline', {
+        src: viewItem.getAttribute('src'),
+      });
+    } else {
+      image = writer.createElement('imageBlock', {
+        src: viewItem.getAttribute('src'),
+      });
+    }
+
+    if (
+      editor.plugins.has('ImageStyleEditing') &&
+      consumable.test(viewItem, { name: true, attributes: 'data-align' })
+    ) {
+      // https://ckeditor.com/docs/ckeditor5/latest/api/module_image_imagestyle_utils.html#constant-defaultStyles
+      const dataToPresentationMapBlock = {
+        left: 'alignBlockLeft',
+        center: 'alignCenter',
+        right: 'alignBlockRight',
+      };
+      const dataToPresentationMapInline = {
+        left: 'alignLeft',
+        right: 'alignRight',
+      };
+
+      const dataAlign = viewItem.getAttribute('data-align');
+      const alignment = image.is('element', 'imageBlock')
+        ? dataToPresentationMapBlock[dataAlign]
+        : dataToPresentationMapInline[dataAlign];
+
+      writer.setAttribute('imageStyle', alignment, image);
+
+      // Make sure the attribute can be consumed after successful `safeInsert`
+      // operation.
+      attributesToConsume.push('data-align');
+    }
+
+    // Check if the view element has still unconsumed `data-caption` attribute.
+    // Also, we can add caption only to block image.
+    if (
+      image.is('element', 'imageBlock') &&
+      consumable.test(viewItem, { name: true, attributes: 'data-caption' })
+    ) {
+      // Create `caption` model element. Thanks to that element the rest of the
+      // `ckeditor5-plugin` converters can recognize this image as a block image
+      // with a caption.
+      const caption = writer.createElement('caption');
+
+      // Parse HTML from data-caption attribute and upcast it to model fragment.
+      const viewFragment = editor.data.processor.toView(
+        viewItem.getAttribute('data-caption'),
+      );
+      const modelFragment = writer.createDocumentFragment();
+
+      // Consumable must know about those newly parsed view elements.
+      conversionApi.consumable.constructor.createFrom(
+        viewFragment,
+        conversionApi.consumable,
+      );
+      conversionApi.convertChildren(viewFragment, modelFragment);
+
+      // Insert caption model nodes into the caption.
+      // eslint-disable-next-line no-restricted-syntax
+      for (const child of Array.from(modelFragment.getChildren())) {
+        writer.append(child, caption);
+      }
+
+      // Insert the caption element into image, as a last child.
+      writer.append(caption, image);
+
+      // Make sure the attribute can be consumed after successful `safeInsert`
+      // operation.
+      attributesToConsume.push('data-caption');
+    }
+
+    if (
+      consumable.test(viewItem, { name: true, attributes: 'data-entity-uuid' })
+    ) {
+      writer.setAttribute(
+        'dataEntityUuid',
+        viewItem.getAttribute('data-entity-uuid'),
+        image,
+      );
+      attributesToConsume.push('data-entity-uuid');
+    }
+
+    if (
+      consumable.test(viewItem, { name: true, attributes: 'data-entity-type' })
+    ) {
+      writer.setAttribute(
+        'dataEntityType',
+        viewItem.getAttribute('data-entity-type'),
+        image,
+      );
+      attributesToConsume.push('data-entity-type');
+    }
+
+    // Try to place the image in the allowed position.
+    if (!safeInsert(image, data.modelCursor)) {
+      return;
+    }
+
+    // Mark given element as consumed. Now other converters will not process it
+    // anymore.
+    consumable.consume(viewItem, {
+      name: true,
+      attributes: attributesToConsume,
+    });
+
+    // Make sure `modelRange` and `modelCursor` is up to date after inserting
+    // new nodes into the model.
+    updateConversionResult(image, data);
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('element:img', converter, { priority: 'high' });
+  };
+}
+
+// Modified alternative implementation of linkimageediting.js' downcastImageLink.
+function downcastBlockImageLink() {
+  function converter(evt, data, conversionApi) {
+    if (!conversionApi.consumable.consume(data.item, evt.name)) {
+      return;
+    }
+
+    // The image will be already converted - so it will be present in the view.
+    const image = conversionApi.mapper.toViewElement(data.item);
+    const writer = conversionApi.writer;
+
+    // 1. Create an empty link element.
+    const linkElement = writer.createContainerElement('a', {
+      href: data.attributeNewValue,
+    });
+    // 2. Insert link before the associated image.
+    writer.insert(writer.createPositionBefore(image), linkElement);
+    // 3. Move the image into the link.
+    writer.move(
+      writer.createRangeOn(image),
+      writer.createPositionAt(linkElement, 0),
+    );
+
+    // Modified alternative implementation of GHS' addBlockImageLinkAttributeConversion().
+    // This is happening here as well to avoid a race condition with the link
+    // element not yet existing.
+    if (
+      conversionApi.consumable.consume(
+        data.item,
+        'attribute:htmlLinkAttributes:imageBlock',
+      )
+    ) {
+      setViewAttributes(
+        conversionApi.writer,
+        data.item.getAttribute('htmlLinkAttributes'),
+        linkElement,
+      );
+    }
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('attribute:linkHref:imageBlock', converter, {
+      priority: 'high',
+    });
+  };
+}
+
+/**
+ * @internal
+ */
+export default class DrupalImageEditing extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalImageEditing';
+  }
+
+  /**
+   * @inheritdoc
+   */
+  init() {
+    const { editor } = this;
+    const { conversion } = editor;
+    const { schema } = editor.model;
+
+    if (schema.isRegistered('imageInline')) {
+      schema.extend('imageInline', {
+        allowAttributes: [
+          'dataEntityUuid',
+          'dataEntityType',
+          'width',
+          'height',
+        ],
+      });
+    }
+
+    if (schema.isRegistered('imageBlock')) {
+      schema.extend('imageBlock', {
+        allowAttributes: [
+          'dataEntityUuid',
+          'dataEntityType',
+          'width',
+          'height',
+        ],
+      });
+    }
+
+    // Conversion.
+    conversion
+      .for('upcast')
+      .add(viewImageToModelImage(editor))
+      .attributeToAttribute({
+        view: {
+          name: 'img',
+          key: 'width',
+        },
+        model: {
+          key: 'width',
+          value: (viewElement) => {
+            return `${viewElement.getAttribute('width')}px`;
+          },
+        },
+      })
+      .attributeToAttribute({
+        view: {
+          name: 'img',
+          key: 'height',
+        },
+        model: {
+          key: 'height',
+          value: (viewElement) => {
+            return `${viewElement.getAttribute('height')}px`;
+          },
+        },
+      });
+
+    conversion
+      .for('downcast')
+      .add(modelEntityUuidToDataAttribute())
+      .add(modelEntityTypeToDataAttribute());
+
+    conversion
+      .for('dataDowncast')
+      .add(viewCaptionToCaptionAttribute(editor))
+      .elementToElement({
+        model: 'imageBlock',
+        view: (modelElement, { writer }) =>
+          createImageViewElement(writer, 'imageBlock'),
+        converterPriority: 'high',
+      })
+      .elementToElement({
+        model: 'imageInline',
+        view: (modelElement, { writer }) =>
+          createImageViewElement(writer, 'imageInline'),
+        converterPriority: 'high',
+      })
+      .add(modelImageStyleToDataAttribute())
+      .add(modelImageWidthToAttribute())
+      .add(modelImageHeightToAttribute())
+      .add(downcastBlockImageLink());
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/imageupload/drupalfilerepository.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/imageupload/drupalfilerepository.js
new file mode 100644
index 0000000000000000000000000000000000000000..3f0d1ca5ccaa1fb7b19128cc2f54d6e72eba0685
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/imageupload/drupalfilerepository.js
@@ -0,0 +1,47 @@
+/* eslint-disable import/no-extraneous-dependencies */
+/* cspell:words uploadurl drupalimageuploadadapter  */
+
+import { Plugin } from 'ckeditor5/src/core';
+import { FileRepository } from 'ckeditor5/src/upload';
+import { logWarning } from 'ckeditor5/src/utils';
+import DrupalImageUploadAdapter from './drupalimageuploadadapter';
+
+/**
+ * @internal
+ */
+export default class DrupalFileRepository extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get requires() {
+    return [FileRepository];
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalFileRepository';
+  }
+
+  /**
+   * @inheritdoc
+   */
+  init() {
+    const options = this.editor.config.get('drupalImageUpload');
+
+    if (!options) {
+      return;
+    }
+
+    if (!options.uploadUrl) {
+      logWarning('simple-upload-adapter-missing-uploadurl');
+
+      return;
+    }
+
+    this.editor.plugins.get(FileRepository).createUploadAdapter = (loader) => {
+      return new DrupalImageUploadAdapter(loader, options);
+    };
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/imageupload/drupalimageupload.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/imageupload/drupalimageupload.js
new file mode 100644
index 0000000000000000000000000000000000000000..9123242e61d58d6e33cf1148442d0951c3e1d0f2
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/imageupload/drupalimageupload.js
@@ -0,0 +1,29 @@
+/* eslint-disable import/no-extraneous-dependencies */
+/* cspell:words drupalimageuploadediting drupalfilerepository */
+
+import { Plugin } from 'ckeditor5/src/core';
+import DrupalImageUploadEditing from './drupalimageuploadediting';
+import DrupalFileRepository from './drupalfilerepository';
+
+/**
+ * Integrates the CKEditor image upload with the Drupal.
+ *
+ * @internal
+ */
+class DrupalImageUpload extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get requires() {
+    return [DrupalFileRepository, DrupalImageUploadEditing];
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalImageUpload';
+  }
+}
+
+export default DrupalImageUpload;
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/imageupload/drupalimageuploadadapter.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/imageupload/drupalimageuploadadapter.js
new file mode 100644
index 0000000000000000000000000000000000000000..5986432a523f7994b0f5a476ca282464a003bf8d
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/imageupload/drupalimageuploadadapter.js
@@ -0,0 +1,148 @@
+/* eslint-disable import/no-extraneous-dependencies */
+/* cspell:words simpleuploadadapter filerepository */
+
+/**
+ * Upload adapter. Copied from @ckeditor5/ckeditor5-upload/src/adapters/simpleuploadadapter
+ *
+ * @internal
+ * @implements {module:upload/filerepository~UploadAdapter}
+ */
+export default class DrupalImageUploadAdapter {
+  /**
+   * Creates a new adapter instance.
+   *
+   * @param {module:upload/filerepository~FileLoader} loader
+   *   The file loader.
+   * @param {module:upload/adapters/simpleuploadadapter~SimpleUploadConfig} options
+   *   The upload options.
+   */
+  constructor(loader, options) {
+    /**
+     * FileLoader instance to use during the upload.
+     *
+     * @member {module:upload/filerepository~FileLoader} #loader
+     */
+    this.loader = loader;
+
+    /**
+     * The configuration of the adapter.
+     *
+     * @member {module:upload/adapters/simpleuploadadapter~SimpleUploadConfig} #options
+     */
+    this.options = options;
+  }
+
+  /**
+   * Starts the upload process.
+   *
+   * @see module:upload/filerepository~UploadAdapter#upload
+   * @return {Promise}
+   *   Promise that the upload will be processed.
+   */
+  upload() {
+    return this.loader.file.then(
+      (file) =>
+        new Promise((resolve, reject) => {
+          this._initRequest();
+          this._initListeners(resolve, reject, file);
+          this._sendRequest(file);
+        }),
+    );
+  }
+
+  /**
+   * Aborts the upload process.
+   *
+   * @see module:upload/filerepository~UploadAdapter#abort
+   */
+  abort() {
+    if (this.xhr) {
+      this.xhr.abort();
+    }
+  }
+
+  /**
+   * Initializes the `XMLHttpRequest` object using the URL specified as
+   *
+   * {@link module:upload/adapters/simpleuploadadapter~SimpleUploadConfig#uploadUrl `simpleUpload.uploadUrl`} in the editor's
+   * configuration.
+   */
+  _initRequest() {
+    this.xhr = new XMLHttpRequest();
+
+    this.xhr.open('POST', this.options.uploadUrl, true);
+    this.xhr.responseType = 'json';
+  }
+
+  /**
+   * Initializes XMLHttpRequest listeners
+   *
+   * @private
+   * @param {Function} resolve Callback function to be called when the request is successful.
+   * @param {Function} reject Callback function to be called when the request cannot be completed.
+   * @param {File} file Native File object.
+   */
+  _initListeners(resolve, reject, file) {
+    const xhr = this.xhr;
+    const loader = this.loader;
+    const genericErrorText = `Couldn't upload file: ${file.name}.`;
+
+    xhr.addEventListener('error', () => reject(genericErrorText));
+    xhr.addEventListener('abort', () => reject());
+    xhr.addEventListener('load', () => {
+      const response = xhr.response;
+
+      if (!response || response.error) {
+        return reject(
+          response && response.error && response.error.message
+            ? response.error.message
+            : genericErrorText,
+        );
+      }
+
+      resolve({
+        urls: { default: response.url },
+        dataEntityUuid: response.uuid ? response.uuid : '',
+        dataEntityType: response.entity_type ? response.entity_type : '',
+      });
+    });
+
+    // Upload progress when it is supported.
+    if (xhr.upload) {
+      xhr.upload.addEventListener('progress', (evt) => {
+        if (evt.lengthComputable) {
+          loader.uploadTotal = evt.total;
+          loader.uploaded = evt.loaded;
+        }
+      });
+    }
+  }
+
+  /**
+   * Prepares the data and sends the request.
+   *
+   * @param {File} file
+   *   File instance to be uploaded.
+   */
+  _sendRequest(file) {
+    // Set headers if specified.
+    const headers = this.options.headers || {};
+
+    // Use the withCredentials flag if specified.
+    const withCredentials = this.options.withCredentials || false;
+
+    Object.keys(headers).forEach((headerName) => {
+      this.xhr.setRequestHeader(headerName, headers[headerName]);
+    });
+
+    this.xhr.withCredentials = withCredentials;
+
+    // Prepare the form data.
+    const data = new FormData();
+
+    data.append('upload', file);
+
+    // Send the request.
+    this.xhr.send(data);
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/imageupload/drupalimageuploadediting.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/imageupload/drupalimageuploadediting.js
new file mode 100644
index 0000000000000000000000000000000000000000..61c43c55819b55db7dd1bfb66f72dbad0ee88004
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/imageupload/drupalimageuploadediting.js
@@ -0,0 +1,36 @@
+/* eslint-disable import/no-extraneous-dependencies */
+import { Plugin } from 'ckeditor5/src/core';
+
+/**
+ * @internal
+ */
+export default class DrupalImageUploadEditing extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  init() {
+    const { editor } = this;
+    const imageUploadEditing = editor.plugins.get('ImageUploadEditing');
+    imageUploadEditing.on('uploadComplete', (evt, { data, imageElement }) => {
+      editor.model.change((writer) => {
+        writer.setAttribute(
+          'dataEntityUuid',
+          data.dataEntityUuid,
+          imageElement,
+        );
+        writer.setAttribute(
+          'dataEntityType',
+          data.dataEntityType,
+          imageElement,
+        );
+      });
+    });
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalImageUploadEditing';
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/index.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..c7ca6898351da327daacdf610f88ad3bba8c1cef
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalImage/src/index.js
@@ -0,0 +1,12 @@
+// cspell:ignore imageupload imageresize drupalimage drupalimageupload drupalimageresize
+
+import DrupalImage from './drupalimage';
+import DrupalImageUpload from './imageupload/drupalimageupload';
+
+/**
+ * @internal
+ */
+export default {
+  DrupalImage,
+  DrupalImageUpload,
+};
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/README.md b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..60336a6afec500418ab44cbe1c2c0a18499f3251
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/README.md
@@ -0,0 +1,39 @@
+# ckeditor5-drupal-media
+
+Drupal media plugin for CKEditor5
+
+Provides required attributes `data-entity-uuid` and `data-entity-type`.
+
+## Usage
+
+This project is for creating minified js for [Drupal CKEditor5](http://drupal.org/project/ckeditor5)
+
+When using this plugin, you must provide the following config in `drupalMedia`:
+
+1. `libraryURL`: The URL at route media_library.ui to open a browse dialog
+2. `previewURL`: The URL at route media.filter.preview to render a media preview
+3. `openDialog`: The function to open a Drupal dialog
+4. `themeError`: The markup to display if the preview fails
+
+Example config:
+
+```
+ClassicEditor
+  .create(editorElement, {
+    drupalMedia: {
+      libraryURL: '/media-library?...',
+      previewURL: '/media/{filter_format}/preview',
+      openDialog: Drupal.ckeditor5.openDialog,
+      themeError: Drupal.theme('mediaEmbedPreviewError'),
+    },
+ });
+  .then( ... )
+  .catch( ... );
+```
+
+## Build
+
+Run `npm run dll:build` to create the minified js.
+
+Check the file path in `webpack.config.js` to ensure it points to the dll
+manifest in your copy of `ckeditor5`.
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupallinkmedia/drupallinkmedia.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupallinkmedia/drupallinkmedia.js
new file mode 100644
index 0000000000000000000000000000000000000000..4e0bffd505a8a809c0dc2eac803aeb5aa59e6475
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupallinkmedia/drupallinkmedia.js
@@ -0,0 +1,25 @@
+/* eslint-disable import/no-extraneous-dependencies */
+/* cspell:words drupallinkmediaediting drupallinkmediaui */
+
+import { Plugin } from 'ckeditor5/src/core';
+import DrupalLinkMediaEditing from './drupallinkmediaediting';
+import DrupalLinkMediaUI from './drupallinkmediaui';
+
+/**
+ * @internal
+ */
+export default class DrupalLinkMedia extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get requires() {
+    return [DrupalLinkMediaEditing, DrupalLinkMediaUI];
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalLinkMedia';
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupallinkmedia/drupallinkmediaediting.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupallinkmedia/drupallinkmediaediting.js
new file mode 100644
index 0000000000000000000000000000000000000000..1770fdd617805ae7c2f344213e923fc6ca82b076
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupallinkmedia/drupallinkmediaediting.js
@@ -0,0 +1,230 @@
+/* eslint-disable import/no-extraneous-dependencies */
+/* cspell:words drupallinkmediaediting linkediting */
+import { Plugin } from 'ckeditor5/src/core';
+
+/**
+ * Returns the first drupal-media element in a given view element.
+ *
+ * @param {module:engine/view/element~Element} viewElement
+ *   The view element.
+ *
+ * @return {module:engine/view/element~Element|undefined}
+ *   The first <drupal-media> element or undefined if the element doesn't have
+ *   <drupal-media> as a child element.
+ */
+function getFirstMedia(viewElement) {
+  return Array.from(viewElement.getChildren()).find(
+    (child) => child.name === 'drupal-media',
+  );
+}
+
+/**
+ * Returns a converter that consumes the `href` attribute if a link contains a <drupal-media>.
+ *
+ * @return {Function}
+ *   A function that adds an event listener to upcastDispatcher.
+ */
+function upcastMediaLink() {
+  return (dispatcher) => {
+    dispatcher.on(
+      'element:a',
+      (evt, data, conversionApi) => {
+        const viewLink = data.viewItem;
+        const mediaInLink = getFirstMedia(viewLink);
+
+        if (!mediaInLink) {
+          return;
+        }
+
+        // There's an <drupal-media> inside an <a> element - we consume it so it
+        // won't be picked up by the Link plugin.
+        const consumableAttributes = { attributes: ['href'] };
+
+        // Consume the `href` attribute so the default one will not convert it to
+        // $text attribute.
+        if (!conversionApi.consumable.consume(viewLink, consumableAttributes)) {
+          // Might be consumed by something else - i.e. other converter with
+          // priority=highest - a standard check.
+          return;
+        }
+
+        const linkHref = viewLink.getAttribute('href');
+
+        // Missing the `href` attribute.
+        if (!linkHref) {
+          return;
+        }
+
+        const conversionResult = conversionApi.convertItem(
+          mediaInLink,
+          data.modelCursor,
+        );
+
+        // Set media range as conversion result.
+        data.modelRange = conversionResult.modelRange;
+
+        // Continue conversion where <drupal-media> conversion ends.
+        data.modelCursor = conversionResult.modelCursor;
+
+        const modelElement = data.modelCursor.nodeBefore;
+
+        if (modelElement && modelElement.is('element', 'drupalMedia')) {
+          // Set the `linkHref` attribute from <a> element on model drupalMedia
+          // element.
+          conversionApi.writer.setAttribute('linkHref', linkHref, modelElement);
+        }
+      },
+      { priority: 'high' },
+    );
+  };
+}
+
+/**
+ * Return a converter that adds the <a> element to view data.
+ *
+ * @return {Function}
+ *   A function that adds an event listener to downcastDispatcher.
+ */
+function dataDowncastMediaLink() {
+  return (dispatcher) => {
+    dispatcher.on(
+      'attribute:linkHref:drupalMedia',
+      (evt, data, conversionApi) => {
+        const { writer } = conversionApi;
+        if (!conversionApi.consumable.consume(data.item, evt.name)) {
+          return;
+        }
+
+        // The drupalMedia will be already converted - so it will be present in
+        // the view.
+        const mediaElement = conversionApi.mapper.toViewElement(data.item);
+
+        // If so, update the attribute if it's defined or remove the entire link
+        // if the attribute is empty. But if it does not exist. Let's wrap already
+        // converted drupalMedia by newly created link element.
+        // 1. Create an empty <a> element.
+        const linkElement = writer.createContainerElement('a', {
+          href: data.attributeNewValue,
+        });
+
+        // 2. Insert <a> before the <drupal-media> element.
+        writer.insert(writer.createPositionBefore(mediaElement), linkElement);
+
+        // 3. Move the drupal-media element inside the <a>.
+        writer.move(
+          writer.createRangeOn(mediaElement),
+          writer.createPositionAt(linkElement, 0),
+        );
+      },
+      { priority: 'high' },
+    );
+  };
+}
+
+/**
+ * Return a converter that adds the <a> element to editing view.
+ *
+ * @return {Function}
+ *   A function that adds an event listener to downcastDispatcher.
+ *
+ * @see https://github.com/ckeditor/ckeditor5/blob/v31.0.0/packages/ckeditor5-link/src/linkimageediting.js#L180
+ */
+function editingDowncastMediaLink() {
+  return (dispatcher) => {
+    dispatcher.on(
+      'attribute:linkHref:drupalMedia',
+      (evt, data, conversionApi) => {
+        const { writer } = conversionApi;
+        if (!conversionApi.consumable.consume(data.item, evt.name)) {
+          return;
+        }
+
+        // The drupalMedia will be already converted - so it will be present in
+        // the view.
+        const mediaContainer = conversionApi.mapper.toViewElement(data.item);
+        const linkInMedia = Array.from(mediaContainer.getChildren()).find(
+          (child) => child.name === 'a',
+        );
+
+        // If link already exists, instead of creating new link from scratch,
+        // update the existing link. This makes the UI rendering much smoother.
+        if (linkInMedia) {
+          // If attribute has a new value, update it. If new value doesn't exist,
+          // the link will be removed.
+          if (data.attributeNewValue) {
+            writer.setAttribute('href', data.attributeNewValue, linkInMedia);
+          } else {
+            // This is triggering elementToElement conversion for drupalMedia
+            // element which makes caused re-render of the media preview, making
+            // the media preview flicker once when media is unlinked.
+            // @todo ensure that this doesn't cause flickering after
+            //   https://www.drupal.org/i/3246380 has been addressed.
+            writer.move(
+              writer.createRangeIn(linkInMedia),
+              writer.createPositionAt(mediaContainer, 0),
+            );
+            writer.remove(linkInMedia);
+          }
+        } else {
+          const mediaPreview = Array.from(mediaContainer.getChildren()).find(
+            (child) => child.getAttribute('data-drupal-media-preview'),
+          );
+          // 1. Create an empty <a> element.
+          const linkElement = writer.createContainerElement('a', {
+            href: data.attributeNewValue,
+          });
+
+          // 2. Insert <a> inside the media container.
+          writer.insert(
+            writer.createPositionAt(mediaContainer, 0),
+            linkElement,
+          );
+
+          // 3. Move the media preview inside the <a>.
+          writer.move(
+            writer.createRangeOn(mediaPreview),
+            writer.createPositionAt(linkElement, 0),
+          );
+        }
+      },
+      { priority: 'high' },
+    );
+  };
+}
+
+/**
+ * Model to view and view to model conversions for linked media elements.
+ *
+ * @internal
+ *
+ * @see https://github.com/ckeditor/ckeditor5/blob/v31.0.0/packages/ckeditor5-link/src/linkimage.js
+ */
+export default class DrupalLinkMediaEditing extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get requires() {
+    return ['LinkEditing', 'DrupalMediaEditing'];
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalLinkMediaEditing';
+  }
+
+  /**
+   * @inheritdoc
+   */
+  init() {
+    const { editor } = this;
+    editor.model.schema.extend('drupalMedia', {
+      allowAttributes: ['linkHref'],
+    });
+
+    editor.conversion.for('upcast').add(upcastMediaLink());
+    editor.conversion.for('editingDowncast').add(editingDowncastMediaLink());
+    editor.conversion.for('dataDowncast').add(dataDowncastMediaLink());
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupallinkmedia/drupallinkmediaui.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupallinkmedia/drupallinkmediaui.js
new file mode 100644
index 0000000000000000000000000000000000000000..68a01a85b2c185e69e0fb945542e9439675962d4
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupallinkmedia/drupallinkmediaui.js
@@ -0,0 +1,112 @@
+/* eslint-disable import/no-extraneous-dependencies */
+// cSpell:words linkui
+import { Plugin } from 'ckeditor5/src/core';
+import { LINK_KEYSTROKE } from '@ckeditor/ckeditor5-link/src/utils';
+import { ButtonView } from 'ckeditor5/src/ui';
+import linkIcon from '../../../../../icons/link.svg';
+
+/**
+ * The link media UI plugin.
+ *
+ * @internal
+ */
+export default class DrupalLinkMediaUI extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get requires() {
+    return ['LinkEditing', 'LinkUI', 'DrupalMediaEditing'];
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalLinkMediaUi';
+  }
+
+  /**
+   * @inheritdoc
+   */
+  init() {
+    const { editor } = this;
+    const viewDocument = editor.editing.view.document;
+
+    this.listenTo(
+      viewDocument,
+      'click',
+      (evt, data) => {
+        if (this._isSelectedLinkedMedia(editor.model.document.selection)) {
+          // Prevent browser navigation when clicking a linked media.
+          data.preventDefault();
+
+          // Block the `LinkUI` plugin when a media was clicked. In such a case,
+          // we'd like to display the media toolbar.
+          evt.stop();
+        }
+      },
+      { priority: 'high' },
+    );
+    this._createToolbarLinkMediaButton();
+  }
+
+  /**
+   * Creates a `DrupalLinkMediaUI` button view.
+   *
+   * Clicking this button shows a {@link module:link/linkui~LinkUI#_balloon}
+   * attached to the selection. When an media is already linked, the view shows
+   * {@link module:link/linkui~LinkUI#actionsView} or
+   * {@link module:link/linkui~LinkUI#formView} if it is not.
+   */
+  _createToolbarLinkMediaButton() {
+    const { editor } = this;
+    const { t } = editor;
+
+    editor.ui.componentFactory.add('drupalLinkMedia', (locale) => {
+      const button = new ButtonView(locale);
+      const plugin = editor.plugins.get('LinkUI');
+      const linkCommand = editor.commands.get('link');
+
+      button.set({
+        isEnabled: true,
+        label: t('Link media'),
+        icon: linkIcon,
+        keystroke: LINK_KEYSTROKE,
+        tooltip: true,
+        isToggleable: true,
+      });
+
+      // Bind button to the command.
+      button.bind('isEnabled').to(linkCommand, 'isEnabled');
+      button.bind('isOn').to(linkCommand, 'value', (value) => !!value);
+
+      // Show the actionsView or formView (both from LinkUI) on button click
+      // depending on whether the media is already linked.
+      this.listenTo(button, 'execute', () => {
+        if (this._isSelectedLinkedMedia(editor.model.document.selection)) {
+          plugin._addActionsView();
+        } else {
+          plugin._showUI(true);
+        }
+      });
+
+      return button;
+    });
+  }
+
+  /**
+   * Returns true if a linked media is the only selected element in the model.
+   *
+   * @param {module:engine/model/selection~Selection} selection
+   * @return {Boolean}
+   */
+  // eslint-disable-next-line class-methods-use-this
+  _isSelectedLinkedMedia(selection) {
+    const selectedModelElement = selection.getSelectedElement();
+    return (
+      !!selectedModelElement &&
+      selectedModelElement.is('element', 'drupalMedia') &&
+      selectedModelElement.hasAttribute('linkHref')
+    );
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmedia.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmedia.js
new file mode 100644
index 0000000000000000000000000000000000000000..c295fc15b3e274eabd08cae2be29cb9161085f0d
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmedia.js
@@ -0,0 +1,25 @@
+/* eslint-disable import/no-extraneous-dependencies */
+/* cspell:words drupalmediaediting drupalmediageneralhtmlsupport drupalmediaui drupalmediatoolbar mediaimagetextalternative */
+
+import { Plugin } from 'ckeditor5/src/core';
+import DrupalMediaEditing from './drupalmediaediting';
+import DrupalMediaUI from './drupalmediaui';
+import DrupalMediaToolbar from './drupalmediatoolbar';
+
+import MediaImageTextAlternative from './mediaimagetextalternative';
+import DrupalMediaGeneralHtmlSupport from './drupalmediageneralhtmlsupport';
+
+/**
+ * @internal
+ */
+export default class DrupalMedia extends Plugin {
+  static get requires() {
+    return [
+      DrupalMediaEditing,
+      DrupalMediaGeneralHtmlSupport,
+      DrupalMediaUI,
+      DrupalMediaToolbar,
+      MediaImageTextAlternative,
+    ];
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmediaediting.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmediaediting.js
new file mode 100644
index 0000000000000000000000000000000000000000..70c05e0093f84b4b79fa1f4a9aa92d078b79d613
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmediaediting.js
@@ -0,0 +1,174 @@
+/* eslint-disable import/no-extraneous-dependencies */
+/* cspell:words insertdrupalmedia */
+
+import { Plugin } from 'ckeditor5/src/core';
+import { toWidget, Widget } from 'ckeditor5/src/widget';
+
+import InsertDrupalMediaCommand from './insertdrupalmedia';
+
+/**
+ * @internal
+ */
+export default class DrupalMediaEditing extends Plugin {
+  static get requires() {
+    return [Widget];
+  }
+
+  init() {
+    this.attrs = {
+      drupalMediaAlt: 'alt',
+      drupalMediaAlign: 'data-align',
+      drupalMediaCaption: 'data-caption',
+      drupalMediaEntityType: 'data-entity-type',
+      drupalMediaEntityUuid: 'data-entity-uuid',
+      drupalMediaViewMode: 'data-view-mode',
+    };
+    const options = this.editor.config.get('drupalMedia');
+    if (!options) {
+      return;
+    }
+    const { previewURL, themeError } = options;
+    this.previewURL = previewURL;
+    this.labelError = this.editor.t('Preview failed');
+    this.themeError =
+      themeError ||
+      `
+      <p>${this.editor.t(
+        'An error occurred while trying to preview the media. Please save your work and reload this page.',
+      )}<p>
+    `;
+
+    this._defineSchema();
+    this._defineConverters();
+
+    this.editor.commands.add(
+      'insertDrupalMedia',
+      new InsertDrupalMediaCommand(this.editor),
+    );
+  }
+
+  async _fetchPreview(url, query) {
+    const response = await fetch(`${url}?${new URLSearchParams(query)}`, {
+      headers: {
+        'X-Drupal-MediaPreview-CSRF-Token':
+          this.editor.config.get('drupalMedia').previewCsrfToken,
+      },
+    });
+    if (response.ok) {
+      const label = response.headers.get('drupal-media-label');
+      const preview = await response.text();
+      return { label, preview };
+    }
+
+    return { label: this.labelError, preview: this.themeError };
+  }
+
+  _defineSchema() {
+    const schema = this.editor.model.schema;
+    schema.register('drupalMedia', {
+      allowWhere: '$block',
+      isObject: true,
+      isContent: true,
+      allowAttributes: Object.keys(this.attrs),
+    });
+  }
+
+  _defineConverters() {
+    const conversion = this.editor.conversion;
+    conversion.for('upcast').elementToElement({
+      view: {
+        name: 'drupal-media',
+      },
+      model: 'drupalMedia',
+    });
+
+    conversion.for('dataDowncast').elementToElement({
+      model: 'drupalMedia',
+      view: {
+        name: 'drupal-media',
+      },
+    });
+
+    conversion.for('editingDowncast').elementToElement({
+      model: 'drupalMedia',
+      view: (modelElement, { writer: viewWriter }) => {
+        const container = viewWriter.createContainerElement('div', {
+          class: 'drupal-media',
+        });
+        const media = viewWriter.createRawElement(
+          'div',
+          { 'data-drupal-media-preview': 'loading' },
+          (domElement) => {
+            if (this.previewURL) {
+              this._fetchPreview(this.previewURL, {
+                text: this._renderElement(modelElement),
+                uuid: modelElement.getAttribute('drupalMediaEntityUuid'),
+              }).then(({ label, preview }) => {
+                domElement.innerHTML = preview;
+                domElement.setAttribute('aria-label', label);
+                domElement.setAttribute('data-drupal-media-preview', 'ready');
+              });
+            } else {
+              domElement.innerHTML = this.themeError;
+              domElement.setAttribute('aria-label', 'drupal-media');
+              domElement.setAttribute(
+                'data-drupal-media-preview',
+                'unavailable',
+              );
+            }
+          },
+        );
+        viewWriter.insert(viewWriter.createPositionAt(container, 0), media);
+        viewWriter.setCustomProperty('drupalMedia', true, container);
+        return toWidget(container, viewWriter, { label: 'media widget' });
+      },
+    });
+
+    // Set attributeToAttribute conversion for all supported attributes.
+    Object.keys(this.attrs).forEach((modelKey) => {
+      conversion.attributeToAttribute({
+        model: {
+          key: modelKey,
+          name: 'drupalMedia',
+        },
+        view: {
+          name: 'drupal-media',
+          key: this.attrs[modelKey],
+        },
+      });
+    });
+  }
+
+  /**
+   * MediaFilterController::preview requires the saved element.
+   *
+   * Not previewing data-caption since it does not get updated by new changes.
+   *
+   * @param {module:engine/model/element~Element} modelElement
+   *   The drupalMedia model element to be converted.
+   * @return {string}
+   *   The model element converted into HTML.
+   *
+   * @todo: is there a better way to get the rendered dataDowncast string
+   *   https://www.drupal.org/project/ckeditor5/issues/3231337?
+   */
+  _renderElement(modelElement) {
+    const attrs = modelElement.getAttributes();
+    let element = '<drupal-media';
+    Array.from(attrs).forEach((attr) => {
+      if (this.attrs[attr[0]] && attr[0] !== 'drupalMediaCaption') {
+        element += ` ${this.attrs[attr[0]]}="${attr[1]}"`;
+      }
+    });
+    element += '></drupal-media>';
+
+    return element;
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalMediaEditing';
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmediageneralhtmlsupport.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmediageneralhtmlsupport.js
new file mode 100644
index 0000000000000000000000000000000000000000..a84f378ac8a4090d149e6dafcf9830dd72a0d817
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmediageneralhtmlsupport.js
@@ -0,0 +1,182 @@
+/* eslint-disable import/no-extraneous-dependencies */
+// cSpell:words conversionutils datafilter
+import { Plugin } from 'ckeditor5/src/core';
+import { setViewAttributes } from '@ckeditor/ckeditor5-html-support/src/conversionutils';
+
+/**
+ * View-to-model conversion helper preserving allowed attributes on the Drupal Media model.
+ *
+ * @param {module:html-support/datafilter~DataFilter} dataFilter
+ *   The General HTML support data filter.
+ *
+ * @return {function}
+ *   function that adds an event listener to upcastDispatcher.
+ */
+function viewToModelDrupalMediaAttributeConverter(dataFilter) {
+  return (dispatcher) => {
+    dispatcher.on(
+      'element:drupal-media',
+      (evt, data, conversionApi) => {
+        function preserveElementAttributes(viewElement, attributeName) {
+          const viewAttributes = dataFilter._consumeAllowedAttributes(
+            viewElement,
+            conversionApi,
+          );
+
+          if (viewAttributes) {
+            conversionApi.writer.setAttribute(
+              attributeName,
+              viewAttributes,
+              data.modelRange,
+            );
+          }
+        }
+        function preserveLinkAttributes(linkElement) {
+          preserveElementAttributes(linkElement, 'htmlLinkAttributes');
+        }
+
+        const viewMediaElement = data.viewItem;
+        const viewContainerElement = viewMediaElement.parent;
+
+        if (viewContainerElement.is('element', 'a')) {
+          preserveLinkAttributes(viewContainerElement);
+        }
+      },
+      { priority: 'low' },
+    );
+  };
+}
+
+/**
+ * Gets descendant element from a container.
+ *
+ * @param {module:engine/model/writer~Writer} writer
+ *   The writer.
+ * @param {module:engine/view/element~Element} containerElement
+ *   The container element.
+ * @param {string} elementName
+ *   The element name.
+ * @return {module:engine/view/element~Element|undefined}
+ *   The descendant element matching element name or undefined if not found.
+ */
+function getDescendantElement(writer, containerElement, elementName) {
+  const range = writer.createRangeOn(containerElement);
+
+  // eslint-disable-next-line no-restricted-syntax
+  for (const { item } of range.getWalker()) {
+    if (item.is('element', elementName)) {
+      return item;
+    }
+  }
+}
+
+/**
+ * Model to editing view attribute converter.
+ *
+ * @return {function}
+ *   A function that adds an event listener to downcastDispatcher.
+ */
+function modelToEditingViewAttributeConverter() {
+  return (dispatcher) =>
+    dispatcher.on(
+      'attribute:linkHref:drupalMedia',
+      (evt, data, conversionApi) => {
+        if (
+          !conversionApi.consumable.consume(
+            data.item,
+            'attribute:htmlLinkAttributes:drupalMedia',
+          )
+        ) {
+          return;
+        }
+
+        const containerElement = conversionApi.mapper.toViewElement(data.item);
+        const viewElement = getDescendantElement(
+          conversionApi.writer,
+          containerElement,
+          'a',
+        );
+
+        setViewAttributes(
+          conversionApi.writer,
+          data.item.getAttribute('htmlLinkAttributes'),
+          viewElement,
+        );
+      },
+      { priority: 'low' },
+    );
+}
+
+/**
+ * Model to data view attribute converter.
+ *
+ * @return {function}
+ *   function that adds an event listener to downcastDispatcher.
+ */
+function modelToDataViewAttributeConverter() {
+  return (dispatcher) =>
+    dispatcher.on(
+      'attribute:linkHref:drupalMedia',
+      (evt, data, conversionApi) => {
+        if (
+          !conversionApi.consumable.consume(
+            data.item,
+            'attribute:htmlLinkAttributes:drupalMedia',
+          )
+        ) {
+          return;
+        }
+
+        const mediaElement = conversionApi.mapper.toViewElement(data.item);
+        const linkElement = mediaElement.parent;
+        setViewAttributes(
+          conversionApi.writer,
+          data.item.getAttribute('htmlLinkAttributes'),
+          linkElement,
+        );
+      },
+      { priority: 'low' },
+    );
+}
+
+/**
+ * Integrates Drupal Media with General HTML Support.
+ *
+ * @internal
+ */
+export default class DrupalMediaGeneralHtmlSupport extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  init() {
+    const { editor } = this;
+
+    // This plugin is only needed if General HTML Support plugin is loaded.
+    if (!editor.plugins.has('GeneralHtmlSupport')) {
+      return;
+    }
+
+    const { schema } = editor.model;
+    const { conversion } = editor;
+    const dataFilter = editor.plugins.get('DataFilter');
+
+    schema.extend('drupalMedia', {
+      allowAttributes: ['htmlLinkAttributes'],
+    });
+
+    conversion
+      .for('upcast')
+      .add(viewToModelDrupalMediaAttributeConverter(dataFilter));
+    conversion
+      .for('editingDowncast')
+      .add(modelToEditingViewAttributeConverter());
+    conversion.for('dataDowncast').add(modelToDataViewAttributeConverter());
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalMediaGeneralHtmlSupport';
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmediatoolbar.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmediatoolbar.js
new file mode 100644
index 0000000000000000000000000000000000000000..694ff4eca78c5157847d7a21ab6caee50dfa13eb
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmediatoolbar.js
@@ -0,0 +1,31 @@
+/* eslint-disable import/no-extraneous-dependencies */
+import { Plugin } from 'ckeditor5/src/core';
+import { WidgetToolbarRepository } from 'ckeditor5/src/widget';
+
+import { getSelectedDrupalMediaWidget } from './utils';
+
+/**
+ * @internal
+ */
+export default class DrupalMediaToolbar extends Plugin {
+  static get requires() {
+    return [WidgetToolbarRepository];
+  }
+
+  static get pluginName() {
+    return 'DrupalMediaToolbar';
+  }
+
+  afterInit() {
+    const editor = this.editor;
+    const { t } = editor;
+    const widgetToolbarRepository = editor.plugins.get(WidgetToolbarRepository);
+
+    widgetToolbarRepository.register('drupalMedia', {
+      ariaLabel: t('Drupal Media toolbar'),
+      items: editor.config.get('drupalMedia.toolbar') || [],
+      // Get the selected image or an image containing the figcaption with the selection inside.
+      getRelatedElement: (selection) => getSelectedDrupalMediaWidget(selection),
+    });
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmediaui.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmediaui.js
new file mode 100644
index 0000000000000000000000000000000000000000..5e10d0ec719a0f931456d14384394754d60a95f3
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/drupalmediaui.js
@@ -0,0 +1,49 @@
+/* eslint-disable import/no-extraneous-dependencies */
+// cspell:ignore medialibrary
+
+import { Plugin } from 'ckeditor5/src/core';
+import { ButtonView } from 'ckeditor5/src/ui';
+// cspell:ignore medialibrary
+import mediaIcon from '../theme/icons/medialibrary.svg';
+
+/**
+ * @internal
+ */
+export default class DrupalMediaUI extends Plugin {
+  init() {
+    const editor = this.editor;
+    const options = this.editor.config.get('drupalMedia');
+    if (!options) {
+      return;
+    }
+
+    const { libraryURL, openDialog, dialogSettings = {} } = options;
+    if (!libraryURL || typeof openDialog !== 'function') {
+      return;
+    }
+
+    editor.ui.componentFactory.add('drupalMedia', (locale) => {
+      const command = editor.commands.get('insertDrupalMedia');
+      const buttonView = new ButtonView(locale);
+
+      buttonView.set({
+        label: editor.t('Insert Drupal Media'),
+        icon: mediaIcon,
+        tooltip: true,
+      });
+
+      buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');
+      this.listenTo(buttonView, 'execute', () => {
+        openDialog(
+          libraryURL,
+          ({ attributes }) => {
+            editor.execute('insertDrupalMedia', attributes);
+          },
+          dialogSettings,
+        );
+      });
+
+      return buttonView;
+    });
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/index.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..dfdc8cc22dd2eec18335da0d8d0e0e6d07c14633
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/index.js
@@ -0,0 +1,23 @@
+/* eslint-disable import/no-extraneous-dependencies */
+// cspell:ignore mediaimagetextalternative
+
+import DrupalMedia from './drupalmedia';
+
+// cspell:ignore drupallinkmedia
+import DrupalLinkMedia from './drupallinkmedia/drupallinkmedia';
+
+// cspell:ignore mediaimagetextalternative
+import MediaImageTextAlternative from './mediaimagetextalternative';
+import MediaImageTextAlternativeEditing from './mediaimagetextalternative/mediaimagetextalternativeediting';
+import MediaImageTextAlternativeUi from './mediaimagetextalternative/mediaimagetextalternativeui';
+
+/**
+ * @internal
+ */
+export default {
+  DrupalMedia,
+  MediaImageTextAlternative,
+  MediaImageTextAlternativeEditing,
+  MediaImageTextAlternativeUi,
+  DrupalLinkMedia,
+};
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/insertdrupalmedia.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/insertdrupalmedia.js
new file mode 100644
index 0000000000000000000000000000000000000000..205d42caa4c3cbe168ce5a5e86acee0f0f3f8d88
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/insertdrupalmedia.js
@@ -0,0 +1,74 @@
+/* eslint-disable import/no-extraneous-dependencies */
+import { Command } from 'ckeditor5/src/core';
+
+function createDrupalMedia(writer, attributes) {
+  const drupalMedia = writer.createElement('drupalMedia', attributes);
+  return drupalMedia;
+}
+
+/**
+ * @internal
+ */
+/**
+ * The insert media command.
+ *
+ * The command is registered by the `DrupalMediaEditing` plugin as
+ * `insertDrupalMedia`.
+ *
+ * In order to insert media at the current selection position, execute the
+ * command and pass the attributes desired in the drupal-media element:
+ *
+ *    editor.execute('insertDrupalMedia', {
+ *      'alt': 'Alt text',
+ *      'data-align': 'left',
+ *      'data-caption': 'Caption text',
+ *      'data-entity-type': 'media',
+ *      'data-entity-uuid': 'media-entity-uuid',
+ *      'data-view-mode': 'default',
+ *    });
+ */
+export default class InsertDrupalMediaCommand extends Command {
+  execute(attributes) {
+    const mediaEditing = this.editor.plugins.get('DrupalMediaEditing');
+
+    // Create object that contains supported data-attributes in view data by
+    // flipping `DrupalMediaEditing.attrs` object (i.e. keys from object become
+    // values and values from object become keys).
+    const dataAttributeMapping = Object.entries(mediaEditing.attrs).reduce(
+      (result, [key, value]) => {
+        result[value] = key;
+        return result;
+      },
+      {},
+    );
+
+    // \Drupal\media\Form\EditorMediaDialog returns data in keyed by
+    // data-attributes used in view data. This converts data-attribute keys to
+    // keys used in model.
+    const modelAttributes = Object.keys(attributes).reduce(
+      (result, attribute) => {
+        if (dataAttributeMapping[attribute]) {
+          result[dataAttributeMapping[attribute]] = attributes[attribute];
+        }
+        return result;
+      },
+      {},
+    );
+
+    this.editor.model.change((writer) => {
+      this.editor.model.insertContent(
+        createDrupalMedia(writer, modelAttributes),
+      );
+    });
+  }
+
+  refresh() {
+    const model = this.editor.model;
+    const selection = model.document.selection;
+    const allowedIn = model.schema.findAllowedParent(
+      selection.getFirstPosition(),
+      'drupalMedia',
+    );
+    this.isEnabled = allowedIn !== null;
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative.js
new file mode 100644
index 0000000000000000000000000000000000000000..53d9dd4d4f45b58af2aebaeb36cff4160ceee3ef
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative.js
@@ -0,0 +1,26 @@
+/* eslint-disable import/no-extraneous-dependencies */
+import { Plugin } from 'ckeditor5/src/core';
+import MediaImageTextAlternativeEditing from './mediaimagetextalternative/mediaimagetextalternativeediting';
+import MediaImageTextAlternativeUi from './mediaimagetextalternative/mediaimagetextalternativeui';
+
+/**
+ * @internal
+ */
+/**
+ * The media image text alternative plugin.
+ */
+export default class MediaImageTextAlternative extends Plugin {
+  /**
+   * @inheritDoc
+   */
+  static get requires() {
+    return [MediaImageTextAlternativeEditing, MediaImageTextAlternativeUi];
+  }
+
+  /**
+   * @inheritDoc
+   */
+  static get pluginName() {
+    return 'MediaImageTextAlternative';
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativecommand.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativecommand.js
new file mode 100644
index 0000000000000000000000000000000000000000..138d733b7974c362a4b7f10d07d4469f94f94848
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativecommand.js
@@ -0,0 +1,77 @@
+/* eslint-disable import/no-extraneous-dependencies */
+import { Command } from 'ckeditor5/src/core';
+import { isDrupalMedia } from '../utils';
+
+/**
+ * The media image text alternative command.
+ *
+ * This is used to change the `alt` attribute of `<drupalMedia>` elements.
+ *
+ * @see https://github.com/ckeditor/ckeditor5/blob/master/packages/ckeditor5-image/src/imagetextalternative/imagetextalternativecommand.js
+ */
+export default class MediaImageTextAlternativeCommand extends Command {
+  /**
+   * The command value: `false` if there is no `alt` attribute, otherwise the value of the `alt` attribute.
+
+  /**
+   * @inheritDoc
+   */
+  refresh() {
+    const element = this.editor.model.document.selection.getSelectedElement();
+
+    this.isEnabled = false;
+    if (isDrupalMedia(element)) {
+      this._isMediaImage(element).then((hasImageField) => {
+        this.isEnabled = hasImageField;
+      });
+    }
+
+    if (isDrupalMedia(element) && element.hasAttribute('drupalMediaAlt')) {
+      this.value = element.getAttribute('drupalMediaAlt');
+    } else {
+      this.value = false;
+    }
+  }
+
+  /**
+   * Executes the command.
+   *
+   * @param {Object} options
+   *   An options object.
+   * @param {String} options.newValue The new value of the `alt` attribute to set.
+   */
+  execute(options) {
+    const { model } = this.editor;
+    const imageElement = model.document.selection.getSelectedElement();
+
+    options.newValue = options.newValue.trim();
+    model.change((writer) => {
+      if (options.newValue.length > 0) {
+        writer.setAttribute('drupalMediaAlt', options.newValue, imageElement);
+      } else {
+        writer.removeAttribute('drupalMediaAlt', imageElement);
+      }
+    });
+  }
+
+  async _isMediaImage(modelElement) {
+    const options = this.editor.config.get('drupalMedia');
+    if (!options) {
+      return null;
+    }
+
+    const { isMediaUrl } = options;
+    const query = new URLSearchParams({
+      uuid: modelElement.getAttribute('drupalMediaEntityUuid'),
+    });
+    // The `isMediaUrl` received from the server is guaranteed to already have
+    // a query string (for the CSRF token).
+    // @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\Media::getDynamicPluginConfig()
+    const response = await fetch(`${isMediaUrl}&${query}`);
+    if (response.ok) {
+      return JSON.parse(await response.text());
+    }
+
+    return null;
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativeediting.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativeediting.js
new file mode 100644
index 0000000000000000000000000000000000000000..d1a532b0e98f8eccc35bb2347e064b055ccdde3c
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativeediting.js
@@ -0,0 +1,27 @@
+/* eslint-disable import/no-extraneous-dependencies */
+/* cspell:words mediaimagetextalternativecommand textalternativeformview */
+
+import { Plugin } from 'ckeditor5/src/core';
+import MediaImageTextAlternativeCommand from './mediaimagetextalternativecommand';
+
+/**
+ * The image text alternative editing plugin.
+ */
+export default class MediaImageTextAlternativeEditing extends Plugin {
+  /**
+   * @inheritDoc
+   */
+  static get pluginName() {
+    return 'MediaImageTextAlternativeEditing';
+  }
+
+  /**
+   * @inheritDoc
+   */
+  init() {
+    this.editor.commands.add(
+      'mediaImageTextAlternative',
+      new MediaImageTextAlternativeCommand(this.editor),
+    );
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativeui.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativeui.js
new file mode 100644
index 0000000000000000000000000000000000000000..28ca24ef5ab7bfcec409f2be14ee74aefb692fd0
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativeui.js
@@ -0,0 +1,218 @@
+/* eslint-disable import/no-extraneous-dependencies */
+/* cspell:words textalternativeformview */
+
+import { Plugin, icons } from 'ckeditor5/src/core';
+import {
+  ButtonView,
+  ContextualBalloon,
+  clickOutsideHandler,
+} from 'ckeditor5/src/ui';
+
+import { getSelectedDrupalMediaWidget } from '../utils';
+import {
+  getBalloonPositionData,
+  repositionContextualBalloon,
+} from '../ui/utils';
+
+import TextAlternativeFormView from './ui/textalternativeformview';
+
+/**
+ * The media image text alternative UI plugin.
+ *
+ * @see https://github.com/ckeditor/ckeditor5/blob/master/packages/ckeditor5-image/src/imagetextalternative/imagetextalternativeui.js
+ */
+export default class MediaImageTextAlternativeUi extends Plugin {
+  /**
+   * @inheritDoc
+   */
+  static get requires() {
+    return [ContextualBalloon];
+  }
+
+  /**
+   * @inheritDoc
+   */
+  static get pluginName() {
+    return 'MediaImageTextAlternativeUi';
+  }
+
+  /**
+   * @inheritDoc
+   */
+  init() {
+    this._createButton();
+    this._createForm();
+  }
+
+  /**
+   * @inheritDoc
+   */
+  destroy() {
+    super.destroy();
+    this._form.destroy();
+  }
+
+  /**
+   * Creates a button showing the balloon panel for changing the image text
+   * alternative and registers it in the editor ComponentFactory.
+   */
+  _createButton() {
+    const editor = this.editor;
+    const t = editor.t;
+
+    editor.ui.componentFactory.add('mediaImageTextAlternative', (locale) => {
+      const command = editor.commands.get('mediaImageTextAlternative');
+      const view = new ButtonView(locale);
+
+      view.set({
+        label: t('Override media image text alternative'),
+        icon: icons.lowVision,
+        tooltip: true,
+      });
+
+      view.bind('isVisible').to(command, 'isEnabled');
+
+      this.listenTo(view, 'execute', () => {
+        this._showForm();
+      });
+
+      return view;
+    });
+  }
+
+  /**
+   * Creates the {@link module:image/imagetextalternative/ui/textalternativeformview~TextAlternativeFormView}
+   * form.
+   *
+   * @private
+   */
+  _createForm() {
+    const editor = this.editor;
+    const view = editor.editing.view;
+    const viewDocument = view.document;
+
+    /**
+     * The contextual balloon plugin instance.
+     */
+    this._balloon = this.editor.plugins.get('ContextualBalloon');
+
+    /**
+     * A form containing a textarea and buttons, used to change the `alt` text value.
+     */
+    this._form = new TextAlternativeFormView(editor.locale);
+
+    // Render the form so its #element is available for clickOutsideHandler.
+    this._form.render();
+
+    this.listenTo(this._form, 'submit', () => {
+      editor.execute('mediaImageTextAlternative', {
+        newValue: this._form.labeledInput.fieldView.element.value,
+      });
+
+      this._hideForm(true);
+    });
+
+    this.listenTo(this._form, 'cancel', () => {
+      this._hideForm(true);
+    });
+
+    // Close the form on Esc key press.
+    this._form.keystrokes.set('Esc', (data, cancel) => {
+      this._hideForm(true);
+      cancel();
+    });
+
+    // Reposition the balloon or hide the form if an image widget is no longer selected.
+    this.listenTo(editor.ui, 'update', () => {
+      if (!getSelectedDrupalMediaWidget(viewDocument.selection)) {
+        this._hideForm(true);
+      } else if (this._isVisible) {
+        repositionContextualBalloon(editor);
+      }
+    });
+
+    // Close on click outside of balloon panel element.
+    clickOutsideHandler({
+      emitter: this._form,
+      activator: () => this._isVisible,
+      contextElements: [this._balloon.view.element],
+      callback: () => this._hideForm(),
+    });
+  }
+
+  /**
+   * Shows the form in a balloon.
+   */
+  _showForm() {
+    if (this._isVisible) {
+      return;
+    }
+
+    const editor = this.editor;
+    const command = editor.commands.get('mediaImageTextAlternative');
+    const labeledInput = this._form.labeledInput;
+
+    this._form.disableCssTransitions();
+
+    if (!this._isInBalloon) {
+      this._balloon.add({
+        view: this._form,
+        position: getBalloonPositionData(editor),
+      });
+    }
+
+    // Make sure that each time the panel shows up, the field remains in sync with the value of
+    // the command. If the user typed in the input, then canceled the balloon (`labeledInput#value`
+    // stays unaltered) and re-opened it without changing the value of the command, they would see the
+    // old value instead of the actual value of the command.
+    // https://github.com/ckeditor/ckeditor5-image/issues/114
+    labeledInput.fieldView.element.value = command.value || '';
+    labeledInput.fieldView.value = labeledInput.fieldView.element.value;
+
+    this._form.labeledInput.fieldView.select();
+
+    this._form.enableCssTransitions();
+  }
+
+  /**
+   * Removes the {@link #_form} from the {@link #_balloon}.
+   *
+   * @param {Boolean} [focusEditable=false] Controls whether the editing view is focused afterwards.
+   * @private
+   */
+  _hideForm(focusEditable) {
+    if (!this._isInBalloon) {
+      return;
+    }
+
+    // Blur the input element before removing it from DOM to prevent issues in some browsers.
+    // See https://github.com/ckeditor/ckeditor5/issues/1501.
+    if (this._form.focusTracker.isFocused) {
+      this._form.saveButtonView.focus();
+    }
+
+    this._balloon.remove(this._form);
+
+    if (focusEditable) {
+      this.editor.editing.view.focus();
+    }
+  }
+
+  /**
+   * Returns `true` when the form is the visible view in the balloon.
+   *
+   * @type {Boolean}
+   */
+  get _isVisible() {
+    return this._balloon.visibleView === this._form;
+  }
+
+  /**
+   * Returns `true` when the form is in the balloon.
+   *
+   * @type {Boolean}
+   */
+  get _isInBalloon() {
+    return this._balloon.hasView(this._form);
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative/ui/textalternativeformview.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative/ui/textalternativeformview.js
new file mode 100644
index 0000000000000000000000000000000000000000..49d865f8172725e0b582defee27689aafb1ab4a8
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/mediaimagetextalternative/ui/textalternativeformview.js
@@ -0,0 +1,173 @@
+/* eslint-disable import/no-extraneous-dependencies */
+
+// cspell:ignore focusables
+
+import {
+  ButtonView,
+  FocusCycler,
+  LabeledFieldView,
+  View,
+  ViewCollection,
+  createLabeledInputText,
+  injectCssTransitionDisabler,
+  submitHandler,
+} from 'ckeditor5/src/ui';
+import { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';
+import { icons } from 'ckeditor5/src/core';
+
+// cspell:ignore focusables
+
+export default class TextAlternativeFormView extends View {
+  /**
+   * @inheritdoc
+   */
+  constructor(locale) {
+    super(locale);
+
+    const t = this.locale.t;
+
+    /**
+     * Tracks information about the DOM focus in the form.
+     */
+    this.focusTracker = new FocusTracker();
+
+    /**
+     * An instance of the KeystrokeHandler.
+     */
+    this.keystrokes = new KeystrokeHandler();
+
+    /**
+     * An input with a label.
+     */
+    this.labeledInput = this._createLabeledInputView();
+
+    /**
+     * A button used to submit the form.
+     */
+    this.saveButtonView = this._createButton(
+      t('Save'),
+      icons.check,
+      'ck-button-save',
+    );
+    this.saveButtonView.type = 'submit';
+
+    /**
+     * A button used to cancel the form.
+     */
+    this.cancelButtonView = this._createButton(
+      t('Cancel'),
+      icons.cancel,
+      'ck-button-cancel',
+      'cancel',
+    );
+
+    /**
+     * A collection of views which can be focused in the form.
+     */
+    this._focusables = new ViewCollection();
+
+    /**
+     * Helps cycling over focusables in the form.
+     */
+    this._focusCycler = new FocusCycler({
+      focusables: this._focusables,
+      focusTracker: this.focusTracker,
+      keystrokeHandler: this.keystrokes,
+      actions: {
+        // Navigate form fields backwards using the Shift + Tab keystroke.
+        focusPrevious: 'shift + tab',
+
+        // Navigate form fields forwards using the Tab key.
+        focusNext: 'tab',
+      },
+    });
+
+    this.setTemplate({
+      tag: 'form',
+
+      attributes: {
+        class: ['ck', 'ck-text-alternative-form', 'ck-responsive-form'],
+        tabindex: '-1',
+      },
+
+      children: [this.labeledInput, this.saveButtonView, this.cancelButtonView],
+    });
+
+    injectCssTransitionDisabler(this);
+  }
+
+  /**
+   * @inheritdoc
+   */
+  render() {
+    super.render();
+
+    this.keystrokes.listenTo(this.element);
+
+    submitHandler({ view: this });
+
+    [this.labeledInput, this.saveButtonView, this.cancelButtonView].forEach(
+      (v) => {
+        // Register the view as focusable.
+        this._focusables.add(v);
+
+        // Register the view in the focus tracker.
+        this.focusTracker.add(v.element);
+      },
+    );
+  }
+
+  /**
+   * Creates the button view.
+   *
+   * @param {String} label
+   *   The button label
+   * @param {String} icon
+   *   The button's icon.
+   * @param {String} className
+   *   The additional button CSS class name.
+   * @param {String} [eventName]
+   *   The event name that the ButtonView#execute event will be delegated to.
+   * @return {module:ui/view~View}
+   *   The button view instance.
+   */
+  _createButton(label, icon, className, eventName) {
+    const button = new ButtonView(this.locale);
+
+    button.set({
+      label,
+      icon,
+      tooltip: true,
+    });
+
+    button.extendTemplate({
+      attributes: {
+        class: className,
+      },
+    });
+
+    if (eventName) {
+      button.delegate('execute').to(this, eventName);
+    }
+
+    return button;
+  }
+
+  /**
+   * Creates an input with a label.
+   *
+   * @return {module:ui/view~View}
+   *   Labeled field view instance.
+   */
+  _createLabeledInputView() {
+    const t = this.locale.t;
+    const labeledInput = new LabeledFieldView(
+      this.locale,
+      createLabeledInputText,
+    );
+
+    labeledInput.label = t('Override text alternative');
+
+    return labeledInput;
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/ui/utils.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/ui/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..8201692ea783755507daa265dc7b01064dd78337
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/ui/utils.js
@@ -0,0 +1,53 @@
+/* eslint-disable import/no-extraneous-dependencies */
+
+import { BalloonPanelView } from 'ckeditor5/src/ui';
+import { getSelectedDrupalMediaWidget } from '../utils';
+
+/**
+ * Returns the positioning options that control the geometry of the contextual
+ * balloon with respect to the selected element in the editor content.
+ *
+ * @param {module:core/editor/editor~Editor} editor
+ *   The editor instance.
+ * @return {Object}
+ *   The options.
+ *
+ * @internal
+ */
+export function getBalloonPositionData(editor) {
+  const editingView = editor.editing.view;
+  const defaultPositions = BalloonPanelView.defaultPositions;
+
+  return {
+    target: editingView.domConverter.viewToDom(
+      editingView.document.selection.getSelectedElement(),
+    ),
+    positions: [
+      defaultPositions.northArrowSouth,
+      defaultPositions.northArrowSouthWest,
+      defaultPositions.northArrowSouthEast,
+      defaultPositions.southArrowNorth,
+      defaultPositions.southArrowNorthWest,
+      defaultPositions.southArrowNorthEast,
+    ],
+  };
+}
+
+/**
+ * A helper utility that positions the contextual balloon instance with respect
+ * to the image in the editor content, if one is selected.
+ *
+ * @param {module:core/editor/editor~Editor} editor
+ *   The editor instance.
+ *
+ * @internal
+ */
+export function repositionContextualBalloon(editor) {
+  const balloon = editor.plugins.get('ContextualBalloon');
+
+  if (getSelectedDrupalMediaWidget(editor.editing.view.document.selection)) {
+    const position = getBalloonPositionData(editor);
+
+    balloon.updatePosition(position);
+  }
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/utils.js b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..3289b8931536a942f02d9978fee12a282f151282
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/src/utils.js
@@ -0,0 +1,51 @@
+/* eslint-disable import/no-extraneous-dependencies */
+import { isWidget } from 'ckeditor5/src/widget';
+
+/**
+ * Checks if the provided model element is `drupalMedia`.
+ *
+ * @param {module:engine/model/element~Element} modelElement
+ *   The model element to be checked.
+ * @return {boolean}
+ *   A boolean indicating whether element is drupalMedia element.
+ *
+ * @internal
+ */
+export function isDrupalMedia(modelElement) {
+  return !!modelElement && modelElement.is('element', 'drupalMedia');
+}
+
+/**
+ * Checks if view element is <drupal-media> element.
+ *
+ * @param {module:engine/view/element~Element} viewElement
+ *   The view element.
+ * @return {boolean}
+ *   A boolean indicating whether element is <drupal-media> element.
+ *
+ * @internal
+ */
+export function isDrupalMediaWidget(viewElement) {
+  return (
+    isWidget(viewElement) && !!viewElement.getCustomProperty('drupalMedia')
+  );
+}
+
+/**
+ * Gets selected Drupal Media widget if only Drupal Media is currently selected.
+ *
+ * @param {module:engine/model/selection~Selection} selection
+ *   The current selection.
+ * @return {module:engine/view/element~Element|null}
+ *   The currently selected Drupal Media widget or null.
+ *
+ * @internal
+ */
+export function getSelectedDrupalMediaWidget(selection) {
+  const viewElement = selection.getSelectedElement();
+  if (viewElement && isDrupalMediaWidget(viewElement)) {
+    return viewElement;
+  }
+
+  return null;
+}
diff --git a/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/theme/icons/medialibrary.svg b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/theme/icons/medialibrary.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f96cff494c726a2ae49a0c5f8af604fa8daac2c4
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5_plugins/drupalMedia/theme/icons/medialibrary.svg
@@ -0,0 +1 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M19.1873 4.86414L10.2509 6.86414V7.02335H10.2499V15.5091C9.70972 15.1961 9.01793 15.1048 8.34069 15.3136C7.12086 15.6896 6.41013 16.8967 6.75322 18.0096C7.09631 19.1226 8.3633 19.72 9.58313 19.344C10.6666 19.01 11.3484 18.0203 11.2469 17.0234H11.2499V9.80173L18.1803 8.25067V14.3868C17.6401 14.0739 16.9483 13.9825 16.2711 14.1913C15.0513 14.5674 14.3406 15.7744 14.6836 16.8875C15.0267 18.0004 16.2937 18.5978 17.5136 18.2218C18.597 17.8877 19.2788 16.8982 19.1773 15.9011H19.1803V8.02687L19.1873 8.0253V4.86414Z" fill="black"/><path fill-rule="evenodd" clip-rule="evenodd" d="M13.5039 0.743652H0.386932V12.1603H13.5039V0.743652ZM12.3379 1.75842H1.55289V11.1454H1.65715L4.00622 8.86353L6.06254 10.861L9.24985 5.91309L11.3812 9.22179L11.7761 8.6676L12.3379 9.45621V1.75842ZM6.22048 4.50869C6.22048 5.58193 5.35045 6.45196 4.27722 6.45196C3.20398 6.45196 2.33395 5.58193 2.33395 4.50869C2.33395 3.43546 3.20398 2.56543 4.27722 2.56543C5.35045 2.56543 6.22048 3.43546 6.22048 4.50869Z" fill="black"/></svg>
diff --git a/core/modules/ckeditor5/js/ie11.filter.warnings.es6.js b/core/modules/ckeditor5/js/ie11.filter.warnings.es6.js
new file mode 100644
index 0000000000000000000000000000000000000000..aeee85ed5c113c0f23c9fe98d1e06c6aa28c1b8c
--- /dev/null
+++ b/core/modules/ckeditor5/js/ie11.filter.warnings.es6.js
@@ -0,0 +1,131 @@
+/**
+ * @file
+ * Provides IE11 compatibility warnings when choosing a text editor.
+ */
+
+((Drupal, once, Modernizr) => {
+  /**
+   * Presents a warning when selecting CKEditor 5 as a text format's text editor.
+   *
+   * @type {Drupal~behavior}
+   */
+  Drupal.behaviors.ckEditor5warn = {
+    attach: function attach() {
+      const isIE11 = Modernizr.mq(
+        '(-ms-high-contrast: active), (-ms-high-contrast: none)',
+      );
+      const editorSelect = once(
+        'editor-select',
+        document.querySelector(
+          '#filter-format-edit-form #edit-editor-editor, #filter-format-add-form #edit-editor-editor',
+        ),
+      );
+
+      if (typeof editorSelect[0] !== 'undefined') {
+        const select = editorSelect[0];
+
+        // Add a container for messages above the text format select element.
+        const selectMessageContainer = document.createElement('div');
+        select.parentNode.insertBefore(selectMessageContainer, select);
+        const selectMessages = new Drupal.Message(selectMessageContainer);
+        const editorSettings = document.querySelector(
+          '#editor-settings-wrapper',
+        );
+
+        /**
+         * Adds an IE11 compatibility warning to the message container.
+         */
+        const ck5Warning = () => {
+          selectMessages.add(
+            Drupal.t(
+              'CKEditor 5 is not compatible with Internet Explorer 11. Text fields using CKEditor 5 will still be editable but without the benefits of CKEditor.',
+            ),
+            {
+              type: 'warning',
+            },
+          );
+          if (isIE11) {
+            // https://www.drupal.org/docs/system-requirements/browser-requirements
+            selectMessages.add(
+              Drupal.t(
+                'Text editor toolbar settings are not available. They will be available in any <a href="@supported-browsers">supported browser</a> other than Internet Explorer',
+                {
+                  '@supported-browsers':
+                    'https://www.drupal.org/docs/system-requirements/browser-requirements',
+                },
+              ),
+              {
+                type: 'error',
+              },
+            );
+            editorSettings.hidden = true;
+          }
+        };
+
+        /**
+         * Adds a warning if the selected editor is ckeditor5, otherwise clears
+         * the message container.
+         */
+        const updateWarningStatus = () => {
+          if (
+            select.value === 'ckeditor5' &&
+            !select.classList.contains('error')
+          ) {
+            ck5Warning();
+          } else {
+            editorSettings.hidden = false;
+            selectMessages.clear();
+          }
+        };
+
+        const selectChangeHandler = () => {
+          // Declare the observer first so the observer callback can access it.
+          let editorSelectObserver = null;
+
+          /**
+           * MutationObserver callback for the editor select.
+           *
+           * This listens for the removal 'disabled' attribute on the <select>,
+           * which means the AJAX callback has completed and the form is in a
+           * state suitable for seeing if the IE11 warning is needed.
+           *
+           * @param {Array} mutations
+           *   The element's mutations.
+           */
+          function whenSelectAttributeChanges(mutations) {
+            for (let i = 0; i < mutations.length; i++) {
+              // When the select input is no longer disabled, the AJAX request
+              // is complete and the UI is in a state where it can be determined
+              // if the IE11 warning is needed.
+              if (
+                mutations[i].type === 'attributes' &&
+                mutations[i].attributeName === 'disabled' &&
+                !select.disabled
+              ) {
+                updateWarningStatus();
+                editorSelectObserver.disconnect();
+              }
+            }
+          }
+
+          // An observer is used because during the select change event, it is
+          // not yet known if validation prevented the switch to CKEditor 5.
+          // The IE11 warning should only appear if the switch wasn't prevented
+          // by validation.
+          editorSelectObserver = new MutationObserver(
+            whenSelectAttributeChanges,
+          );
+          editorSelectObserver.observe(select, {
+            attributes: true,
+            attributeOldValue: true,
+          });
+        };
+
+        updateWarningStatus();
+
+        // Listen to text format selection changes.
+        select.addEventListener('change', selectChangeHandler);
+      }
+    },
+  };
+})(Drupal, once, Modernizr);
diff --git a/core/modules/ckeditor5/js/ie11.filter.warnings.js b/core/modules/ckeditor5/js/ie11.filter.warnings.js
new file mode 100644
index 0000000000000000000000000000000000000000..2afbf8b6a774571e19fe91423d0d6d55f35e450b
--- /dev/null
+++ b/core/modules/ckeditor5/js/ie11.filter.warnings.js
@@ -0,0 +1,69 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function (Drupal, once, Modernizr) {
+  Drupal.behaviors.ckEditor5warn = {
+    attach: function attach() {
+      var isIE11 = Modernizr.mq('(-ms-high-contrast: active), (-ms-high-contrast: none)');
+      var editorSelect = once('editor-select', document.querySelector('#filter-format-edit-form #edit-editor-editor, #filter-format-add-form #edit-editor-editor'));
+
+      if (typeof editorSelect[0] !== 'undefined') {
+        var select = editorSelect[0];
+        var selectMessageContainer = document.createElement('div');
+        select.parentNode.insertBefore(selectMessageContainer, select);
+        var selectMessages = new Drupal.Message(selectMessageContainer);
+        var editorSettings = document.querySelector('#editor-settings-wrapper');
+
+        var ck5Warning = function ck5Warning() {
+          selectMessages.add(Drupal.t('CKEditor 5 is not compatible with Internet Explorer 11. Text fields using CKEditor 5 will still be editable but without the benefits of CKEditor.'), {
+            type: 'warning'
+          });
+
+          if (isIE11) {
+            selectMessages.add(Drupal.t('Text editor toolbar settings are not available. They will be available in any <a href="@supported-browsers">supported browser</a> other than Internet Explorer', {
+              '@supported-browsers': 'https://www.drupal.org/docs/system-requirements/browser-requirements'
+            }), {
+              type: 'error'
+            });
+            editorSettings.hidden = true;
+          }
+        };
+
+        var updateWarningStatus = function updateWarningStatus() {
+          if (select.value === 'ckeditor5' && !select.classList.contains('error')) {
+            ck5Warning();
+          } else {
+            editorSettings.hidden = false;
+            selectMessages.clear();
+          }
+        };
+
+        var selectChangeHandler = function selectChangeHandler() {
+          var editorSelectObserver = null;
+
+          function whenSelectAttributeChanges(mutations) {
+            for (var i = 0; i < mutations.length; i++) {
+              if (mutations[i].type === 'attributes' && mutations[i].attributeName === 'disabled' && !select.disabled) {
+                updateWarningStatus();
+                editorSelectObserver.disconnect();
+              }
+            }
+          }
+
+          editorSelectObserver = new MutationObserver(whenSelectAttributeChanges);
+          editorSelectObserver.observe(select, {
+            attributes: true,
+            attributeOldValue: true
+          });
+        };
+
+        updateWarningStatus();
+        select.addEventListener('change', selectChangeHandler);
+      }
+    }
+  };
+})(Drupal, once, Modernizr);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/ie11.user.warnings.es6.js b/core/modules/ckeditor5/js/ie11.user.warnings.es6.js
new file mode 100644
index 0000000000000000000000000000000000000000..3fe12292cc6ae807ae25335456db3bebdbc5e515
--- /dev/null
+++ b/core/modules/ckeditor5/js/ie11.user.warnings.es6.js
@@ -0,0 +1,137 @@
+/**
+ * @file
+ * Provide warnings when attempting to load CKEditor 5 on IE11.
+ */
+
+((Drupal, Modernizr) => {
+  const isIE11 = Modernizr.mq(
+    '(-ms-high-contrast: active), (-ms-high-contrast: none)',
+  );
+
+  // If the browser is IE11, create an alternate version of
+  // Drupal.editors.ckeditor5 that provides warnings. In IE11, the incompatible
+  // Javascript of CKEditor 5 prevents Drupal.editors.ckeditor5 from being
+  // created. Features such as Quick Edit that require the presence of a
+  // Drupal.editors.ckeditor5, even for fields that do not use CKEditor 5.
+  if (isIE11) {
+    // This will reference a MutationObserver used by several functions in
+    // Drupal.editors.ckeditor5. It is declared here and not the editor object
+    // in order to work with IE11 object scope.
+    let quickEditLabelObserver = null;
+
+    /**
+     * @namespace
+     */
+    Drupal.editors.ckeditor5 = {
+      /**
+       * Provides a warning when trying to attach CKEditor 5 to a field in IE11.
+       *
+       * @param {HTMLElement} element
+       *   The element the editor would have been attached to.
+       */
+      attach: function attach(element) {
+        // Add a Drupal.Message container above the textarea and use it to
+        // provide a warning message to IE11 users.
+        const editorMessageContainer = document.createElement('div');
+        element.parentNode.insertBefore(editorMessageContainer, element);
+        const editorMessages = new Drupal.Message(editorMessageContainer);
+        editorMessages.add(
+          Drupal.t(
+            'Internet Explorer 11 user: a rich text editor is available for this field when used with any other supported browser.',
+          ),
+          {
+            type: 'warning',
+          },
+        );
+      },
+
+      /**
+       * Editor detach callback.
+       */
+      detach: function detach() {
+        const quickEditToolbar = document.querySelector(
+          '#quickedit-entity-toolbar .quickedit-toolbar',
+        );
+        if (quickEditToolbar) {
+          // Remove classes that style the Quick Edit toolbar as a warning.
+          quickEditToolbar.classList.remove('ck5-ie11');
+          quickEditToolbar.classList.add('icon-pencil');
+
+          // Disconnect the observer from the Quick Edit label that converts the
+          // label to a warning. A warning isn't needed for fields not using
+          // CKEditor 5.
+          quickEditLabelObserver.disconnect();
+        }
+      },
+
+      /**
+       * Registers a callback which CKEditor 5 will call on change:data event.
+       */
+      onChange: function onChange() {
+        // Intentionally empty.
+      },
+
+      /**
+       * Provides a warning when Quick Edit tries to attach CKEditor 5 in IE11.
+       *
+       * @param {HTMLElement} element
+       *   The element the editor would have been attached to.
+       *
+       * @see Drupal.quickedit.editors.editor
+       */
+      attachInlineEditor: function attachInlineEditor(element) {
+        const quickEditToolbar = document.querySelector(
+          '#quickedit-entity-toolbar .quickedit-toolbar',
+        );
+
+        const notEditableAlert = Drupal.t('Field Not Editable');
+        const notEditableMessage = Drupal.t(
+          'CKEditor 5 is not compatible with IE11.',
+        );
+
+        /**
+         * Changes the Quick Edit label to a warning.
+         *
+         * @param {Element} toolbarLabel
+         *   The Quick Edit toolbar label element.
+         */
+        function quickEditLabelWarnIE11(toolbarLabel) {
+          // Disconnect the observer to prevent infinite recursion.
+          quickEditLabelObserver.disconnect();
+
+          // Change the quickEdit toolbar label to a warning that informs
+          // IE11 users that they can't edit the field due to CKEditor not
+          // working with IE11.
+          toolbarLabel.innerHTML = `<div><b>${notEditableAlert}</b><div>${notEditableMessage}</div></div>`;
+          quickEditLabelObserver.observe(toolbarLabel, { childList: true });
+        }
+
+        if (quickEditToolbar) {
+          quickEditToolbar.classList.add('ck5-ie11');
+          quickEditToolbar.classList.remove('icon-pencil');
+          element.classList.add('ck5-ie11');
+
+          // Prepare variables that will be used for changing the QuickEdit
+          // toolbar label to a warning.
+          const toolbarLabel = quickEditToolbar.querySelector(
+            '.quickedit-toolbar-label',
+          );
+
+          // Updating the Quick Edit label to display as a warning is triggered
+          // via an observer. An observer us used as there are multiple
+          // Quick Edit Backbone View events that alter the contents of this
+          // label. An observer is used to guarantee the warning persists
+          // without having to override multiple Backbone event handlers.
+          quickEditLabelObserver = new MutationObserver((mutations) => {
+            for (let i = 0; i < mutations.length; i++) {
+              if (mutations[i].type === 'childList') {
+                quickEditLabelWarnIE11(toolbarLabel);
+              }
+            }
+          });
+          quickEditLabelObserver.observe(toolbarLabel, { childList: true });
+        }
+      },
+    };
+  }
+})(Drupal, Modernizr);
diff --git a/core/modules/ckeditor5/js/ie11.user.warnings.js b/core/modules/ckeditor5/js/ie11.user.warnings.js
new file mode 100644
index 0000000000000000000000000000000000000000..d1849fbca00499f1e0e45a82ff4a6f6d50efafa7
--- /dev/null
+++ b/core/modules/ckeditor5/js/ie11.user.warnings.js
@@ -0,0 +1,64 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function (Drupal, Modernizr) {
+  var isIE11 = Modernizr.mq('(-ms-high-contrast: active), (-ms-high-contrast: none)');
+
+  if (isIE11) {
+    var quickEditLabelObserver = null;
+    Drupal.editors.ckeditor5 = {
+      attach: function attach(element) {
+        var editorMessageContainer = document.createElement('div');
+        element.parentNode.insertBefore(editorMessageContainer, element);
+        var editorMessages = new Drupal.Message(editorMessageContainer);
+        editorMessages.add(Drupal.t('Internet Explorer 11 user: a rich text editor is available for this field when used with any other supported browser.'), {
+          type: 'warning'
+        });
+      },
+      detach: function detach() {
+        var quickEditToolbar = document.querySelector('#quickedit-entity-toolbar .quickedit-toolbar');
+
+        if (quickEditToolbar) {
+          quickEditToolbar.classList.remove('ck5-ie11');
+          quickEditToolbar.classList.add('icon-pencil');
+          quickEditLabelObserver.disconnect();
+        }
+      },
+      onChange: function onChange() {},
+      attachInlineEditor: function attachInlineEditor(element) {
+        var quickEditToolbar = document.querySelector('#quickedit-entity-toolbar .quickedit-toolbar');
+        var notEditableAlert = Drupal.t('Field Not Editable');
+        var notEditableMessage = Drupal.t('CKEditor 5 is not compatible with IE11.');
+
+        function quickEditLabelWarnIE11(toolbarLabel) {
+          quickEditLabelObserver.disconnect();
+          toolbarLabel.innerHTML = "<div><b>".concat(notEditableAlert, "</b><div>").concat(notEditableMessage, "</div></div>");
+          quickEditLabelObserver.observe(toolbarLabel, {
+            childList: true
+          });
+        }
+
+        if (quickEditToolbar) {
+          quickEditToolbar.classList.add('ck5-ie11');
+          quickEditToolbar.classList.remove('icon-pencil');
+          element.classList.add('ck5-ie11');
+          var toolbarLabel = quickEditToolbar.querySelector('.quickedit-toolbar-label');
+          quickEditLabelObserver = new MutationObserver(function (mutations) {
+            for (var i = 0; i < mutations.length; i++) {
+              if (mutations[i].type === 'childList') {
+                quickEditLabelWarnIE11(toolbarLabel);
+              }
+            }
+          });
+          quickEditLabelObserver.observe(toolbarLabel, {
+            childList: true
+          });
+        }
+      }
+    };
+  }
+})(Drupal, Modernizr);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/media_embed_ckeditor5.theme.es6.js b/core/modules/ckeditor5/js/media_embed_ckeditor5.theme.es6.js
new file mode 100644
index 0000000000000000000000000000000000000000..ee9dbbef7b550e7067822ab7371c36c104f47ec1
--- /dev/null
+++ b/core/modules/ckeditor5/js/media_embed_ckeditor5.theme.es6.js
@@ -0,0 +1,19 @@
+/**
+ * @file
+ * Theme elements for the Media Embed CKEditor5 plugin.
+ */
+
+((Drupal) => {
+  /**
+   * Themes the error displayed when the media embed preview fails.
+   *
+   * @return {string}
+   *   A string representing a DOM fragment.
+   *
+   * @see media-embed-error.html.twig
+   */
+  Drupal.theme.mediaEmbedPreviewError = () =>
+    `<div>${Drupal.t(
+      'An error occurred while trying to preview the media. Please save your work and reload this page.',
+    )}</div>`;
+})(Drupal);
diff --git a/core/modules/ckeditor5/js/media_embed_ckeditor5.theme.js b/core/modules/ckeditor5/js/media_embed_ckeditor5.theme.js
new file mode 100644
index 0000000000000000000000000000000000000000..90d0db9545b9f14eaf98c2b055d1e8b916f76769
--- /dev/null
+++ b/core/modules/ckeditor5/js/media_embed_ckeditor5.theme.js
@@ -0,0 +1,12 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function (Drupal) {
+  Drupal.theme.mediaEmbedPreviewError = function () {
+    return "<div>".concat(Drupal.t('An error occurred while trying to preview the media. Please save your work and reload this page.'), "</div>");
+  };
+})(Drupal);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/src/Annotation/CKEditor4To5Upgrade.php b/core/modules/ckeditor5/src/Annotation/CKEditor4To5Upgrade.php
new file mode 100644
index 0000000000000000000000000000000000000000..d33472b74a1b309339283298de43658a744dec67
--- /dev/null
+++ b/core/modules/ckeditor5/src/Annotation/CKEditor4To5Upgrade.php
@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Annotation;
+
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines a CKEditor4To5Upgrade annotation object.
+ *
+ * Plugin Namespace: Plugin\CKEditor4To5Upgrade.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+ * @see plugin_api
+ *
+ * @Annotation
+ */
+class CKEditor4To5Upgrade extends Plugin {
+
+  /**
+   * The plugin ID.
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * The CKEditor 4 buttons for which an upgrade path is provided.
+   *
+   * @var string[]
+   */
+  public $cke4_buttons;
+
+  /**
+   * The CKEditor 4 plugins for whose settings an upgrade path is provided.
+   *
+   * @var string[]
+   */
+  public $cke4_plugin_settings;
+
+  /**
+   * The CKEditor 5 plugins with configurable subset with upgrade path provided.
+   *
+   * @var string[]
+   */
+  public $cke5_plugin_elements_subset_configuration;
+
+}
diff --git a/core/modules/ckeditor5/src/Annotation/CKEditor5AspectsOfCKEditor5Plugin.php b/core/modules/ckeditor5/src/Annotation/CKEditor5AspectsOfCKEditor5Plugin.php
new file mode 100644
index 0000000000000000000000000000000000000000..533786a376fa3763495a544a4100e106361ea2b5
--- /dev/null
+++ b/core/modules/ckeditor5/src/Annotation/CKEditor5AspectsOfCKEditor5Plugin.php
@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Annotation;
+
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines the "CKEditor 5 aspects of a CKEditor5Plugin" annotation object.
+ *
+ * Plugin Namespace: Plugin\CKEditor5Plugin.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditorPluginInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditorPluginBase
+ * @see \Drupal\ckeditor5\Plugin\CKEditorPluginManager
+ * @see plugin_api
+ *
+ * @Annotation
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see \Drupal\ckeditor5\Annotation\DrupalPartsOfCKEditor5Plugin
+ */
+class CKEditor5AspectsOfCKEditor5Plugin extends Plugin {
+
+  /**
+   * The CKEditor5 plugin classes provided.
+   *
+   * Found in the CKEditor5 global js object as {package.Class}.
+   *
+   * @var string[]
+   */
+  public $plugins;
+
+  /**
+   * A keyed array of additional values for the CKEditor5 constructor config.
+   *
+   * This property is optional and it does not need to be declared.
+   *
+   * @var array[]
+   */
+  public $config = [];
+
+}
diff --git a/core/modules/ckeditor5/src/Annotation/CKEditor5Plugin.php b/core/modules/ckeditor5/src/Annotation/CKEditor5Plugin.php
new file mode 100644
index 0000000000000000000000000000000000000000..5c6b876f05920dd516c908d7f196f283c1c77fe5
--- /dev/null
+++ b/core/modules/ckeditor5/src/Annotation/CKEditor5Plugin.php
@@ -0,0 +1,88 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Annotation;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines a CKEditor5Plugin annotation object.
+ *
+ * Plugin Namespace: Plugin\CKEditor5Plugin.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+ * @see plugin_api
+ *
+ * @Annotation
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin
+ * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin
+ */
+class CKEditor5Plugin extends Plugin {
+
+  /**
+   * The plugin ID.
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * The CKEditor 5 aspects of the plugin definition.
+   *
+   * @var \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin
+   */
+  public $ckeditor5;
+
+  /**
+   * The Drupal aspects of the plugin definition.
+   *
+   * @var \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin
+   */
+  public $drupal;
+
+  /**
+   * {@inheritdoc}
+   *
+   * Overridden for compatibility with the AnnotationBridgeDecorator, which
+   * ensures YAML-defined CKEditor 5 plugin definitions are also processed by
+   * annotations. Unfortunately it does not (yet) support nested annotations.
+   * Force YAML-defined plugin definitions to be parsed by the
+   * annotations, to ensure consistent handling of defaults.
+   *
+   * @see \Drupal\Component\Annotation\Plugin\Discovery\AnnotationBridgeDecorator::getDefinitions()
+   */
+  public function __construct($values) {
+    if (isset($values['ckeditor5']) && is_array($values['ckeditor5'])) {
+      $values['ckeditor5'] = new CKEditor5AspectsOfCKEditor5Plugin($values['ckeditor5']);
+    }
+    if (isset($values['drupal']) && is_array($values['drupal'])) {
+      $values['drupal'] = new DrupalAspectsOfCKEditor5Plugin($values['drupal']);
+    }
+    parent::__construct($values);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getClass() {
+    return $this->definition['drupal']['class'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setClass($class) {
+    $this->definition['drupal']['class'] = $class;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function get(): CKEditor5PluginDefinition {
+    return new CKEditor5PluginDefinition($this->definition);
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Annotation/DrupalAspectsOfCKEditor5Plugin.php b/core/modules/ckeditor5/src/Annotation/DrupalAspectsOfCKEditor5Plugin.php
new file mode 100644
index 0000000000000000000000000000000000000000..9f50ec41911c1e857e7dfdad0f07ea1844e25326
--- /dev/null
+++ b/core/modules/ckeditor5/src/Annotation/DrupalAspectsOfCKEditor5Plugin.php
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Annotation;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines the "Drupal aspects of a CKEditor5Plugin" annotation object.
+ *
+ * Plugin Namespace: Plugin\CKEditor5Plugin.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditorPluginInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditorPluginBase
+ * @see \Drupal\ckeditor5\Plugin\CKEditorPluginManager
+ * @see plugin_api
+ *
+ * @Annotation
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin
+ */
+class DrupalAspectsOfCKEditor5Plugin extends Plugin {
+
+  /**
+   * The human-readable name of the CKEditor plugin.
+   *
+   * @var \Drupal\Core\Annotation\Translation
+   * @ingroup plugin_translatable
+   */
+  public $label;
+
+  /**
+   * The CKEditor 5 plugin class.
+   *
+   * If not specified, the CKEditor5PluginDefault class is used.
+   *
+   * This property is optional and it does not need to be declared.
+   *
+   * @var string
+   */
+  public $class = CKEditor5PluginDefault::class;
+
+  /**
+   * The library this plugin requires.
+   *
+   * This property is optional and it does not need to be declared.
+   *
+   * @var string|false
+   */
+  public $library = FALSE;
+
+  /**
+   * The admin library this plugin provides.
+   *
+   * This property is optional and it does not need to be declared.
+   *
+   * @var string|false
+   */
+  public $admin_library = FALSE;
+
+  /**
+   * List of elements and attributes provided.
+   *
+   * An array of strings, or false if no elements are provided.
+   *
+   * Syntax for each array value:
+   * - <element> only allows that HTML element with no attributes
+   * - <element attrA attrB> only allows that HTML element with attributes attrA
+   *   and attrB, and any value for those attributes.
+   * - <element attrA="foo bar baz" attrB="qux-*"> only allows that HTML element
+   *   with attributes attrA (if attrA contains one of the three listed values)
+   *   and attrB (if its value has the provided prefix).
+   * - <element data-*> only allows that HTML element with any attribute that
+   *   has the given prefix.
+   *
+   * @var string[]|false
+   */
+  public $elements;
+
+  /**
+   * List of toolbar items the plugin provides.
+   *
+   * This property is optional and it does not need to be declared.
+   *
+   * @var array[]
+   */
+  public $toolbar_items = [];
+
+  /**
+   * List of conditions to enable this plugin.
+   *
+   * This property is optional and it does not need to be declared.
+   *
+   * @var array|false
+   */
+  public $conditions = FALSE;
+
+}
diff --git a/core/modules/ckeditor5/src/Controller/CKEditor5ImageController.php b/core/modules/ckeditor5/src/Controller/CKEditor5ImageController.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d4a6c674e9cf5aacb911a9b4aeee5414dbe05b5
--- /dev/null
+++ b/core/modules/ckeditor5/src/Controller/CKEditor5ImageController.php
@@ -0,0 +1,297 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Controller;
+
+use Drupal\Component\Utility\Bytes;
+use Drupal\Component\Utility\Crypt;
+use Drupal\Component\Utility\Environment;
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Entity\Plugin\DataType\EntityAdapter;
+use Drupal\Core\File\Event\FileUploadSanitizeNameEvent;
+use Drupal\Core\File\Exception\FileException;
+use Drupal\Core\File\FileSystemInterface;
+use Drupal\Core\Lock\LockBackendInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\editor\Entity\Editor;
+use Drupal\Core\Validation\DrupalTranslator;
+use Drupal\file\Entity\File;
+use Drupal\file\FileInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Exception\HttpException;
+use Symfony\Component\Mime\MimeTypeGuesserInterface;
+use Symfony\Component\Validator\ConstraintViolation;
+use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException;
+
+/**
+ * Returns response for CKEditor5 Simple image upload adapter.
+ *
+ * @internal
+ *   Controller classes are internal.
+ */
+class CKEditor5ImageController extends ControllerBase {
+
+  /**
+   * The file system service.
+   *
+   * @var \Drupal\Core\File\FileSystem
+   */
+  protected $fileSystem;
+
+  /**
+   * The currently authenticated user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $currentUser;
+
+  /**
+   * The MIME type guesser.
+   *
+   * @var \Symfony\Component\Mime\MimeTypeGuesserInterface
+   */
+  protected $mimeTypeGuesser;
+
+  /**
+   * The lock service.
+   *
+   * @var \Drupal\Core\Lock\LockBackendInterface
+   */
+  protected $lock;
+
+  /**
+   * The event dispatcher.
+   *
+   * @var \Symfony\Contracts\EventDispatcher\EventDispatcherInterface
+   */
+  protected $eventDispatcher;
+
+  /**
+   * Constructs a new CKEditor5ImageController.
+   *
+   * @param \Drupal\Core\File\FileSystemInterface $file_system
+   *   The file system service.
+   * @param \Drupal\Core\Session\AccountInterface $current_user
+   *   The currently authenticated user.
+   * @param \Symfony\Component\Mime\MimeTypeGuesserInterface $mime_type_guesser
+   *   The MIME type guesser.
+   * @param \Drupal\Core\Lock\LockBackendInterface $lock
+   *   The lock service.
+   * @param \Symfony\Contracts\EventDispatcher\EventDispatcherInterface $event_dispatcher
+   *   The event dispatcher.
+   */
+  public function __construct(FileSystemInterface $file_system, AccountInterface $current_user, MimeTypeGuesserInterface $mime_type_guesser, LockBackendInterface $lock, EventDispatcherInterface $event_dispatcher) {
+    $this->fileSystem = $file_system;
+    $this->currentUser = $current_user;
+    $this->mimeTypeGuesser = $mime_type_guesser;
+    $this->lock = $lock;
+    $this->eventDispatcher = $event_dispatcher;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('file_system'),
+      $container->get('current_user'),
+      $container->get('file.mime_type.guesser'),
+      $container->get('lock'),
+      $container->get('event_dispatcher'),
+    );
+  }
+
+  /**
+   * Uploads and saves an image from a CKEditor5 POST.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request object.
+   *
+   * @return \Symfony\Component\HttpFoundation\JsonResponse
+   *   A JSON object including the file url.
+   *
+   * @throws \Symfony\Component\HttpKernel\Exception\HttpException
+   *   Thrown when file system errors occur.
+   * @throws \Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException
+   *   Thrown when validation errors occur.
+   * @throws \Drupal\Core\Entity\EntityStorageException
+   *   Thrown when file entity could not be saved.
+   */
+  public function upload(Request $request) {
+    // Getting the UploadedFile directly from the request.
+    $upload = $request->files->get('upload');
+    $filename = $upload->getClientOriginalName();
+
+    $editor = $request->attributes->get('editor');
+    $image_upload = $editor->getImageUploadSettings();
+    $destination = $image_upload['scheme'] . '://' . $image_upload['directory'];
+
+    // Check the destination file path is writable.
+    if (!$this->fileSystem->prepareDirectory($destination, FileSystemInterface::CREATE_DIRECTORY)) {
+      throw new HttpException(500, 'Destination file path is not writable');
+    }
+
+    $max_filesize = min(Bytes::toNumber($image_upload['max_size']), Environment::getUploadMaxSize());
+    if (!empty($image_upload['max_dimensions']['width']) || !empty($image_upload['max_dimensions']['height'])) {
+      $max_dimensions = $image_upload['max_dimensions']['width'] . 'x' . $image_upload['max_dimensions']['height'];
+    }
+    else {
+      $max_dimensions = 0;
+    }
+
+    $validators = [
+      'file_validate_extensions' => ['gif png jpg jpeg'],
+      'file_validate_size' => [$max_filesize],
+      'file_validate_image_resolution' => [$max_dimensions],
+    ];
+
+    $prepared_filename = $this->prepareFilename($filename, $validators);
+
+    // Create the file.
+    $file_uri = "{$destination}/{$prepared_filename}";
+
+    // Using the UploadedFile method instead of streamUploadData.
+    $temp_file_path = $upload->getRealPath();
+
+    $file_uri = $this->fileSystem->getDestinationFilename($file_uri, FileSystemInterface::EXISTS_RENAME);
+
+    // Lock based on the prepared file URI.
+    $lock_id = $this->generateLockIdFromFileUri($file_uri);
+
+    if (!$this->lock->acquire($lock_id)) {
+      throw new HttpException(503, sprintf('File "%s" is already locked for writing.'), NULL, ['Retry-After' => 1]);
+    }
+
+    // Begin building file entity.
+    $file = File::create([]);
+    $file->setOwnerId($this->currentUser->id());
+    $file->setFilename($prepared_filename);
+    if ($this->mimeTypeGuesser instanceof MimeTypeGuesserInterface) {
+      $file->setMimeType($this->mimeTypeGuesser->guessMimeType($prepared_filename));
+    }
+    else {
+      $file->setMimeType($this->mimeTypeGuesser->guess($prepared_filename));
+      @trigger_error('\Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface is deprecated in drupal:9.1.0 and is removed from drupal:10.0.0. Implement \Symfony\Component\Mime\MimeTypeGuesserInterface instead. See https://www.drupal.org/node/3133341', E_USER_DEPRECATED);
+    }
+
+    $file->setFileUri($file_uri);
+    $file->setSize(@filesize($temp_file_path));
+
+    $violations = $this->validate($file, $validators);
+    if ($violations->count() > 0) {
+      throw new UnprocessableEntityHttpException($violations->__toString());
+    }
+
+    try {
+      $this->fileSystem->move($temp_file_path, $file_uri, FileSystemInterface::EXISTS_ERROR);
+    }
+    catch (FileException $e) {
+      throw new HttpException(500, 'Temporary file could not be moved to file location');
+    }
+
+    $file->save();
+
+    $this->lock->release($lock_id);
+
+    return new JsonResponse([
+      'url' => $file->createFileUrl(),
+      'uuid' => $file->uuid(),
+      'entity_type' => $file->getEntityTypeId(),
+    ], 201);
+  }
+
+  /**
+   * Access check based on whether image upload is enabled or not.
+   *
+   * @param \Drupal\editor\Entity\Editor $editor
+   *   The text editor for which an image upload is occurring.
+   *
+   * @return \Drupal\Core\Access\AccessResultInterface
+   *   The access result.
+   */
+  public function imageUploadEnabledAccess(Editor $editor) {
+    if ($editor->getEditor() !== 'ckeditor5') {
+      return AccessResult::forbidden();
+    }
+    if ($editor->getImageUploadSettings()['status'] !== TRUE) {
+      return AccessResult::forbidden();
+    }
+
+    return AccessResult::allowed();
+  }
+
+  /**
+   * Validates the file.
+   *
+   * @param \Drupal\file\FileInterface $file
+   *   The file entity to validate.
+   * @param array $validators
+   *   An array of upload validators to pass to file_validate().
+   *
+   * @return \Drupal\Core\Entity\EntityConstraintViolationListInterface
+   *   The list of constraint violations, if any.
+   */
+  protected function validate(FileInterface $file, array $validators) {
+    $violations = $file->validate();
+
+    // Remove violations of inaccessible fields as they cannot stem from our
+    // changes.
+    $violations->filterByFieldAccess();
+
+    // Validate the file based on the field definition configuration.
+    $errors = file_validate($file, $validators);
+    if (!empty($errors)) {
+      $translator = new DrupalTranslator();
+      foreach ($errors as $error) {
+        $violation = new ConstraintViolation($translator->trans($error),
+          (string) $error,
+          [],
+          EntityAdapter::createFromEntity($file),
+          '',
+          NULL
+        );
+        $violations->add($violation);
+      }
+    }
+
+    return $violations;
+  }
+
+  /**
+   * Prepares the filename to strip out any malicious extensions.
+   *
+   * @param string $filename
+   *   The file name.
+   * @param array $validators
+   *   The array of upload validators.
+   *
+   * @return string
+   *   The prepared/munged filename.
+   */
+  protected function prepareFilename($filename, array &$validators) {
+    $extensions = $validators['file_validate_extensions'][0] ?? '';
+    $event = new FileUploadSanitizeNameEvent($filename, $extensions);
+    $this->eventDispatcher->dispatch($event);
+
+    return $event->getFilename();
+  }
+
+  /**
+   * Generates a lock ID based on the file URI.
+   *
+   * @param string $file_uri
+   *   The file URI.
+   *
+   * @return string
+   *   The generated lock ID.
+   */
+  protected static function generateLockIdFromFileUri($file_uri) {
+    return 'file:ckeditor5:' . Crypt::hashBase64($file_uri);
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Controller/CKEditor5MediaController.php b/core/modules/ckeditor5/src/Controller/CKEditor5MediaController.php
new file mode 100644
index 0000000000000000000000000000000000000000..a508b199f5a77f4eace58a0d5366a7092c6f19b6
--- /dev/null
+++ b/core/modules/ckeditor5/src/Controller/CKEditor5MediaController.php
@@ -0,0 +1,178 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Controller;
+
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Access\AccessResultInterface;
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Entity\EntityRepositoryInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\editor\Entity\Editor;
+use Drupal\image\Plugin\Field\FieldType\ImageItem;
+use Drupal\media\MediaInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+
+/**
+ * Provides an API for checking if a media entity has image field.
+ *
+ * @internal
+ *   Controller classes are internal.
+ */
+class CKEditor5MediaController extends ControllerBase {
+
+  /**
+   * The currently authenticated user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $currentUser;
+
+  /**
+   * The entity repository.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
+  /**
+   * The request stack.
+   *
+   * @var \Symfony\Component\HttpFoundation\RequestStack
+   */
+  protected $requestStack;
+
+  /**
+   * Constructs a new CKEditor5MediaController.
+   *
+   * @param \Drupal\Core\Session\AccountInterface $current_user
+   *   The currently authenticated user.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository.
+   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
+   *   The request stack.
+   */
+  public function __construct(AccountInterface $current_user, EntityRepositoryInterface $entity_repository, RequestStack $request_stack) {
+    $this->currentUser = $current_user;
+    $this->entityRepository = $entity_repository;
+    $this->requestStack = $request_stack;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('current_user'),
+      $container->get('entity.repository'),
+      $container->get('request_stack')
+    );
+  }
+
+  /**
+   * Checks if media has a image field.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request object.
+   *
+   * @return \Symfony\Component\HttpFoundation\JsonResponse
+   *   A JSON object including the response.
+   *
+   * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
+   *   Thrown when no media UUID is provided.
+   * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
+   *   Thrown when no media with the provided UUID exists.
+   */
+  public function isMediaImage(Request $request) {
+    $uuid = $request->query->get('uuid');
+    if ($uuid == '') {
+      throw new BadRequestHttpException();
+    }
+    // Access is enforced on route level.
+    // @see \Drupal\ckeditor5\Controller\CKEditor5MediaController::access().
+    if (!$media = $this->entityRepository->loadEntityByUuid('media', $uuid)) {
+      throw new NotFoundHttpException();
+    }
+
+    // Note that we intentionally do not use:
+    // - \Drupal\Core\Cache\CacheableResponse because caching it on the server
+    //   side is wasteful, hence there is no need for cacheability metadata.
+    // - \Drupal\Core\Render\HtmlResponse because there is no need for
+    //   attachments nor cacheability metadata.
+    return (new JsonResponse($this->hasImageField($media), 200))
+      // Do not allow any intermediary to cache the response, only the end user.
+      ->setPrivate()
+      // Allow the end user to cache it for up to 5 minutes.
+      ->setMaxAge(300);
+  }
+
+  /**
+   * Additional access check for ::isMediaImage().
+   *
+   * This grants access if media embed filter is enabled on the filter format
+   * and user has access to view the media entity.
+   *
+   * Note that access to the filter format is not checked here because the route
+   * is configured to check entity access to the filter format.
+   *
+   * @param \Drupal\editor\Entity\Editor $editor
+   *   The text editor.
+   *
+   * @return \Drupal\Core\Access\AccessResultInterface
+   *   The access result.
+   *
+   * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
+   *   Thrown when no media UUID is provided.
+   * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
+   *   Thrown when no media with the provided UUID exists.
+   */
+  public function access(Editor $editor): AccessResultInterface {
+    if ($editor->getEditor() !== 'ckeditor5') {
+      return AccessResult::forbidden();
+    }
+    // @todo add current request as an argument after
+    // https://www.drupal.org/project/drupal/issues/2786941 has been resolved.
+    $request = $this->requestStack->getCurrentRequest();
+    $uuid = $request->query->get('uuid');
+    if (!$uuid) {
+      throw new BadRequestHttpException();
+    }
+    $media = $this->entityRepository->loadEntityByUuid('media', $uuid);
+    if (!$media) {
+      throw new NotFoundHttpException();
+    }
+    $filters = $editor->getFilterFormat()->filters();
+
+    return AccessResult::allowedIf($filters->has('media_embed') && $filters->get('media_embed')->status)
+      ->andIf($media->access('view', $this->currentUser, TRUE))
+      ->addCacheableDependency($editor->getFilterFormat());
+  }
+
+  /**
+   * Check if the media type of the entity has a image field.
+   *
+   * @param \Drupal\media\MediaInterface $media
+   *   The media item being embedded.
+   *
+   * @return bool
+   *   Flag indicating whether the media type has image field or not.
+   *
+   * @see \Drupal\media\Form\EditorMediaDialog::getMediaImageSourceFieldName()
+   */
+  protected function hasImageField(MediaInterface $media) {
+    $field_definition = $media->getSource()
+      ->getSourceFieldDefinition($media->bundle->entity);
+    $item_class = $field_definition->getItemDefinition()->getClass();
+    if (is_a($item_class, ImageItem::class, TRUE)) {
+      return TRUE;
+    }
+    return FALSE;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/HTMLRestrictionsUtilities.php b/core/modules/ckeditor5/src/HTMLRestrictionsUtilities.php
new file mode 100644
index 0000000000000000000000000000000000000000..dee7d24c5005b4344f424dcbbd0237518418ba0f
--- /dev/null
+++ b/core/modules/ckeditor5/src/HTMLRestrictionsUtilities.php
@@ -0,0 +1,253 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5;
+
+use Drupal\Component\Assertion\Inspector;
+use Drupal\Component\Utility\DiffArray;
+use Drupal\Component\Utility\Html;
+use Masterminds\HTML5\Elements;
+
+/**
+ * Utilities for interacting with HTML restrictions.
+ *
+ * @internal
+ */
+final class HTMLRestrictionsUtilities {
+
+  /**
+   * Wildcard types, and the methods that return tags the wildcard represents.
+   *
+   * @var string[]
+   */
+  private const WILDCARD_ELEMENT_METHODS = [
+    '$block' => 'getBlockElementList',
+  ];
+
+  /**
+   * Formats HTML elements for display.
+   *
+   * @param array $elements
+   *   List of elements to format.
+   *
+   * @return string
+   *   A formatted list; a string representation of the given HTML elements.
+   */
+  public static function toReadableElements(array $elements): array {
+    $readable = [];
+    foreach ($elements as $tag => $attributes) {
+      $attribute_string = '';
+      if (is_array($attributes)) {
+        foreach ($attributes as $attribute_name => $attribute_values) {
+          if (is_array($attribute_values)) {
+            $attribute_values_string = implode(' ', array_keys($attribute_values));
+            $attribute_string .= "$attribute_name=\"$attribute_values_string\" ";
+          }
+          else {
+            $attribute_string .= "$attribute_name ";
+          }
+        }
+      }
+      $joined = '<' . $tag . (!empty($attribute_string) ? ' ' . trim($attribute_string) : '') . '>';
+      array_push($readable, $joined);
+    }
+    assert(Inspector::assertAllStrings($readable));
+    return $readable;
+  }
+
+  /**
+   * Parses a HTML restrictions string with >=1 tags in an array of single tags.
+   *
+   * @param string $elements_string
+   *   A HTML restrictions string.
+   *
+   * @return string[]
+   *   A list of strings, with a HTML tag and potentially attributes in each.
+   */
+  public static function allowedElementsStringToPluginElementsArray(string $elements_string): array {
+    $html_restrictions = static::allowedElementsStringToHtmlFilterArray($elements_string);
+    return static::toReadableElements($html_restrictions);
+  }
+
+  /**
+   * Parses an HTML string into an array structured as expected by filter_html.
+   *
+   * @param string $elements_string
+   *   A string of HTML tags, potentially with attributes.
+   *
+   * @return array
+   *   An elements array in the structure expected by filter_html.
+   *
+   * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManager::WILDCARD_ELEMENT_METHODS
+   *   Each key in this array represents a valid wildcard tag.
+   */
+  public static function allowedElementsStringToHtmlFilterArray(string $elements_string): array {
+    preg_match('/<(\$[A-Z,a-z]*)/', $elements_string, $wildcard_matches);
+
+    $wildcard = NULL;
+    if (!empty($wildcard_matches)) {
+      $wildcard = $wildcard_matches[1];
+      assert(substr($wildcard, 0, 1) === '$', 'Wildcard tags must begin with "$"');
+      $elements_string = str_replace($wildcard, 'WILDCARD', $elements_string);
+    }
+
+    $elements = [];
+    $body_child_nodes = Html::load(str_replace('>', ' />', $elements_string))->getElementsByTagName('body')->item(0)->childNodes;
+
+    foreach ($body_child_nodes as $node) {
+      if ($node->nodeType !== XML_ELEMENT_NODE) {
+        // Skip the empty text nodes inside tags.
+        continue;
+      }
+
+      $tag = $wildcard ?? $node->tagName;
+      if ($node->hasAttributes()) {
+        foreach ($node->attributes as $attribute_name => $attribute) {
+          $value = empty($attribute->value) ? TRUE : explode(' ', $attribute->value);
+          self::providedElementsAttributes($elements, $tag, $attribute_name, $value);
+        }
+      }
+      else {
+        if (!isset($elements[$tag])) {
+          $elements[$tag] = FALSE;
+        }
+      }
+    }
+    return $elements;
+  }
+
+  /**
+   * Cleans unwanted artifacts from "allowed HTML" arrays.
+   *
+   * @param array $elements
+   *   An array of allowed elements, structured as expected by filter_html.
+   *
+   * @return array
+   *   The array without unwanted artifacts.
+   */
+  public static function cleanAllowedHtmlArray(array $elements): array {
+    // When recursively merging elements arrays, unkeyed boolean values can
+    // appear in attribute config arrays. This removes them.
+    foreach ($elements as $tag => $tag_config) {
+      if (is_array($tag_config)) {
+        $elements[$tag] = array_filter($tag_config);
+      }
+    }
+    return $elements;
+  }
+
+  /**
+   * Adds allowed attributes to the elements array.
+   *
+   * @param array $elements
+   *   The elements array.
+   * @param string $tag
+   *   The tag having its attributes configured.
+   * @param string $attribute
+   *   The attribute being configured.
+   * @param array|bool $value
+   *   The attribute config value.
+   */
+  public static function providedElementsAttributes(array &$elements, string $tag, string $attribute, $value): void {
+    $attribute_already_allows_all = isset($elements[$tag][$attribute]) && $elements[$tag][$attribute] === TRUE;
+
+    if ($value === TRUE) {
+      $elements[$tag][$attribute] = TRUE;
+    }
+    elseif (!$attribute_already_allows_all) {
+      foreach ($value as $attribute_value) {
+        $elements[$tag][$attribute][$attribute_value] = TRUE;
+      }
+    }
+  }
+
+  /**
+   * Compares two HTML restrictions.
+   *
+   * @param array $elements_array_1
+   *   The array to compare from.
+   * @param array $elements_array_2
+   *   The array to compare to.
+   *
+   * @return array
+   *   Returns an array with all the values in $elements_array_1 that are not
+   *   present in $elements_array_1, including values that are FALSE
+   */
+  public static function diffAllowedElements(array $elements_array_1, array $elements_array_2): array {
+    return array_filter(
+      DiffArray::diffAssocRecursive($elements_array_1, $elements_array_2),
+      // DiffArray::diffAssocRecursive() does not know the semantics of the
+      // HTML restrictions array: unaware that `TAG => FALSE` is a subset of
+      // `TAG => foo` and that in turn is a subset of `TAG => TRUE`.
+      // @see \Drupal\filter\Entity\FilterFormat::getHtmlRestrictions()
+      function ($value, string $tag) use ($elements_array_2) {
+        return $value !== FALSE || !array_key_exists($tag, $elements_array_2);
+      },
+      ARRAY_FILTER_USE_BOTH
+    );
+  }
+
+  /**
+   * Parses a HTML restrictions string into htmlSupport plugin config structure.
+   *
+   * @param string $elements_string
+   *   A HTML restrictions string.
+   *
+   * @return string[]
+   *   An array of allowed elements, structured in the manner expected by the
+   *   CKEditor 5 htmlSupport plugin constructor.
+   *
+   * @see https://ckeditor5.github.io/docs/nightly/ckeditor5/latest/features/general-html-support.html#configuration
+   */
+  public static function allowedElementsStringToHtmlSupportConfig(string $elements_string): array {
+    $html_restrictions = static::allowedElementsStringToHtmlFilterArray($elements_string);
+    $allowed = [];
+    foreach ($html_restrictions as $tag => $attributes) {
+      $to_allow['name'] = $tag;
+      assert($attributes === FALSE || is_array($attributes));
+      if (is_array($attributes)) {
+        foreach ($attributes as $name => $value) {
+          assert($value === TRUE || Inspector::assertAllStrings($value));
+          $to_allow['attributes'][$name] = $value;
+        }
+      }
+      $allowed[] = $to_allow;
+    }
+
+    return $allowed;
+  }
+
+  /**
+   * Gets a list of block level elements.
+   *
+   * @return array
+   *   An array of block level element tags.
+   */
+  private static function getBlockElementList(): array {
+    return array_filter(array_keys(Elements::$html5), function (string $element) {
+      return Elements::isA($element, Elements::BLOCK_TAG);
+    });
+  }
+
+  /**
+   * Returns the tags that match the provided wildcard.
+   *
+   * A wildcard tag in element config is a way of representing multiple tags
+   * with a single item, such as `<$block>` to represent all block tags. Each
+   * wildcard should have a corresponding callback method listed in
+   * WILDCARD_ELEMENT_METHODS that returns the set of tags represented by the
+   * wildcard.
+   *
+   * @param string $wildcard
+   *   The wildcard that represents multiple tags.
+   *
+   * @return array
+   *   An array of HTML tags.
+   */
+  public static function getWildcardTags(string $wildcard):array {
+    $wildcard_element_method = self::WILDCARD_ELEMENT_METHODS[$wildcard];
+    return call_user_func([self::class, $wildcard_element_method]);
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor4To5Upgrade/Core.php b/core/modules/ckeditor5/src/Plugin/CKEditor4To5Upgrade/Core.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a8fe53c7362a70106ec21ab427f180406035c3f
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor4To5Upgrade/Core.php
@@ -0,0 +1,216 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor4To5Upgrade;
+
+use Drupal\ckeditor5\Plugin\CKEditor4To5UpgradePluginInterface;
+use Drupal\Core\Plugin\PluginBase;
+use Drupal\filter\FilterFormatInterface;
+
+/**
+ * Provides the CKEditor 4 to 5 upgrade for Drupal core's CKEditor plugins.
+ *
+ * @CKEditor4To5Upgrade(
+ *   id = "core",
+ *   cke4_buttons = {
+ *     "DrupalImage",
+ *     "DrupalLink",
+ *     "DrupalUnlink",
+ *     "Bold",
+ *     "Italic",
+ *     "Underline",
+ *     "Superscript",
+ *     "Subscript",
+ *     "BulletedList",
+ *     "NumberedList",
+ *     "Outdent",
+ *     "Indent",
+ *     "Undo",
+ *     "Redo",
+ *     "Blockquote",
+ *     "JustifyLeft",
+ *     "JustifyCenter",
+ *     "JustifyRight",
+ *     "JustifyBlock",
+ *     "HorizontalRule",
+ *     "Format",
+ *     "Table",
+ *     "Source",
+ *     "Strike",
+ *     "Cut",
+ *     "Copy",
+ *     "Paste",
+ *     "PasteText",
+ *     "PasteFromWord",
+ *     "ShowBlocks",
+ *     "Maximize",
+ *     "-",
+ *     "RemoveFormat",
+ *     "Styles",
+ *     "SpecialChar",
+ *     "Language",
+ *     "DrupalMediaLibrary",
+ *   },
+ *   cke4_plugin_settings = {
+ *     "stylescombo",
+ *     "language",
+ *   },
+ *   cke5_plugin_elements_subset_configuration = {
+ *    "ckeditor5_heading",
+ *   }
+ * )
+ *
+ * @internal
+ *   Plugin classes are internal.
+ */
+class Core extends PluginBase implements CKEditor4To5UpgradePluginInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function mapCKEditor4ToolbarButtonToCKEditor5ToolbarItem(string $cke4_button): ?string {
+    switch ($cke4_button) {
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\DrupalImage
+      case 'DrupalImage':
+        return 'uploadImage';
+
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\DrupalLink
+      case 'DrupalLink':
+        return 'link';
+
+      case 'DrupalUnlink':
+        return NULL;
+
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\Internal
+      case 'Bold':
+      case 'Italic':
+      case 'Underline':
+      case 'Superscript':
+      case 'Subscript':
+      case 'BulletedList':
+      case 'NumberedList':
+      case 'Outdent':
+      case 'Indent':
+      case 'Undo':
+      case 'Redo':
+        return lcfirst($cke4_button);
+
+      case 'Blockquote':
+        return 'blockQuote';
+
+      case 'JustifyLeft':
+        return "alignment:left";
+
+      case 'JustifyCenter':
+        return "alignment:center";
+
+      case 'JustifyRight':
+        return "alignment:right";
+
+      case 'JustifyBlock':
+        return "alignment:justify";
+
+      case 'HorizontalRule':
+        return 'horizontalLine';
+
+      case 'Format':
+        return 'heading';
+
+      case 'Table':
+        return 'insertTable';
+
+      case 'Source':
+        return 'sourceEditing';
+
+      case 'Strike':
+        return 'strikethrough';
+
+      case 'Cut':
+      case 'Copy':
+      case 'Paste':
+      case 'PasteText':
+      case 'PasteFromWord':
+      case 'ShowBlocks':
+      case 'Maximize':
+      case '-':
+        // @see https://www.drupal.org/project/ckeditor5/issues/3211049#comment-14167764
+        return NULL;
+
+      // @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\RemoveFormat
+      case 'RemoveFormat':
+        return 'removeFormat';
+
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\StylesCombo
+      case 'Styles':
+        // @todo Change in https://www.drupal.org/project/ckeditor5/issues/3222797
+        return NULL;
+
+      // @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\specialCharacters
+      case 'SpecialChar':
+        return 'specialCharacters';
+
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\Language
+      case 'Language':
+        return 'textPartLanguage';
+
+      // @see \Drupal\media_library\Plugin\CKEditorPlugin\DrupalMediaLibrary
+      case 'DrupalMediaLibrary':
+        return 'drupalMedia';
+
+      default:
+        throw new \OutOfBoundsException();
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function mapCKEditor4SettingsToCKEditor5Configuration(string $cke4_plugin_id, array $cke4_plugin_settings): ?array {
+    switch ($cke4_plugin_id) {
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\StylesCombo
+      case 'stylescombo':
+        // @todo Change in https://www.drupal.org/project/ckeditor5/issues/3222797
+        return NULL;
+
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\Language
+      case 'language':
+        // Identical configuration.
+        return ['ckeditor5_language' => $cke4_plugin_settings];
+
+      default:
+        throw new \OutOfBoundsException();
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function computeCKEditor5PluginSubsetConfiguration(string $cke5_plugin_id, FilterFormatInterface $text_format): ?array {
+    switch ($cke5_plugin_id) {
+      case 'ckeditor5_heading':
+        $restrictions = $text_format->getHtmlRestrictions();
+        if ($restrictions === FALSE) {
+          // The default is to allow all headings, which makes sense when there
+          // are no restrictions.
+          // @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\Heading::DEFAULT_CONFIGURATION
+          return NULL;
+        }
+        // Otherwise, only enable headings that allowed by the restrictions.
+        $configuration = [];
+        foreach (range(2, 6) as $index) {
+          // Merely checking the existence of the array key is sufficient; this
+          // plugin does not set or need any additional attributes.
+          // @see \Drupal\filter\Plugin\FilterInterface::getHTMLRestrictions()
+          if (array_key_exists("h$index", $restrictions['allowed'])) {
+            $configuration['enabled_headings'][] = "heading$index";
+          }
+        }
+        return $configuration;
+
+      default:
+        throw new \OutOfBoundsException();
+    }
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor4To5UpgradePluginInterface.php b/core/modules/ckeditor5/src/Plugin/CKEditor4To5UpgradePluginInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ba927920ac1f2ed25fafc8d39a9202921351909
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor4To5UpgradePluginInterface.php
@@ -0,0 +1,93 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\Component\Plugin\PluginInspectionInterface;
+use Drupal\filter\FilterFormatInterface;
+
+/**
+ * Defines an interface for CKEditor 4 to 5 upgrade plugins.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor4To5UpgradePluginManager
+ * @see \Drupal\ckeditor5\Annotation\CKEditor4To5Upgrade
+ * @see plugin_api
+ */
+interface CKEditor4To5UpgradePluginInterface extends PluginInspectionInterface {
+
+  /**
+   * Maps a CKEditor 4 button to the CKEditor 5 equivalent, if it exists.
+   *
+   * Generated by inspecting all \Drupal\ckeditor\CKEditorPluginButtonsInterface
+   * implementations.
+   *
+   * @param string $cke4_button
+   *   A valid CKEditor 4 button name.
+   *
+   * @return string|null
+   *   The equivalent CKEditor 5 toolbar item, or NULL if no equivalent exists.
+   *   In either case, the button name must be added to the annotation.
+   *
+   * @throws \OutOfBoundsException
+   *   Thrown when this plugin does not know whether an equivalent exists.
+   *
+   * @see \Drupal\ckeditor\CKEditorPluginButtonsInterface
+   * @see \Drupal\ckeditor5\Annotation\CKEditor4To5Upgrade
+   */
+  public function mapCKEditor4ToolbarButtonToCKEditor5ToolbarItem(string $cke4_button): ?string;
+
+  /**
+   * Maps CKEditor 4 settings to the CKEditor 5 equivalent, if needed.
+   *
+   * Not every CKEditor 5 plugin has settings; some CKEditor 5 plugins may have
+   * settings that the CKEditor 4 equivalent did not and vice versa. Therefore
+   * the complete CKEditor 4 settings are provided, and any CKEditor 5 setting
+   * can be set.
+   *
+   * @param string $cke4_plugin_id
+   *   The CKEditor 4 plugin whose settings need to be mapped.
+   * @param array $cke4_plugin_settings
+   *   The settings for this CKEditor 4 plugin.
+   *
+   * @return array|null
+   *   NULL if not needed, otherwise an array with a single key-value pair:
+   *   - key: the plugin ID of the equivalent CKEditor 5 plugin
+   *   - value: the equivalent settings
+   *   In either case, the button name must be added to the annotation.
+   *
+   * @throws \OutOfBoundsException
+   *   Thrown when this plugin does not know whether an equivalent exists.
+   *
+   * @see \Drupal\ckeditor\CKEditorPluginConfigurableInterface
+   * @see \Drupal\ckeditor5\Annotation\CKEditor4To5Upgrade
+   */
+  public function mapCKEditor4SettingsToCKEditor5Configuration(string $cke4_plugin_id, array $cke4_plugin_settings): ?array;
+
+  /**
+   * Computes elements subset configuration for CKEditor 5 plugin.
+   *
+   * Every CKEditor 5 plugin that implements the elements subset interface must
+   * implement this as well, to ensure a smooth upgrade path.
+   *
+   * @param string $cke5_plugin_id
+   *   The CKEditor 5 plugin whose subset configuration needs to be computed.
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The text format based on whose restrictions this should be computed.
+   *
+   * @return array|null
+   *   NULL if not needed, otherwise a configuration array (which can itself be
+   *   a subset of the default configuration of this CKEditor 5 plugin: perhaps
+   *   only some of the configuration values determine the subset).
+   *
+   * @throws \OutOfBoundsException
+   *   Thrown when no upgrade path exists.
+   * @throws \LogicException
+   *   Thrown when a plugin claims to provide an upgrade path but does not.
+   *
+   * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginElementsSubsetInterface
+   * @see \Drupal\ckeditor5\Annotation\CKEditor4To5Upgrade
+   */
+  public function computeCKEditor5PluginSubsetConfiguration(string $cke5_plugin_id, FilterFormatInterface $text_format): ?array;
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor4To5UpgradePluginManager.php b/core/modules/ckeditor5/src/Plugin/CKEditor4To5UpgradePluginManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..fdb0bce005dea2cf77530bcf782b2452da9677b1
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor4To5UpgradePluginManager.php
@@ -0,0 +1,226 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\ckeditor5\Annotation\CKEditor4To5Upgrade;
+use Drupal\Component\Assertion\Inspector;
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Plugin\DefaultPluginManager;
+use Drupal\filter\FilterFormatInterface;
+
+/**
+ * Provides a CKEditor 4 to 5 upgrade plugin manager.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor4To5UpgradePluginInterface
+ * @see \Drupal\ckeditor5\Annotation\CKEditor4To5Upgrade
+ * @see plugin_api
+ *
+ * @internal
+ */
+class CKEditor4To5UpgradePluginManager extends DefaultPluginManager {
+
+  /**
+   * A map of CKEditor 4 buttons to an upgrade plugin ID.
+   *
+   * @var array
+   */
+  protected $cke4ButtonsMap;
+
+  /**
+   * A map of CKEditor 4 plugins with settings to an upgrade plugin ID.
+   *
+   * @var array
+   */
+  protected $cke4PluginSettingsMap;
+
+  /**
+   * A map of CKEditor 5 plugins with configurable subset to upgrade plugin ID.
+   *
+   * @var array
+   */
+  protected $cke5SubsetConfigurationMap;
+
+  /**
+   * Constructs a CKEditor4To5UpgradePluginManager object.
+   *
+   * @param \Traversable $namespaces
+   *   An object that implements \Traversable which contains the root paths
+   *   keyed by the corresponding namespace to look for plugin implementations.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
+   *   Cache backend instance to use.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler to invoke the alter hook with.
+   */
+  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
+    parent::__construct('Plugin/CKEditor4To5Upgrade', $namespaces, $module_handler, CKEditor4To5UpgradePluginInterface::class, CKEditor4To5Upgrade::class);
+
+    $this->alterInfo('ckeditor4to5upgrade_plugin_info');
+    $this->setCacheBackend($cache_backend, 'ckeditor4to5upgrade_plugins');
+  }
+
+  /**
+   * Validates plugin definitions: avoids conflicts. Builds maps for later use.
+   */
+  protected function validateAndBuildMaps(): void {
+    if ($this->cke4ButtonsMap !== NULL) {
+      return;
+    }
+
+    foreach ($this->getDefinitions() as $upgrade_plugin_id => $definition) {
+      // Only one CKEditor4To5Upgrade plugin can define the upgrade path for a
+      // CKEditor 4 button.
+      if (isset($definition['cke4_buttons'])) {
+        assert(Inspector::assertAllStrings($definition['cke4_buttons']));
+        foreach ($definition['cke4_buttons'] as $cke4_button_id) {
+          if (isset($this->cke4ButtonsMap[$cke4_button_id])) {
+            throw new \OutOfBoundsException(sprintf('The "%s" CKEditor 4 button is already being upgraded by the "%s" CKEditor4To5Upgrade plugin, the "%s" plugin is as well. This conflict needs to be resolved.', $cke4_button_id, $this->cke4ButtonsMap[$cke4_button_id], $upgrade_plugin_id));
+          }
+          $this->cke4ButtonsMap[$cke4_button_id] = $upgrade_plugin_id;
+        }
+      }
+
+      // Only one CKEditor4To5Upgrade plugin can define the upgrade path for a
+      // CKEditor 4 plugin's settings.
+      if (isset($definition['cke4_plugin_settings'])) {
+        assert(Inspector::assertAllStrings($definition['cke4_plugin_settings']));
+        foreach ($definition['cke4_plugin_settings'] as $cke4_plugin_id) {
+          if (isset($this->cke4PluginSettingsMap[$cke4_plugin_id])) {
+            throw new \OutOfBoundsException(sprintf('The "%s" CKEditor 4 plugin\'s settings are already being upgraded by the "%s" CKEditor4To5Upgrade plugin, the "%s" plugin is as well. This conflict needs to be resolved.', $cke4_plugin_id, $this->cke4PluginSettingsMap[$cke4_plugin_id], $upgrade_plugin_id));
+          }
+          $this->cke4PluginSettingsMap[$cke4_plugin_id] = $upgrade_plugin_id;
+        }
+      }
+
+      // Only one CKEditor4To5Upgrade plugin can define the upgrade path for a
+      // CKEditor 5 plugin's elements subset configuration.
+      if (isset($definition['cke5_plugin_elements_subset_configuration'])) {
+        assert(Inspector::assertAllStrings($definition['cke5_plugin_elements_subset_configuration']));
+        foreach ($definition['cke5_plugin_elements_subset_configuration'] as $cke5_plugin_id) {
+          if (isset($this->cke5SubsetConfigurationMap[$cke5_plugin_id])) {
+            throw new \OutOfBoundsException(sprintf('The "%s" CKEditor 5 plugin\'s elements subset configuration is already being computed by the "%s" CKEditor4To5Upgrade plugin, the "%s" plugin is as well. This conflict needs to be resolved.', $cke5_plugin_id, $this->cke5SubsetConfigurationMap[$cke5_plugin_id], $upgrade_plugin_id));
+          }
+          $this->cke5SubsetConfigurationMap[$cke5_plugin_id] = $upgrade_plugin_id;
+        }
+      }
+    }
+  }
+
+  /**
+   * Maps a CKEditor 4 button to the CKEditor 5 equivalent, if it exists.
+   *
+   * Generated by inspecting all \Drupal\ckeditor\CKEditorPluginButtonsInterface
+   * implementations.
+   *
+   * @param string $cke4_button
+   *   A valid CKEditor 4 button name.
+   *
+   * @return string|null
+   *   The equivalent CKEditor 5 toolbar item, or NULL if no equivalent exists.
+   *
+   * @throws \OutOfBoundsException
+   *   Thrown when no upgrade path exists.
+   * @throws \LogicException
+   *   Thrown when a plugin claims to provide an upgrade path but does not.
+   *
+   * @see \Drupal\ckeditor\CKEditorPluginButtonsInterface
+   */
+  public function mapCKEditor4ToolbarButtonToCKEditor5ToolbarItem(string $cke4_button): ?string {
+    $this->validateAndBuildMaps();
+
+    if (!isset($this->cke4ButtonsMap[$cke4_button])) {
+      throw new \OutOfBoundsException(sprintf('No upgrade path found for the "%s" button.', $cke4_button));
+    }
+
+    $plugin_id = $this->cke4ButtonsMap[$cke4_button];
+    try {
+      return $this->createInstance($plugin_id)->mapCKEditor4ToolbarButtonToCKEditor5ToolbarItem($cke4_button);
+    }
+    catch (\OutOfBoundsException $e) {
+      throw new \LogicException(sprintf('The "%s" CKEditor4To5Upgrade plugin claims to provide an upgrade path for the "%s" CKEditor 4 button but does not.', $plugin_id, $cke4_button));
+    }
+  }
+
+  /**
+   * Maps CKEditor 4 settings to the CKEditor 5 equivalent, if needed.
+   *
+   * Not every CKEditor 5 plugin has settings; some CKEditor 5 plugins may have
+   * settings that the CKEditor 4 equivalent did not and vice versa. Therefore
+   * the complete CKEditor 4 settings are provided, and any CKEditor 5 setting
+   * can be set.
+   *
+   * @param string $cke4_plugin_id
+   *   The CKEditor 4 plugin whose settings need to be mapped.
+   * @param array $cke4_plugin_settings
+   *   The settings for this CKEditor 4 plugin.
+   *
+   * @return array|null
+   *   NULL if not needed, otherwise an array with a single key-value pair:
+   *   - key: the plugin ID of the equivalent CKEditor 5 plugin
+   *   - value: the equivalent settings
+   *
+   * @throws \OutOfBoundsException
+   *   Thrown when no upgrade path exists.
+   * @throws \LogicException
+   *   Thrown when a plugin claims to provide an upgrade path but does not.
+   *
+   * @see \Drupal\ckeditor\CKEditorPluginConfigurableInterface
+   */
+  public function mapCKEditor4SettingsToCKEditor5Configuration(string $cke4_plugin_id, array $cke4_plugin_settings): ?array {
+    $this->validateAndBuildMaps();
+
+    if (!isset($this->cke4PluginSettingsMap[$cke4_plugin_id])) {
+      throw new \OutOfBoundsException(sprintf('No upgrade path found for the "%s" plugin settings.', $cke4_plugin_id));
+    }
+
+    $plugin_id = $this->cke4PluginSettingsMap[$cke4_plugin_id];
+    try {
+      return $this->createInstance($plugin_id)->mapCKEditor4SettingsToCKEditor5Configuration($cke4_plugin_id, $cke4_plugin_settings);
+    }
+    catch (\OutOfBoundsException $e) {
+      throw new \LogicException(sprintf('The "%s" CKEditor4To5Upgrade plugin claims to provide an upgrade path for the "%s" CKEditor 4 plugin settings but does not.', $plugin_id, $cke4_plugin_id));
+    }
+  }
+
+  /**
+   * Computes elements subset configuration for CKEditor 5 plugin.
+   *
+   * Every CKEditor 5 plugin that implements the elements subset interface must
+   * implement this as well, to ensure a smooth upgrade path.
+   *
+   * @param string $cke5_plugin_id
+   *   The CKEditor 5 plugin whose subset configuration needs to be computed.
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The text format based on whose restrictions this should be computed.
+   *
+   * @return array|null
+   *   NULL if not needed, otherwise a configuration array (which can itself be
+   *   a subset of the default configuration of this CKEditor 5 plugin: perhaps
+   *   only some of the configuration values determine the subset).
+   *
+   * @throws \OutOfBoundsException
+   *   Thrown when no upgrade path exists.
+   * @throws \LogicException
+   *   Thrown when a plugin claims to provide an upgrade path but does not.
+   *
+   * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginElementsSubsetInterface
+   */
+  public function computeCKEditor5PluginSubsetConfiguration(string $cke5_plugin_id, FilterFormatInterface $text_format): ?array {
+    $this->validateAndBuildMaps();
+
+    if (!isset($this->cke5SubsetConfigurationMap[$cke5_plugin_id])) {
+      throw new \OutOfBoundsException(sprintf('No upgrade path found for the "%s" elements subset configuration.', $cke5_plugin_id));
+    }
+
+    $plugin_id = $this->cke5SubsetConfigurationMap[$cke5_plugin_id];
+    try {
+      return $this->createInstance($plugin_id)->computeCKEditor5PluginSubsetConfiguration($cke5_plugin_id, $text_format);
+    }
+    catch (\OutOfBoundsException $e) {
+      throw new \LogicException(sprintf('The "%s" CKEditor4To5Upgrade plugin claims to provide an upgrade path for the "%s" CKEditor 4 plugin settings but does not.', $plugin_id, $cke5_plugin_id));
+    }
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/DynamicPluginConfigWithCsrfTokenUrlTrait.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/DynamicPluginConfigWithCsrfTokenUrlTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..953cec0ac10565ffc0b36309d46150ea10f840de
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/DynamicPluginConfigWithCsrfTokenUrlTrait.php
@@ -0,0 +1,52 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\Core\Url;
+
+/**
+ * Provides a trait for CKEditor 5 with dynamically generated CSRF token URLs.
+ *
+ * The Text Editor module's APIs predate the concept of bubbleable metadata. To
+ * prevent URLs with CSRF tokens from breaking cacheability, placeholders are
+ * used for those CSRF tokens since https://drupal.org/i/2512132. Placeholders
+ * are designed to be attached to the data in which they exist, so they can be
+ * replaced at the last possible moment, without interfering with cacheability.
+ * Unfortunately, because it is not possible to associate bubbleable metadata
+ * with a Text Editor's JS settings, we have to manually process these. This is
+ * acceptable only because a text editor's JS settings are not cacheable anyway
+ * (just like forms are not cacheable).
+ *
+ * @see \Drupal\Core\Access\CsrfAccessCheck
+ * @see \Drupal\Core\Access\RouteProcessorCsrf::processOutbound()
+ * @see \Drupal\Core\Render\BubbleableMetadata
+ * @see \Drupal\editor\Plugin\EditorPluginInterface::getJSSettings()
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\ImageUpload::getDynamicPluginConfig()
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\Media::getDynamicPluginConfig()
+ * @see https://www.drupal.org/project/drupal/issues/2512132
+ *
+ * @internal
+ */
+trait DynamicPluginConfigWithCsrfTokenUrlTrait {
+
+  /**
+   * Gets the given URL with all placeholders replaced.
+   *
+   * @param \Drupal\Core\Url $url
+   *   A URL which generates CSRF token placeholders.
+   *
+   * @return string
+   *   The URL string, with all placeholders replaced.
+   */
+  private static function getUrlWithReplacedCsrfTokenPlaceholder(Url $url): string {
+    $generated_url = $url->toString(TRUE);
+    $url_with_csrf_token_placeholder = [
+      '#plain_text' => $generated_url->getGeneratedUrl(),
+    ];
+    $generated_url->applyTo($url_with_csrf_token_placeholder);
+    return (string) \Drupal::service('renderer')->renderPlain($url_with_csrf_token_placeholder);
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Heading.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Heading.php
new file mode 100644
index 0000000000000000000000000000000000000000..0dcd50a463854e9c23f6764087a7cea58ecc1bbf
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Heading.php
@@ -0,0 +1,226 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginElementsSubsetInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\editor\EditorInterface;
+
+/**
+ * CKEditor 5 Heading plugin.
+ *
+ * @internal
+ *   Plugin classes are internal.
+ */
+class Heading extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface, CKEditor5PluginElementsSubsetInterface {
+
+  use CKEditor5PluginConfigurableTrait;
+
+  /**
+   * The headings that cannot be disabled.
+   *
+   * @var string[]
+   */
+  const ALWAYS_ENABLED_HEADINGS = [
+    'paragraph',
+  ];
+
+  /**
+   * The default configuration for this plugin.
+   *
+   * @var string[][]
+   */
+  const DEFAULT_CONFIGURATION = [
+    'enabled_headings' => [
+      'heading2',
+      'heading3',
+      'heading4',
+      'heading5',
+      'heading6',
+    ],
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return static::DEFAULT_CONFIGURATION;
+  }
+
+  /**
+   * Computes all valid choices for the "enabled_headings" setting.
+   *
+   * @see ckeditor5.schema.yml
+   *
+   * @return string[]
+   *   All valid choices.
+   */
+  public static function validChoices(): array {
+    $cke5_plugin_manager = \Drupal::service('plugin.manager.ckeditor5.plugin');
+    assert($cke5_plugin_manager instanceof CKEditor5PluginManagerInterface);
+    $plugin_definition = $cke5_plugin_manager->getDefinition('ckeditor5_heading');
+    assert($plugin_definition->getClass() === static::class);
+    return array_diff(
+      array_column($plugin_definition->getCKEditor5Config()['heading']['options'], 'model'),
+      static::ALWAYS_ENABLED_HEADINGS
+    );
+  }
+
+  /**
+   * Gets all enabled headings.
+   *
+   * @return string[]
+   *   The values in the plugins.ckeditor5_heading.enabled_headings configuration
+   *   plus the headings that are always enabled.
+   */
+  private function getEnabledHeadings(): array {
+    return array_merge(
+      self::ALWAYS_ENABLED_HEADINGS,
+      $this->configuration['enabled_headings']
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * Form for choosing which heading tags are available.
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $form['enabled_headings'] = [
+      '#type' => 'fieldset',
+      '#title' => $this->t('Enabled Headings'),
+      '#description' => $this->t('These are the headings that will appear in the headings dropdown. If a heading is not chosen here, it does not necessarily mean the corresponding tag is disallowed in the text format.'),
+    ];
+
+    foreach ($this->getPluginDefinition()->getCKEditor5Config()['heading']['options'] as $heading_option) {
+      $model = $heading_option['model'];
+
+      if (in_array($model, self::ALWAYS_ENABLED_HEADINGS, TRUE)) {
+        continue;
+      }
+
+      // It's safe to use $model as a key: listing the same model twice with
+      // different properties triggers a schema error in CKEditor 5.
+      // @see https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/error-codes.html#error-schema-cannot-register-item-twice
+      // @see https://ckeditor.com/docs/ckeditor5/latest/features/headings.html#configuring-custom-heading-elements
+      $form['enabled_headings'][$model] = self::generateCheckboxForHeadingOption($heading_option);
+      $form['enabled_headings'][$model]['#default_value'] = in_array($model, $this->configuration['enabled_headings'], TRUE) ? $model : NULL;
+    }
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+    // Match the config schema structure at ckeditor5.plugin.ckeditor5_heading.
+    $form_value = $form_state->getValue('enabled_headings');
+    $config_value = array_values(array_filter($form_value));
+    $form_state->setValue('enabled_headings', $config_value);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $this->configuration['enabled_headings'] = $form_state->getValue('enabled_headings');
+  }
+
+  /**
+   * Generates checkbox for a CKEditor 5 heading plugin config option.
+   *
+   * @param array $heading_option
+   *   A heading option configuration as the CKEditor 5 Heading plugin expects
+   *   in its configuration.
+   *
+   * @return array
+   *   The checkbox render array.
+   *
+   * @see https://ckeditor.com/docs/ckeditor5/latest/api/module_heading_heading-HeadingConfig.html#member-options
+   */
+  private static function generateCheckboxForHeadingOption(array $heading_option): array {
+    // This requires the `title` and `model` properties. The `class` property is
+    // optional. The `view` property is not used.
+    assert(array_key_exists('title', $heading_option));
+    assert(array_key_exists('model', $heading_option));
+
+    $checkbox = [
+      '#type' => 'checkbox',
+      '#title' => $heading_option['title'],
+      '#return_value' => $heading_option['model'],
+    ];
+    if (isset($heading_option['class'])) {
+      $checkbox['#label_attributes']['class'][] = $heading_option['class'];
+      $checkbox['#label_attributes']['class'][] = 'ck';
+    }
+
+    return $checkbox;
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * Filters the header options to those chosen in editor config.
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    $enabled_headings = $this->getEnabledHeadings($editor);
+    $all_heading_options = $static_plugin_config['heading']['options'];
+
+    $configured_heading_options = array_filter($all_heading_options, function ($option) use ($enabled_headings) {
+      return in_array($option['model'], $enabled_headings, TRUE);
+    });
+
+    return [
+      'heading' => [
+        'options' => array_values($configured_heading_options),
+      ],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getElementsSubset(): array {
+    return $this->enabledHeadingsToTags($this->configuration['enabled_headings']);
+  }
+
+  /**
+   * Returns an array of enabled tags based on the enabled headings.
+   *
+   * @param string[] $enabled_headings
+   *   Array of the enabled headings.
+   *
+   * @return string[]
+   *   List of tags provided by the enabled headings.
+   */
+  private function enabledHeadingsToTags(array $enabled_headings): array {
+    $plugin_definition = $this->getPluginDefinition();
+    $elements = $plugin_definition->getElements();
+    $heading_keyed_by_model = [];
+    foreach ($plugin_definition->getCKEditor5Config()['heading']['options'] as $configured_heading) {
+      if (isset($configured_heading['model'])) {
+        $heading_keyed_by_model[$configured_heading['model']] = $configured_heading;
+      }
+    }
+
+    $tags_to_return = [];
+    foreach ($enabled_headings as $model) {
+      if (isset($heading_keyed_by_model[$model]) && isset($heading_keyed_by_model[$model]['view'])) {
+        $element_as_tag = "<{$heading_keyed_by_model[$model]['view']}>";
+        if (in_array($element_as_tag, $elements, TRUE)) {
+          $tags_to_return[] = "<{$heading_keyed_by_model[$model]['view']}>";
+        }
+      }
+    }
+
+    return $tags_to_return;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/ImageUpload.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/ImageUpload.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa1d68267bf9453270b169abace39102252b290f
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/ImageUpload.php
@@ -0,0 +1,106 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Url;
+use Drupal\editor\EditorInterface;
+
+// cspell:ignore imageupload
+
+/**
+ * CKEditor 5 Image plugin.
+ *
+ * @CKEditor5Plugin(
+ *   id = "ckeditor5_imageUpload",
+ *   ckeditor5 = @CKEditor5AspectsOfCKEditor5Plugin(
+ *     plugins = {"image.ImageUpload", "drupalImage.DrupalImageUpload"},
+ *     config = {
+ *       "image" = {
+ *         "upload" = {
+ *           "types" = { "jpeg", "png", "gif" }
+ *         }
+ *       }
+ *     },
+ *   ),
+ *   drupal = @DrupalAspectsOfCKEditor5Plugin(
+ *     label = @Translation("Image Upload"),
+ *     elements = false,
+ *     admin_library = "ckeditor5/admin.imageupload",
+ *     toolbar_items = {
+ *       "uploadImage" = { "label" = "Image upload" }
+ *     },
+ *     conditions = {
+ *       "toolbarItem" = "uploadImage",
+ *       "imageUploadStatus" = true,
+ *     }
+ *   )
+ * )
+ *
+ * @internal
+ *   Plugin classes are internal.
+ */
+class ImageUpload extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface {
+
+  use CKEditor5PluginConfigurableTrait;
+  use DynamicPluginConfigWithCsrfTokenUrlTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    return $static_plugin_config + [
+      'drupalImageUpload' => [
+        'uploadUrl' => self::getUrlWithReplacedCsrfTokenPlaceholder(
+          Url::fromRoute('ckeditor5.upload_image')
+            ->setRouteParameter('editor', $editor->getFilterFormat()->id())
+        ),
+        'withCredentials' => TRUE,
+        'headers' => ['Accept' => 'application/json', 'text/javascript'],
+      ],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @see \Drupal\editor\Form\EditorImageDialog
+   * @see editor_image_upload_settings_form()
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $form_state->loadInclude('editor', 'admin.inc');
+    return editor_image_upload_settings_form($form_state->get('editor'));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $form_state->setValue('status', (bool) $form_state->getValue('status'));
+    $form_state->setValue(['max_dimensions', 'width'], (int) $form_state->getValue(['max_dimensions', 'width']));
+    $form_state->setValue(['max_dimensions', 'height'], (int) $form_state->getValue(['max_dimensions', 'height']));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    // Store this configuration in its out-of-band location.
+    $form_state->get('editor')->setImageUploadSettings($form_state->getValues());
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * This returns an empty array as image upload config is stored out of band.
+   */
+  public function defaultConfiguration() {
+    return [];
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Language.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Language.php
new file mode 100644
index 0000000000000000000000000000000000000000..ccbeb9884f91b9de70eadbea27a646d90e8b45f5
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Language.php
@@ -0,0 +1,102 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageManager;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\editor\EditorInterface;
+
+/**
+ * CKEditor 5 Language plugin.
+ *
+ * @internal
+ *   Plugin classes are internal.
+ */
+class Language extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface {
+
+  use CKEditor5PluginConfigurableTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    $predefined_languages = $this->configuration['language_list'] === 'all' ?
+      LanguageManager::getStandardLanguageList() :
+      LanguageManager::getUnitedNationsLanguageList();
+
+    // Generate the language_list setting as expected by the CKEditor Language
+    // plugin, but key the values by the full language name so that we can sort
+    // them later on.
+    $language_list = [];
+    foreach ($predefined_languages as $langcode => $language) {
+      $english_name = $language[0];
+      $direction = empty($language[2]) ? NULL : $language[2];
+      $language_list[$english_name] = [
+        'title' => $english_name,
+        'languageCode' => $langcode,
+      ];
+      if ($direction === LanguageInterface::DIRECTION_RTL) {
+        $language_list[$english_name]['textDirection'] = 'rtl';
+      }
+    }
+
+    // Sort on full language name.
+    ksort($language_list);
+    $dynamic_plugin_config = $static_plugin_config;
+    $dynamic_plugin_config['language']['textPartLanguage'] = array_values($language_list);
+    return $dynamic_plugin_config;
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @see \Drupal\editor\Form\EditorImageDialog
+   * @see editor_image_upload_settings_form()
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $predefined_languages = LanguageManager::getStandardLanguageList();
+    $form['language_list'] = [
+      '#title' => $this->t('Language list'),
+      '#title_display' => 'invisible',
+      '#type' => 'select',
+      '#options' => [
+        'un' => $this->t("United Nations' official languages"),
+        'all' => $this->t('All @count languages', ['@count' => count($predefined_languages)]),
+      ],
+      '#default_value' => $this->configuration['language_list'],
+      '#description' => $this->t('The list of languages to show in the language dropdown. The basic list will only show the <a href=":url">six official languages of the UN</a>. The extended list will show all @count languages that are available in Drupal.', [
+        ':url' => 'https://www.un.org/en/sections/about-un/official-languages',
+        '@count' => count($predefined_languages),
+      ]),
+    ];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $this->configuration['language_list'] = $form_state->getValue('language_list');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return ['language_list' => 'un'];
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Media.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Media.php
new file mode 100644
index 0000000000000000000000000000000000000000..40d65f06791600423a0656c79bf42655e8159272
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Media.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\Core\Url;
+use Drupal\editor\EditorInterface;
+
+/**
+ * CKEditor 5 Media plugin.
+ *
+ * Provides drupal-media element and options provided by the CKEditor 5 build.
+ *
+ * @internal
+ *   Plugin classes are internal.
+ */
+class Media extends CKEditor5PluginDefault {
+
+  use DynamicPluginConfigWithCsrfTokenUrlTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    $dynamic_plugin_config = $static_plugin_config;
+    $dynamic_plugin_config['drupalMedia']['previewURL'] = Url::fromRoute('media.filter.preview')
+      ->setRouteParameter('filter_format', $editor->getFilterFormat()->id())
+      ->toString(TRUE)
+      ->getGeneratedUrl();
+    $dynamic_plugin_config['drupalMedia']['isMediaUrl'] = self::getUrlWithReplacedCsrfTokenPlaceholder(
+      Url::fromRoute('ckeditor5.media_image')
+        ->setRouteParameter('editor', $editor->id())
+    );
+    $dynamic_plugin_config['drupalMedia']['previewCsrfToken'] = \Drupal::csrfToken()->get('X-Drupal-MediaPreview-CSRF-Token');
+    return $dynamic_plugin_config;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/MediaLibrary.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/MediaLibrary.php
new file mode 100644
index 0000000000000000000000000000000000000000..47cf82319978a409cd7810e4c825e8d1c074e6f2
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/MediaLibrary.php
@@ -0,0 +1,102 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Url;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\editor\EditorInterface;
+use Drupal\media_library\MediaLibraryState;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * CKEditor 5 Media Library plugin.
+ *
+ * Provides media library support and options for the CKEditor 5 build.
+ *
+ * @internal
+ *   Plugin classes are internal.
+ */
+class MediaLibrary extends CKEditor5PluginDefault implements ContainerFactoryPluginInterface {
+
+  /**
+   * The media type entity storage.
+   *
+   * @var \Drupal\Core\Config\Entity\ConfigEntityStorageInterface
+   */
+  protected $mediaTypeStorage;
+
+  /**
+   * MediaLibrary constructor.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   */
+  public function __construct(array $configuration, string $plugin_id, CKEditor5PluginDefinition $plugin_definition, EntityTypeManagerInterface $entity_type_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->mediaTypeStorage = $entity_type_manager->getStorage('media_type');
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity_type.manager'),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    $media_type_ids = $this->mediaTypeStorage->getQuery()->execute();
+
+    if ($editor->hasAssociatedFilterFormat()) {
+      $media_embed_filter = $editor->getFilterFormat()->filters()->get('media_embed');
+      // Optionally limit the allowed media types based on the MediaEmbed
+      // setting. If the setting is empty, do not limit the options.
+      if (!empty($media_embed_filter->settings['allowed_media_types'])) {
+        $media_type_ids = array_intersect_key($media_type_ids, $media_embed_filter->settings['allowed_media_types']);
+      }
+    }
+    if (in_array('image', $media_type_ids, TRUE)) {
+      // Move image to first position.
+      // This workaround can be removed once this issue is fixed:
+      // @see https://www.drupal.org/project/drupal/issues/3073799
+      array_unshift($media_type_ids, 'image');
+      $media_type_ids = array_unique($media_type_ids);
+    }
+
+    $state = MediaLibraryState::create(
+      'media_library.opener.editor',
+      $media_type_ids,
+      reset($media_type_ids),
+      1,
+      ['filter_format_id' => $editor->getFilterFormat()->id()],
+    );
+
+    $library_url = Url::fromRoute('media_library.ui')
+      ->setOption('query', $state->all())
+      ->toString(TRUE)
+      ->getGeneratedUrl();
+
+    $dynamic_plugin_config = $static_plugin_config;
+    $dynamic_plugin_config['drupalMedia']['libraryURL'] = $library_url;
+    return $dynamic_plugin_config;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/SourceEditing.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/SourceEditing.php
new file mode 100644
index 0000000000000000000000000000000000000000..11717006e904a5337202e57ecaf8c8226606f1bc
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/SourceEditing.php
@@ -0,0 +1,87 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginElementsSubsetInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\editor\EditorInterface;
+
+/**
+ * CKEditor 5 Source Editing plugin configuration.
+ *
+ * @internal
+ *   Plugin classes are internal.
+ */
+class SourceEditing extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface, CKEditor5PluginElementsSubsetInterface {
+
+  use CKEditor5PluginConfigurableTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $form['allowed_tags'] = [
+      '#type' => 'textarea',
+      '#title' => $this->t('Manually editable HTML tags'),
+      '#default_value' => implode(' ', $this->configuration['allowed_tags']),
+      '#description' => $this->t('A list of HTML tags that can be used while editing source. It is only necessary to add tags that are not already supported by other enabled plugins. For example, if "Bold" is enabled, it is not necessary to add the <code>&lt;strong&gt;</code> tag, but it may be necessary to add <code>&lt;dl&gt;&lt;dt&gt;&lt;dd&gt;</code> in a format that does not have a definition list plugin, but requires definition list markup.'),
+    ];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+    // Match the config schema structure at ckeditor5.plugin.ckeditor5_heading.
+    $form_value = $form_state->getValue('allowed_tags');
+    if (!is_array($form_value)) {
+      $config_value = HTMLRestrictionsUtilities::allowedElementsStringToPluginElementsArray($form_value);
+      $form_state->setValue('allowed_tags', $config_value);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $this->configuration['allowed_tags'] = $form_state->getValue('allowed_tags');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'allowed_tags' => [],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getElementsSubset(): array {
+    return $this->configuration['allowed_tags'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    $allowed = HTMLRestrictionsUtilities::allowedElementsStringToHtmlSupportConfig(implode('', $this->configuration['allowed_tags']));
+
+    return [
+      'htmlSupport' => [
+        'allow' => $allowed,
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginConfigurableInterface.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginConfigurableInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..a78fe949a23666a4d0c69b035ce13c792dfdea1b
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginConfigurableInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\Component\Plugin\ConfigurableInterface;
+use Drupal\Core\Plugin\PluginFormInterface;
+
+/**
+ * Defines an interface for configurable CKEditor 5 plugins.
+ *
+ * This allows a CKEditor 5 plugin to define a settings form. These settings can
+ * then be automatically passed on to the corresponding CKEditor 5 instance via
+ * CKEditor5PluginInterface::getDynamicPluginConfig().
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait
+ * @see \Drupal\ckeditor5\CKEditor5PluginInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginBase
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see plugin_api
+ */
+interface CKEditor5PluginConfigurableInterface extends CKEditor5PluginInterface, ConfigurableInterface, PluginFormInterface {
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginConfigurableTrait.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginConfigurableTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..1a790970eb0958bd83144f5ecadcdfaf69e2e8be
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginConfigurableTrait.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Drupal\ckeditor5\Plugin;
+
+/**
+ * Provides a trait for configurable CKEditor 5 plugins.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface
+ */
+trait CKEditor5PluginConfigurableTrait {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getConfiguration() {
+    return $this->configuration;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setConfiguration(array $configuration) {
+    $this->configuration = $configuration + $this->defaultConfiguration();
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginDefault.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginDefault.php
new file mode 100644
index 0000000000000000000000000000000000000000..e4b0da8e6fe7755c58fdea87d38f08cedfde5a25
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginDefault.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\Core\Plugin\PluginBase;
+use Drupal\editor\EditorInterface;
+
+/**
+ * Defines the default CKEditor 5 plugin implementation.
+ *
+ * When a CKEditor 5 plugin is not configurable nor has dynamic plugin
+ * configuration, no custom code needs to be written: this default
+ * implementation will be used under the hood.
+ *
+ * @see @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$class
+ */
+class CKEditor5PluginDefault extends PluginBase implements CKEditor5PluginInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+
+    // Ensure the configuration is set as expected for configurable plugins.
+    if ($this instanceof CKEditor5PluginConfigurableInterface) {
+      $this->setConfiguration($configuration);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    return $static_plugin_config;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginDefinition.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginDefinition.php
new file mode 100644
index 0000000000000000000000000000000000000000..252f884fe933d19dbe952a9b6d61a6a3f1e2db18
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginDefinition.php
@@ -0,0 +1,426 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\Component\Assertion\Inspector;
+use Drupal\Component\Plugin\Definition\PluginDefinition;
+use Drupal\Component\Plugin\Definition\PluginDefinitionInterface;
+use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
+use Drupal\Core\Config\Schema\SchemaCheckTrait;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+
+/**
+ * Provides an implementation of a CKEditor 5 plugin definition.
+ */
+final class CKEditor5PluginDefinition extends PluginDefinition implements PluginDefinitionInterface {
+
+  use SchemaCheckTrait;
+
+  /**
+   * The CKEditor 5 aspects of the plugin definition.
+   *
+   * @var array
+   */
+  private $ckeditor5;
+
+  /**
+   * The Drupal aspects of the plugin definition.
+   *
+   * @var array
+   */
+  private $drupal;
+
+  /**
+   * CKEditor5PluginDefinition constructor.
+   *
+   * @param array $definition
+   *   An array of values from the annotation/YAML.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   */
+  public function __construct(array $definition) {
+    $this->id = $id = $definition['id'];
+
+    $expected_prefix = sprintf("%s_", $definition['provider']);
+    if (strpos($id, $expected_prefix) !== 0) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must have a plugin ID that starts with "%s".', $id, $expected_prefix));
+    }
+    $this->provider = $definition['provider'];
+
+    static::validateCKEditor5Aspects($id, $definition);
+    $this->ckeditor5 = $definition['ckeditor5'];
+
+    $this->validateDrupalAspects($id, $definition);
+    $this->drupal = $definition['drupal'];
+  }
+
+  /**
+   * Gets an array representation of this CKEditor 5 plugin definition.
+   *
+   * @return array
+   */
+  public function toArray(): array {
+    return [
+      'id' => $this->id(),
+      'provider' => $this->provider,
+      'ckeditor5' => $this->ckeditor5,
+      'drupal' => $this->drupal,
+    ];
+  }
+
+  /**
+   * Validates the CKEditor 5 aspects of the CKEditor 5 plugin definition.
+   *
+   * @param string $id
+   *   The plugin ID, for use in exception messages.
+   * @param array $definition
+   *   The plugin definition to validate.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   */
+  private static function validateCKEditor5Aspects(string $id, array $definition): void {
+    if (!isset($definition['ckeditor5'])) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "ckeditor5" key.', $id));
+    }
+
+    if (!isset($definition['ckeditor5']['plugins'])) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "ckeditor5.plugins" key.', $id));
+    }
+  }
+
+  /**
+   * Validates the Drupal aspects of the CKEditor 5 plugin definition.
+   *
+   * @param string $id
+   *   The plugin ID, for use in exception messages.
+   * @param array $definition
+   *   The plugin definition to validate.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   */
+  private function validateDrupalAspects(string $id, array $definition): void {
+    if (!isset($definition['drupal'])) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "drupal" key.', $id));
+    }
+
+    // Without a label, the CKEditor 5 UI, validation constraints et cetera
+    // cannot be as informative in guiding the end user.
+    if (!isset($definition['drupal']['label'])) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "drupal.label" key.', $id));
+    }
+    elseif (!is_string($definition['drupal']['label']) && !$definition['drupal']['label'] instanceof TranslatableMarkup) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition has a "drupal.label" value that is not a string nor a TranslatableMarkup instance.', $id));
+    }
+
+    // Without accurate and complete metadata about what HTML elements a
+    // CKEditor 5 plugin supports, Drupal cannot ensure a complete and accurate
+    // upgrade path.
+    if (!isset($definition['drupal']['elements'])) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "drupal.elements" key.', $id));
+    }
+    elseif ($definition['drupal']['elements'] !== FALSE && !(is_array($definition['drupal']['elements']) && !empty($definition['drupal']['elements']) && Inspector::assertAllStrings($definition['drupal']['elements']))) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition has a "drupal.elements" value that is neither a list of HTML tags/attributes nor false.', $id));
+    }
+    elseif (is_array($definition['drupal']['elements'])) {
+      foreach ($definition['drupal']['elements'] as $index => $element) {
+        // ckeditor5_sourceEditing is the edge case here: it is the only plugin
+        // that is allowed to return a superset. It's a special case because it
+        // is through configuring this particular plugin that additional HTML
+        // tags can be allowed.
+        // Even though its plugin definition says '<*>' is supported, this is a
+        // little lie to convey that this plugin is capable of supporting any
+        // HTML tag … but which ones are actually supported depends on the
+        // configuration.
+        // This also means that without any configuration, it does not support
+        // any HTML tags.
+        // @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManager::getProvidedElements()
+        if ($definition['id'] === 'ckeditor5_sourceEditing') {
+          continue;
+        }
+        $parsed_elements = HTMLRestrictionsUtilities::allowedElementsStringToPluginElementsArray($element);
+        if (count($parsed_elements) === 0) {
+          throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition has a value at "drupal.elements.%d" that is not an HTML tag with optional attributes: "%s". Expected structure: "<tag allowedAttribute="allowedValue1 allowedValue2">".', $id, $index, $element));
+        }
+        elseif (count($parsed_elements) > 1) {
+          throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition has a value at "drupal.elements.%d": multiple tags listed, should be one: "%s".', $id, $index, $element));
+        }
+      }
+    }
+
+    if (isset($definition['drupal']['class']) && !class_exists($definition['drupal']['class'])) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The CKEditor 5 "%s" provides a plugin class: "%s", but it does not exist.', $id, $definition['drupal']['class']));
+    }
+    elseif (isset($definition['drupal']['class']) && !in_array(CKEditor5PluginInterface::class, class_implements($definition['drupal']['class']))) {
+      throw new InvalidPluginDefinitionException($id, sprintf('CKEditor 5 plugins must implement \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface. "%s" does not.', $id));
+    }
+    elseif (in_array(CKEditor5PluginConfigurableInterface::class, class_implements($definition['drupal']['class'], TRUE))) {
+      $default_configuration = (new \ReflectionClass($definition['drupal']['class']))
+        ->newInstanceWithoutConstructor()
+        ->defaultConfiguration();
+      $typed_config = \Drupal::service('config.typed');
+      if (!empty($default_configuration)) {
+        $configuration_name = sprintf("ckeditor5.plugin.%s", $definition['id']);
+        if (!$typed_config->hasConfigSchema($configuration_name)) {
+          throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition is configurable, has non-empty default configuration but has no config schema. Config schema is required for validation.', $id));
+        }
+        // TRICKY: SchemaCheckTrait::checkConfigSchema() dynamically adds a
+        // 'langcode' key-value pair that is irrelevant here. Also,
+        // ::checkValue() may (counter to its docs) trigger an exception.
+        $this->configName = 'STRIP';
+        $this->schema = $typed_config->createFromNameAndData($configuration_name, $default_configuration);
+        $schema_errors = [];
+        foreach ($default_configuration as $key => $value) {
+          try {
+            $schema_error = $this->checkValue($key, $value);
+          }
+          catch (\InvalidArgumentException $e) {
+            $schema_error = [$key => $e->getMessage()];
+          }
+          $schema_errors = array_merge($schema_errors, $schema_error);
+        }
+        $formatted_schema_errors = [];
+        foreach ($schema_errors as $key => $value) {
+          $formatted_schema_errors[] = sprintf("[%s] %s", str_replace('STRIP:', '', $key), trim($value, '.'));
+        }
+        if (!empty($schema_errors)) {
+          throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition is configurable, but its default configuration does not match its config schema. The following errors were found: %s.', $id, implode(', ', $formatted_schema_errors)));
+        }
+      }
+    }
+
+    if ($definition['drupal']['admin_library'] !== FALSE) {
+      [$extension, $library] = explode('/', $definition['drupal']['admin_library'], 2);
+      if (\Drupal::service('library.discovery')->getLibraryByName($extension, $library) === FALSE) {
+        throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition has a "drupal.admin_library" key whose asset library "%s" does not exist.', $id, $definition['drupal']['admin_library']));
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$class
+   */
+  public function getClass() {
+    return $this->drupal['class'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setClass($class) {
+    $this->drupal['class'] = $class;
+    return $this;
+  }
+
+  /**
+   * Whether this plugin is configurable by the user.
+   *
+   * @return bool
+   *   TRUE if it is configurable, FALSE otherwise.
+   *
+   * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface
+   */
+  public function isConfigurable(): bool {
+    return is_subclass_of($this->getClass(), CKEditor5PluginConfigurableInterface::class);
+  }
+
+  /**
+   * Gets the human-readable name of the CKEditor plugin.
+   *
+   * @return \Drupal\Core\StringTranslation\TranslatableMarkup
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$label
+   */
+  public function label(): TranslatableMarkup {
+    $label = $this->drupal['label'];
+    if (!$label instanceof TranslatableMarkup) {
+      $label = new TranslatableMarkup($label);
+    }
+    return $label;
+  }
+
+  /**
+   * Gets the list of conditions to enable this plugin.
+   *
+   * @return array
+   *   An array of conditions.
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$conditions
+   *
+   * @throws \LogicException
+   *   When called on a plugin definition that has no conditions.
+   */
+  public function getConditions(): array {
+    if (!$this->hasConditions()) {
+      throw new \LogicException('::getConditions() should only be called if ::hasConditions() returns TRUE.');
+    }
+    return $this->drupal['conditions'];
+  }
+
+  /**
+   * Whether this plugin has conditions.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$conditions
+   */
+  public function hasConditions(): bool {
+    return $this->drupal['conditions'] !== FALSE;
+  }
+
+  /**
+   * Gets the list of toolbar items this plugin provides.
+   *
+   * @return array[]
+   *   An array of toolbar items.
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$toolbar_items
+   */
+  public function getToolbarItems(): array {
+    return $this->drupal['toolbar_items'];
+  }
+
+  /**
+   * Whether this plugin has toolbar items.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$toolbar_items
+   */
+  public function hasToolbarItems(): bool {
+    return $this->getToolbarItems() !== [];
+  }
+
+  /**
+   * Gets the asset library this plugin needs to be loaded.
+   *
+   * @return string
+   *   An asset library ID.
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$library
+   *
+   * @throws \LogicException
+   *   When called on a plugin definition that has no library.
+   */
+  public function getLibrary(): string {
+    if (!$this->hasLibrary()) {
+      throw new \LogicException('::getLibrary() should only be called if ::hasLibrary() returns TRUE.');
+    }
+    return $this->drupal['library'];
+  }
+
+  /**
+   * Whether this plugin has an asset library to load.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$library
+   */
+  public function hasLibrary(): bool {
+    return $this->drupal['library'] !== FALSE;
+  }
+
+  /**
+   * Gets the asset library this plugin needs to be loaded on the admin UI.
+   *
+   * @return string
+   *   An asset library ID.
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$admin_library
+   *
+   * @throws \LogicException
+   *   When called on a plugin definition that has no admin library.
+   */
+  public function getAdminLibrary(): string {
+    if (!$this->hasAdminLibrary()) {
+      throw new \LogicException('::getAdminLibrary() should only be called if ::hasAdminLibrary() returns TRUE.');
+    }
+    return $this->drupal['admin_library'];
+  }
+
+  /**
+   * Whether this plugin has an asset library to load on the admin UI.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$admin_library
+   */
+  public function hasAdminLibrary(): bool {
+    return $this->drupal['admin_library'] !== FALSE;
+  }
+
+  /**
+   * Gets the list of elements and attributes this plugin allows to create/edit.
+   *
+   * @return string[]|false
+   *   FALSE if this plugin does not create/edit any elements or attributes.
+   *   Otherwise a list.
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$elements
+   */
+  public function getElements() {
+    return $this->drupal['elements'];
+  }
+
+  /**
+   * Whether this plugin allows creating/editing elements and attributes.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$elements
+   */
+  public function hasElements(): bool {
+    return $this->getElements() !== FALSE;
+  }
+
+  /**
+   * Gets the list of CKEditor 5 plugin classes this plugin needs to load.
+   *
+   * @return string[]
+   *   CKEditor 5 plugin classes.
+   *
+   * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin::$plugins
+   */
+  public function getCKEditor5Plugins(): array {
+    return $this->ckeditor5['plugins'];
+  }
+
+  /**
+   * Whether this plugin loads CKEditor 5 plugin classes.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin::$plugins
+   */
+  public function hasCKEditor5Plugins(): bool {
+    return $this->getCKEditor5Plugins() !== [];
+  }
+
+  /**
+   * Gets keyed array of additional values for the CKEditor5 constructor config.
+   *
+   * @return array
+   *   The CKEditor 5 constructor config.
+   *
+   * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin::$config
+   */
+  public function getCKEditor5Config(): array {
+    return $this->ckeditor5['config'];
+  }
+
+  /**
+   * Whether this plugin has additional values for the CKEditor5 constructor.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin::$config
+   */
+  public function hasCKEditor5Config(): bool {
+    return $this->getCKEditor5Config() !== [];
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginElementsSubsetInterface.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginElementsSubsetInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..8ecfd466f8d5bdb78ca14ce7c7cee514fe39530b
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginElementsSubsetInterface.php
@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+/**
+ * Defines an interface for plugins that can support an elements subset.
+ *
+ * Plugins can support multiple elements in the `elements` property of their
+ * definition. A text format may want to use a given plugin without supporting
+ * every supported element. Plugins that implement this interface return a
+ * subset based on the configuration in the Text Editor's settings.
+ */
+interface CKEditor5PluginElementsSubsetInterface extends CKEditor5PluginConfigurableInterface {
+
+  /**
+   * Returns a configured subset of the elements supported by this plugin.
+   *
+   * @return string[]
+   *   An array of supported elements.
+   */
+  public function getElementsSubset(): array;
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginInterface.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..64b2b1dddca92013ec565b2237489eb39222362f
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginInterface.php
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\Component\Plugin\PluginInspectionInterface;
+use Drupal\editor\EditorInterface;
+
+/**
+ * Defines an interface for CKEditor5 plugins.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginBase
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see plugin_api
+ */
+interface CKEditor5PluginInterface extends PluginInspectionInterface {
+
+  /**
+   * Allows a plugin to modify its static configuration.
+   *
+   * @param array $static_plugin_config
+   *   The ckeditor5.config entry from the YAML or annotation, if any. If none
+   *   is specified in the YAML or annotation, then the empty array.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   *
+   * @return array
+   *   Returns the received $static_plugin_config plus dynamic additions or
+   *   alterations.
+   *
+   * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin::$config
+   * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition::getCKEditor5Config()
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array;
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginManager.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..71ca1e66d050a4b0df4431e191c83e2f2d41c37d
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginManager.php
@@ -0,0 +1,420 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\ckeditor5\Annotation\CKEditor5Plugin;
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\Component\Annotation\Plugin\Discovery\AnnotationBridgeDecorator;
+use Drupal\Component\Assertion\Inspector;
+use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Plugin\DefaultPluginManager;
+use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
+use Drupal\Core\Plugin\Discovery\YamlDiscoveryDecorator;
+use Drupal\editor\EditorInterface;
+use Drupal\filter\FilterPluginCollection;
+
+/**
+ * Provides a CKEditor5 plugin manager.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginBase
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see plugin_api
+ *
+ * @internal
+ *   CKEditor 5 is currently experimental and should only be leveraged by
+ *   experimental modules and development releases of contributed modules.
+ *   See https://www.drupal.org/core/experimental for more information.
+ */
+class CKEditor5PluginManager extends DefaultPluginManager implements CKEditor5PluginManagerInterface {
+
+  /**
+   * Constructs a CKEditor5PluginManager object.
+   *
+   * @param \Traversable $namespaces
+   *   An object that implements \Traversable which contains the root paths
+   *   keyed by the corresponding namespace to look for plugin implementations.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
+   *   Cache backend instance to use.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler to invoke the alter hook with.
+   */
+  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
+    parent::__construct('Plugin/CKEditor5Plugin', $namespaces, $module_handler, CKEditor5PluginInterface::class, CKEditor5Plugin::class);
+
+    $this->alterInfo('ckeditor5_plugin_info');
+    $this->setCacheBackend($cache_backend, 'ckeditor5_plugins');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getDiscovery() {
+    if (!$this->discovery) {
+      $discovery = new AnnotatedClassDiscovery($this->subdir, $this->namespaces, $this->pluginDefinitionAnnotationName, $this->additionalAnnotationNamespaces);
+      $discovery = new YamlDiscoveryDecorator($discovery, 'ckeditor5', $this->moduleHandler->getModuleDirectories());
+      // Note: adding translatable properties here is impossible because it only
+      // supports top-level properties.
+      // @see \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition::label()
+      $discovery = new AnnotationBridgeDecorator($discovery, $this->pluginDefinitionAnnotationName);
+      $this->discovery = $discovery;
+    }
+    return $this->discovery;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPlugin(string $plugin_id, ?EditorInterface $editor): CKEditor5PluginInterface {
+    $configuration = $editor
+      ? self::getPluginConfiguration($editor, $plugin_id)
+      : [];
+    return $this->createInstance($plugin_id, $configuration);
+  }
+
+  /**
+   * Gets the plugin configuration (if any) from a text editor config entity.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A text editor config entity that is using CKEditor 5.
+   * @param string $plugin_id
+   *   A CKEditor 5 plugin ID.
+   *
+   * @return array
+   *   The CKEditor 5 plugin configuration, if any.
+   *
+   * @throws \InvalidArgumentException
+   *   Thrown when the method is called with any other text editor than CKEditor 5.
+   */
+  protected static function getPluginConfiguration(EditorInterface $editor, string $plugin_id): array {
+    if ($editor->getEditor() !== 'ckeditor5') {
+      throw new \InvalidArgumentException('This method should only be called on text editor config entities using CKEditor 5.');
+    }
+    return $editor->getSettings()['plugins'][$plugin_id] ?? [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getToolbarItems(): array {
+    return $this->mergeDefinitionValues('getToolbarItems', $this->getDefinitions());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAdminLibraries(): array {
+    $list = $this->mergeDefinitionValues('getAdminLibrary', $this->getDefinitions());
+    // Include main admin library.
+    array_unshift($list, 'ckeditor5/admin');
+    return $list;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getEnabledLibraries(EditorInterface $editor): array {
+    $list = $this->mergeDefinitionValues('getLibrary', $this->getEnabledDefinitions($editor));
+    $list = array_unique($list);
+    // Include main library.
+    array_unshift($list, 'ckeditor5/drupal.ckeditor5');
+    sort($list);
+    return $list;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getEnabledDefinitions(EditorInterface $editor): array {
+    $definitions = $this->getDefinitions();
+    ksort($definitions);
+
+    $definitions_with_plugins_condition = [];
+
+    foreach ($definitions as $plugin_id => $definition) {
+      // Remove definition when plugin has conditions and they are not met.
+      if ($definition->hasConditions()) {
+        $plugin = $this->getPlugin($plugin_id, $editor);
+        if ($this->isPluginDisabled($plugin, $editor)) {
+          unset($definitions[$plugin_id]);
+        }
+        else {
+          // The `plugins` condition can only be evaluated at the end of
+          // gathering enabled definitions. ::isPluginDisabled() did not yet
+          // evaluate that condition.
+          if (array_key_exists('plugins', $definition->getConditions())) {
+            $definitions_with_plugins_condition[$plugin_id] = $definition;
+          }
+        }
+      }
+      // Otherwise, only remove the definition if the plugin has buttons and
+      // none of its buttons are active.
+      elseif ($definition->hasToolbarItems()) {
+        if (empty(array_intersect($editor->getSettings()['toolbar']['items'], array_keys($definition->getToolbarItems())))) {
+          unset($definitions[$plugin_id]);
+        }
+      }
+    }
+
+    // Only enable the General HTML Support plugin on text formats with no HTML
+    // restrictions.
+    // @see https://ckeditor.com/docs/ckeditor5/latest/api/html-support.html
+    // @see https://github.com/ckeditor/ckeditor5/issues/9856
+    if ($editor->getFilterFormat()->getHtmlRestrictions() !== FALSE) {
+      unset($definitions['ckeditor5_htmlSupport']);
+    }
+
+    // Evaluate `plugins` condition.
+    foreach ($definitions_with_plugins_condition as $plugin_id => $definition) {
+      if (!empty(array_diff($definition->getConditions()['plugins'], array_keys($definitions)))) {
+        unset($definitions[$plugin_id]);
+      }
+    }
+
+    return $definitions;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function findPluginSupportingElement(string $tag): ?string {
+    // This will contain the element config for a plugin found to support $tag,
+    // so it can be compared to additional plugins that support $tag so the
+    // plugin with the most permissive config can be the id returned.
+    $selected_provided_elements = [];
+    $plugin_id = NULL;
+
+    foreach ($this->getDefinitions() as $id => $definition) {
+      $provided_elements = $this->getProvidedElements([$id]);
+
+      // Multiple plugins may support the $tag being searched for.
+      if (array_key_exists($tag, $provided_elements)) {
+        // Skip plugins with conditions as those plugins can't be guaranteed to
+        // provide a given tag without additional criteria being met. In the
+        // future we could possibly add support for automatically enabling
+        // filters or other similar requirements a plugin might need in order to
+        // be enabled and provide the tag it supports. For now, we assume such
+        // configuration cannot be modified programmatically.
+        if ($definition->hasConditions()) {
+          continue;
+        }
+
+        // True if a plugin has already been selected. If another plugin
+        // supports $tag, it will be compared against this one. Whichever
+        // provides broader support for $tag will be the plugin id returned by
+        // this method.
+        $selected_plugin = isset($selected_provided_elements[$tag]);
+        $selected_config = $selected_provided_elements[$tag] ?? FALSE;
+
+        // True if a plugin supporting $tag has been selected but does not allow
+        // any attributes while the plugin currently being checked does support
+        // attributes.
+        $adds_attribute_config = is_array($provided_elements[$tag]) && $selected_plugin && !is_array($selected_config);
+        $broader_attribute_config = FALSE;
+
+        // If the selected plugin and the plugin being checked both have arrays
+        // for $tag configuration, they both have attribute configuration. Check
+        // which attribute configuration is more permissive.
+        if ($selected_plugin && is_array($selected_config) && is_array($provided_elements[$tag])) {
+          $selected_plugin_full_attributes = array_filter($selected_config, function ($attribute_config) {
+            return !is_array($attribute_config);
+          });
+          $being_checked_plugin_full_attributes = array_filter($provided_elements[$tag], function ($attribute_config) {
+            return !is_array($attribute_config);
+          });
+          if (count($being_checked_plugin_full_attributes) > count($selected_plugin_full_attributes)) {
+            $broader_attribute_config = TRUE;
+          }
+        }
+
+        if (empty($selected_provided_elements) || $broader_attribute_config || $adds_attribute_config) {
+          $selected_provided_elements = $provided_elements;
+          $plugin_id = $id;
+        }
+      }
+    }
+
+    return $plugin_id;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCKEditor5PluginConfig(EditorInterface $editor): array {
+    $definitions = $this->getEnabledDefinitions($editor);
+
+    // Allow plugin to modify config, such as loading dynamic values.
+    $config = [];
+    foreach ($definitions as $plugin_id => $definition) {
+      $plugin = $this->getPlugin($plugin_id, $editor);
+      $config[$plugin_id] = $plugin->getDynamicPluginConfig($definition->getCKEditor5Config(), $editor);
+    }
+
+    return [
+      'plugins' => $this->mergeDefinitionValues('getCKEditor5Plugins', $definitions),
+      'config' => NestedArray::mergeDeepArray($config),
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getProvidedElements(array $plugin_ids = [], EditorInterface $editor = NULL, bool $retain_wildcard = FALSE): array {
+    $plugins = $this->getDefinitions();
+    if (!empty($plugin_ids)) {
+      $plugins = array_intersect_key($plugins, array_flip($plugin_ids));
+    }
+    $elements = [];
+    $processed_elements = [];
+
+    foreach ($plugins as $id => $definition) {
+      // Some CKEditor 5 plugins only provide functionality, not additional
+      // elements.
+      if (!$definition->hasElements()) {
+        continue;
+      }
+
+      $defined_elements = $definition->getElements();
+      if (is_a($definition->getClass(), CKEditor5PluginElementsSubsetInterface::class, TRUE)) {
+        // ckeditor5_sourceEditing is the edge case here: it is the only plugin
+        // that is allowed to return a superset. It's a special case because it
+        // is through configuring this particular plugin that additional HTML
+        // tags can be allowed.
+        // Even though its plugin definition says '<*>' is supported, this is a
+        // little lie to convey that this plugin is capable of supporting any
+        // HTML tag … but which ones are actually supported depends on the
+        // configuration.
+        // This also means that without any configuration, it does not support
+        // any HTML tags.
+        if ($id === 'ckeditor5_sourceEditing') {
+          $defined_elements = !isset($editor) ? [] : $this->getPlugin($id, $editor)->getElementsSubset();
+        }
+        // The default case: all other plugins that implement this interface are
+        // explicitly checked for compliance: only subsets are allowed. This is
+        // essential for \Drupal\ckeditor5\SmartDefaultSettings to be able to
+        // work: otherwise it would not be able to know which plugins to enable.
+        elseif (isset($editor)) {
+          $subset = $this->getPlugin($id, $editor)->getElementsSubset();
+          $subset_violations = array_diff($subset, $defined_elements);
+          if (!empty($subset_violations)) {
+            throw new \LogicException(sprintf('The "%s" CKEditor 5 plugin implements ::getElementsSubset() and did not return a subset, the following tags are absent from the plugin definition: "%s".', $id, implode(' ', $subset_violations)));
+          }
+          $defined_elements = $subset;
+        }
+      }
+      assert(Inspector::assertAllStrings($defined_elements));
+      foreach ($defined_elements as $element) {
+        if (in_array($element, $processed_elements)) {
+          continue;
+        }
+        $processed_elements[] = $element;
+        $additional_elements = HTMLRestrictionsUtilities::allowedElementsStringToHtmlFilterArray($element);
+        $elements = array_merge_recursive($elements, $additional_elements);
+      }
+    }
+
+    foreach ($elements as $tag_name => $tag_config) {
+      if (substr($tag_name, 0, 1) === '$') {
+        $wildcard_tags = HTMLRestrictionsUtilities::getWildcardTags($tag_name);
+        foreach ($wildcard_tags as $wildcard_tag) {
+          if (isset($elements[$wildcard_tag])) {
+            foreach ($tag_config as $attribute_name => $attribute_value) {
+              if (is_array($attribute_value)) {
+                $attribute_value = array_keys($attribute_value);
+              }
+              $element_already_allows_all_values = isset($elements[$wildcard_tag][$attribute_name]) && $elements[$wildcard_tag][$attribute_name] === TRUE;
+              if (!$element_already_allows_all_values) {
+                HTMLRestrictionsUtilities::providedElementsAttributes($elements, $wildcard_tag, $attribute_name, $attribute_value);
+              }
+            }
+          }
+        }
+        if (!$retain_wildcard) {
+          unset($elements[$tag_name]);
+        }
+      }
+    }
+
+    return HTMLRestrictionsUtilities::cleanAllowedHtmlArray($elements);
+  }
+
+  /**
+   * Returns array of merged values for the given plugin definitions.
+   *
+   * @param string $get_method
+   *   Which CKEditor5PluginDefinition getter to call to get values to merge.
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition[] $definitions
+   *   The plugin definitions whose values to merge.
+   *
+   * @return array
+   *   List of merged values for the given plugin definition method.
+   */
+  protected function mergeDefinitionValues(string $get_method, array $definitions): array {
+    assert(method_exists(CKEditor5PluginDefinition::class, $get_method));
+    $has_method = 'has' . substr($get_method, 3);
+    assert(method_exists(CKEditor5PluginDefinition::class, $has_method));
+    $per_plugin = array_filter(array_map(function (CKEditor5PluginDefinition $definition) use ($get_method, $has_method) {
+      if ($definition->$has_method()) {
+        return $definition->$get_method();
+      }
+    }, $definitions));
+    return array_reduce($per_plugin, function (array $result, $current): array {
+      return is_array($current) && is_array(reset($current))
+        // Merge nested arrays using their keys.
+        ? $result + $current
+        // Merge everything else by appending.
+        : array_merge($result, (array) $current);
+    }, []);
+  }
+
+  /**
+   * Checks whether a plugin must be disabled due to unmet conditions.
+   *
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface $plugin
+   *   A CKEditor 5 plugin instance.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   *
+   * @return bool
+   *   Whether the plugin is disabled due to unmet conditions.
+   */
+  protected function isPluginDisabled(CKEditor5PluginInterface $plugin, EditorInterface $editor): bool {
+    assert($plugin->getPluginDefinition()->hasConditions());
+    foreach ($plugin->getPluginDefinition()->getConditions() as $condition_type => $required_value) {
+      switch ($condition_type) {
+        case 'toolbarItem':
+          if (!in_array($required_value, $editor->getSettings()['toolbar']['items'])) {
+            return TRUE;
+          }
+          break;
+
+        case 'imageUploadStatus':
+          $image_upload_status = $editor->getImageUploadSettings()['status'] ?? FALSE;
+          if (!$image_upload_status) {
+            return TRUE;
+          }
+          break;
+
+        case 'filter':
+          $filters = $editor->getFilterFormat()->filters();
+          assert($filters instanceof FilterPluginCollection);
+          if (!$filters->has($required_value) || !$filters->get($required_value)->status) {
+            return TRUE;
+          }
+          break;
+
+        case 'plugins':
+          // Tricky: this cannot yet be evaluated here. It will evaluated later.
+          // @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManager::getEnabledDefinitions()
+          return FALSE;
+      }
+    }
+
+    return FALSE;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginManagerInterface.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginManagerInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..800afb2169e3e87a8d66afe205042a6e17a698e4
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginManagerInterface.php
@@ -0,0 +1,122 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Drupal\editor\EditorInterface;
+
+/**
+ * Provides the interface for a plugin manager of CKEditor 5 plugins.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see plugin_api
+ */
+interface CKEditor5PluginManagerInterface extends DiscoveryInterface {
+
+  /**
+   * Returns a CKEditor 5 plugin with configuration from the editor.
+   *
+   * @param string $plugin_id
+   *   The plugin ID.
+   * @param \Drupal\editor\EditorInterface|null $editor
+   *   The editor to load configuration from.
+   *
+   * @return \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface
+   *   The CKEditor 5 plugin instance.
+   */
+  public function getPlugin(string $plugin_id, ?EditorInterface $editor): CKEditor5PluginInterface;
+
+  /**
+   * Gets a list of all toolbar items.
+   *
+   * @return string[]
+   *   List of all toolbar items provided by plugins.
+   */
+  public function getToolbarItems(): array;
+
+  /**
+   * Gets a list of all admin library names.
+   *
+   * @return string[]
+   *   List of all admin libraries provided by plugins.
+   */
+  public function getAdminLibraries(): array;
+
+  /**
+   * Gets a list of libraries required for the editor.
+   *
+   * This list is filtered by enabled plugins because it is needed at runtime.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   *
+   * @return string[]
+   *   The list of enabled libraries.
+   */
+  public function getEnabledLibraries(EditorInterface $editor): array;
+
+  /**
+   * Filter list of definitions by enabled plugins only.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   *
+   * @return array
+   *   Enabled plugin definitions.
+   */
+  public function getEnabledDefinitions(EditorInterface $editor): array;
+
+  /**
+   * Searches for CKEditor 5 plugin that supports a given tag.
+   *
+   * @param string $tag
+   *   The HTML tag to be searched for within plugin definitions.
+   *
+   * @return string|null
+   *   The ID of the plugin that supports the given tag.
+   */
+  public function findPluginSupportingElement(string $tag): ?string;
+
+  /**
+   * Gets the configuration for the CKEditor 5 plugins enabled in this editor.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   *
+   * @return array[]
+   *   An array with two key-value pairs:
+   *   1. 'plugins' lists all plugins to load
+   *   2. 'config' lists the configuration for all these plugins.
+   *
+   * @see https://ckeditor.com/docs/ckeditor5/latest/api/module_editor-classic_classiceditor-ClassicEditor.html
+   *
+   * @see \Drupal\ckeditor5\Plugin\Editor\CKEditor5::getJSSettings()
+   */
+  public function getCKEditor5PluginConfig(EditorInterface $editor): array;
+
+  /**
+   * Create a list of elements with attributes declared for the CKEditor5 build.
+   *
+   * @param string[] $plugin_ids
+   *   An array of plugin IDs.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   * @param bool $retain_wildcard
+   *   If TRUE, the returned array will include config for wildcard elements
+   *   such as `<$block>`.
+   *
+   * @return array
+   *   A nested array with a structure as described in
+   *   \Drupal\filter\Plugin\FilterInterface::getHTMLRestrictions().
+   *
+   * @throws \LogicException
+   *   Thrown when an invalid CKEditor5PluginElementsSubsetInterface implementation is encountered.
+   *
+   * @see \Drupal\filter\Plugin\FilterInterface::getHTMLRestrictions()
+   */
+  public function getProvidedElements(array $plugin_ids = [], EditorInterface $editor = NULL, bool $retain_wildcard = FALSE): array;
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Editor/CKEditor5.php b/core/modules/ckeditor5/src/Plugin/Editor/CKEditor5.php
new file mode 100644
index 0000000000000000000000000000000000000000..b93b78ef00696a22e546b211fab4c8dff2374e5d
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Editor/CKEditor5.php
@@ -0,0 +1,895 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Editor;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\ckeditor5\Plugin\CKEditor5Plugin\Heading;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface;
+use Drupal\Component\Serialization\Json;
+use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Config\Schema\SchemaCheckTrait;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\SubformState;
+use Drupal\Core\Form\SubformStateInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\ckeditor5\SmartDefaultSettings;
+use Drupal\Core\Validation\Plugin\Validation\Constraint\PrimitiveTypeConstraint;
+use Drupal\editor\EditorInterface;
+use Drupal\editor\Entity\Editor;
+use Drupal\editor\Plugin\EditorBase;
+use Drupal\filter\FilterFormatInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Validator\ConstraintViolation;
+use Symfony\Component\Validator\ConstraintViolationListInterface;
+
+/**
+ * Defines a CKEditor 5-based text editor for Drupal.
+ *
+ * @Editor(
+ *   id = "ckeditor5",
+ *   label = @Translation("CKEditor 5"),
+ *   supports_content_filtering = TRUE,
+ *   supports_inline_editing = TRUE,
+ *   is_xss_safe = FALSE,
+ *   supported_element_types = {
+ *     "textarea"
+ *   }
+ * )
+ *
+ * @internal
+ *   Plugin classes are internal.
+ */
+class CKEditor5 extends EditorBase implements ContainerFactoryPluginInterface {
+
+  use SchemaCheckTrait;
+
+  /**
+   * The CKEditor plugin manager.
+   *
+   * @var \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+   */
+  protected $ckeditor5PluginManager;
+
+  /**
+   * The language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManagerInterface
+   */
+  protected $languageManager;
+
+  /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * Smart default settings utility.
+   *
+   * @var \Drupal\ckeditor5\SmartDefaultSettings
+   */
+  protected $smartDefaultSettings;
+
+  /**
+   * The set of configured CKEditor 5 plugins.
+   *
+   * @var \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface[]
+   */
+  private $plugins = [];
+
+  /**
+   * The submitted editor.
+   *
+   * @var \Drupal\editor\EditorInterface
+   */
+  private $submittedEditor;
+
+  /**
+   * The cache.
+   *
+   * @var \Drupal\Core\Cache\CacheBackendInterface
+   */
+  protected $cache;
+
+  /**
+   * Constructs a CKEditor5 editor plugin.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface $ckeditor5_plugin_manager
+   *   The CKEditor5 plugin manager.
+   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
+   *   The language manager
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
+   * @param \Drupal\ckeditor5\SmartDefaultSettings $smart_default_settings
+   *   The smart default settings utility.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache
+   *   The cache.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, CKEditor5PluginManagerInterface $ckeditor5_plugin_manager, LanguageManagerInterface $language_manager, ModuleHandlerInterface $module_handler, SmartDefaultSettings $smart_default_settings, CacheBackendInterface $cache) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->ckeditor5PluginManager = $ckeditor5_plugin_manager;
+    $this->languageManager = $language_manager;
+    $this->moduleHandler = $module_handler;
+    $this->smartDefaultSettings = $smart_default_settings;
+    $this->cache = $cache;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('plugin.manager.ckeditor5.plugin'),
+      $container->get('language_manager'),
+      $container->get('module_handler'),
+      $container->get('ckeditor5.smart_default_settings'),
+      $container->get('cache.default')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultSettings() {
+    return [
+      'toolbar' => [
+        'items' => ['heading', 'bold', 'italic'],
+      ],
+      'plugins' => [
+        'ckeditor5_heading' => Heading::DEFAULT_CONFIGURATION,
+      ],
+    ];
+  }
+
+  /**
+   * Validates a Text Editor + Text Format pair.
+   *
+   * Drupal is designed to only verify schema conformity (and validation) of
+   * individual config entities. The Text Editor module layers a tightly coupled
+   * Editor entity on top of the Filter module's FilterFormat config entity.
+   * This inextricable coupling is clearly visible in EditorInterface:
+   * \Drupal\editor\EditorInterface::getFilterFormat(). They are always paired.
+   * Because not every text editor is guaranteed to be compatible with every
+   * text format, the pair must be validated.
+   *
+   * @param \Drupal\editor\EditorInterface $text_editor
+   *   The paired text editor to validate.
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The paired text format to validate.
+   * @param bool $all_compatibility_problems
+   *   Get all compatibility problems (default) or only fundamental ones.
+   *
+   * @return \Symfony\Component\Validator\ConstraintViolationListInterface
+   *   The validation constraint violations.
+   *
+   * @throws \InvalidArgumentException
+   *   Thrown when the text editor is not configured to use CKEditor 5.
+   *
+   * @see \Drupal\editor\EditorInterface::getFilterFormat()
+   * @see ckeditor5.pair.schema.yml
+   */
+  public static function validatePair(EditorInterface $text_editor, FilterFormatInterface $text_format, bool $all_compatibility_problems = TRUE): ConstraintViolationListInterface {
+    if ($text_editor->getEditor() !== 'ckeditor5') {
+      throw new \InvalidArgumentException('This text editor is not configured to use CKEditor 5.');
+    }
+
+    $typed_config_manager = \Drupal::getContainer()->get('config.typed');
+    $typed_config = $typed_config_manager->createFromNameAndData(
+      'ckeditor5_valid_pair__format_and_editor',
+      [
+        // A mix of:
+        // - editor.editor.*.settings — note that "settings" is top-level in
+        //   editor.editor.*, and so it is here, so all validation constraints
+        //   will continue to work fine.
+        'settings' => $text_editor->toArray()['settings'],
+        // - filter.format.*.filters — note that "filters" is top-level in
+        //   filter.format.*, and so it is here, so all validation constraints
+        //   will continue to work fine.
+        'filters' => $text_format->toArray()['filters'],
+        // - editor.editor.*.image_upload — note that "image_upload" is
+        //   top-level in editor.editor.*, and so it is here, so all validation
+        //   constraints will continue to work fine.
+        'image_upload' => $text_editor->toArray()['image_upload'],
+      ]
+    );
+    $violations = $typed_config->validate();
+
+    // Only consider validation constraint violations covering the pair, so not
+    // irrelevant details such as a PrimitiveTypeConstraint in filter settings,
+    // which do not affect CKEditor 5 anyway.
+    foreach ($violations as $i => $violation) {
+      assert($violation instanceof ConstraintViolation);
+      if (explode('.', $violation->getPropertyPath())[0] === 'filters' && is_a($violation->getConstraint(), PrimitiveTypeConstraint::class)) {
+        $violations->remove($i);
+      }
+    }
+
+    if (!$all_compatibility_problems) {
+      foreach ($violations as $i => $violation) {
+        // Remove all violations that are not fundamental — these are at the
+        // root (property path '').
+        if ($violation->getPropertyPath() !== '') {
+          $violations->remove($i);
+        }
+      }
+    }
+
+    return $violations;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $editor = $form_state->get('editor');
+    assert($editor instanceof Editor);
+    $language = $this->languageManager->getCurrentLanguage();
+
+    // When enabling CKEditor 5, generate sensible settings from the
+    // pre-existing text editor/format rather than the hardcoded defaults
+    // whenever possible.
+    // @todo Remove after https://www.drupal.org/project/drupal/issues/3226673.
+    $format = $form_state->getFormObject()->getEntity();
+    assert($format instanceof FilterFormatInterface);
+    if ($editor->isNew() && !$form_state->get('ckeditor5_is_active') && $form_state->get('ckeditor5_is_selected')) {
+      assert($editor->getSettings() === $this->getDefaultSettings());
+      if (!$format->isNew()) {
+        [$editor, $messages] = $this->smartDefaultSettings->computeSmartDefaultSettings($editor, $format);
+        foreach ($messages as $message) {
+          $this->messenger()->addMessage($message);
+        }
+      }
+      $eventual_editor_and_format = $this->getEventualEditorWithPrimedFilterFormat($form_state, $editor);
+      // Provide the validated eventual pair in form state to
+      // ::getGeneratedAllowedHtmlValue(), to update filter_html's
+      // "allowed_html".
+      $form_state->set('ckeditor5_validated_pair', $eventual_editor_and_format);
+      // Ensure that CKEditor 5 plugins that need to interact with the Editor
+      // config entity are able to access the computed Editor, which was cloned
+      // from $form_state->get('editor').
+      // @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\ImageUpload::buildConfigurationForm
+      $form_state->set('editor', $editor);
+    }
+
+    // AJAX validation errors should appear visually close to the text editor
+    // since this is a very long form: otherwise they would not be noticed.
+    $form['real_time_validation_errors_location'] = [
+      '#type' => 'container',
+      '#id' => 'ckeditor5-realtime-validation-messages-container',
+    ];
+
+    $form['toolbar'] = [
+      '#type' => 'container',
+      '#title' => $this->t('CKEditor 5 toolbar configuration'),
+      '#theme' => 'ckeditor5_settings_toolbar',
+      '#attached' => [
+        'library' => $this->ckeditor5PluginManager->getAdminLibraries(),
+        'drupalSettings' => [
+          'ckeditor5' => [
+            'language' => [
+              'dir' => $language->getDirection(),
+              'langcode' => $language->getId(),
+            ],
+          ],
+        ],
+      ],
+    ];
+
+    $form['available_items_description'] = [
+      '#type' => 'container',
+      '#markup' => $this->t('Press the down arrow key to add to the toolbar.'),
+      '#id' => 'available-button-description',
+      '#attributes' => [
+        'class' => ['visually-hidden'],
+      ],
+    ];
+
+    $form['active_items_description'] = [
+      '#type' => 'container',
+      '#markup' => $this->t('Move this button in the toolbar by pressing the left or right arrow keys. Press the up arrow key to remove from the toolbar.'),
+      '#id' => 'active-button-description',
+      '#attributes' => [
+        'class' => ['visually-hidden'],
+      ],
+    ];
+
+    // The items are encoded in markup to provide a no-JS fallback.
+    // Although CKEditor 5 is useless without JS it would still be possible
+    // to see all the available toolbar items provided by plugins in the format
+    // that needs to be entered in the textarea. The UI app parses this list.
+    $form['toolbar']['available'] = [
+      '#type' => 'container',
+      '#title' => 'Available items',
+      '#id' => 'ckeditor5-toolbar-buttons-available',
+      'available_items' => [
+        '#markup' => Json::encode($this->ckeditor5PluginManager->getToolbarItems()),
+      ],
+    ];
+
+    $editor_settings = $editor->getSettings();
+    // This form field requires a JSON-style array of valid toolbar items.
+    // e.g. ["bold","italic","|","uploadImage"].
+    // CKEditor 5 config for toolbar items takes an array of strings which
+    // correspond to the keys under toolbar_items in a plugin yml or annotation.
+    // @see https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/toolbar.html
+    $form['toolbar']['items'] = [
+      '#type' => 'textarea',
+      '#title' => $this->t('Toolbar items'),
+      '#rows' => 1,
+      '#default_value' => Json::encode($editor_settings['toolbar']['items']),
+      '#id' => 'ckeditor5-toolbar-buttons-selected',
+      '#attributes' => [
+        'tabindex' => '-1',
+        'aria-hidden' => 'true',
+      ],
+    ];
+
+    $form['plugin_settings'] = [
+      '#type' => 'vertical_tabs',
+      '#title' => $this->t('CKEditor5 plugin settings'),
+      '#id' => 'ckeditor5-plugin-settings',
+    ];
+
+    $this->injectPluginSettingsForm($form, $form_state, $editor);
+
+    // Allow reliable detection of switching to CKEditor 5 from another text
+    // editor (or none at all).
+    $form['is_already_using_ckeditor5'] = [
+      '#type' => 'hidden',
+      '#default_value' => TRUE,
+    ];
+
+    return $form;
+  }
+
+  /**
+   * Determines whether the plugin settings form should be visible.
+   *
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition $definition
+   *   The configurable CKEditor 5 plugin to assess the visibility for.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   *
+   * @return bool
+   *   Whether this configurable plugin's settings form should be visible.
+   */
+  private function shouldHaveVisiblePluginSettingsForm(CKEditor5PluginDefinition $definition, EditorInterface $editor): bool {
+    assert($definition->isConfigurable());
+    $enabled_plugins = $this->ckeditor5PluginManager->getEnabledDefinitions($editor);
+
+    $plugin_id = $definition->id();
+
+    // Enabled plugins should be configurable.
+    if (isset($enabled_plugins[$plugin_id])) {
+      return TRUE;
+    }
+
+    // There are two circumstances where a plugin not listed in $enabled_plugins
+    // due to isEnabled() returning false, that should still have its config
+    // form provided:
+    // 1 - A conditionally enabled plugin that does not depend on a toolbar item
+    // to be active.
+    // 2 - A conditionally enabled plugin that does depend on a toolbar item,
+    // and that toolbar item is active.
+    if ($definition->hasConditions()) {
+      $conditions = $definition->getConditions();
+      if (!array_key_exists('toolbarItem', $conditions)) {
+        return TRUE;
+      }
+      elseif (in_array($conditions['toolbarItem'], $editor->getSettings()['toolbar']['items'], TRUE)) {
+        return TRUE;
+      }
+    }
+
+    return FALSE;
+  }
+
+  /**
+   * Injects the CKEditor plugins settings forms as a vertical tabs subform.
+   *
+   * @param array &$form
+   *   A reference to an associative array containing the structure of the form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   */
+  private function injectPluginSettingsForm(array &$form, FormStateInterface $form_state, EditorInterface $editor): void {
+    $definitions = $this->ckeditor5PluginManager->getDefinitions();
+    $eventual_editor_and_format = $this->getEventualEditorWithPrimedFilterFormat($form_state, $editor);
+
+    foreach ($definitions as $plugin_id => $definition) {
+      if ($definition->isConfigurable() && $this->shouldHaveVisiblePluginSettingsForm($definition, $eventual_editor_and_format)) {
+        $plugin = $this->ckeditor5PluginManager->getPlugin($plugin_id, $editor);
+        $plugin_settings_form = [];
+        $form['plugins'][$plugin_id] = [
+          '#type' => 'details',
+          '#title' => $definition->label(),
+          '#open' => TRUE,
+          '#group' => 'editor][settings][plugin_settings',
+          '#attributes' => [
+            'data-ckeditor5-plugin-id' => $plugin_id,
+          ],
+        ];
+        $form['plugins'][$plugin_id] += $plugin->buildConfigurationForm($plugin_settings_form, $form_state);
+      }
+    }
+  }
+
+  /**
+   * Form #after_build callback: provides text editor state changes.
+   *
+   * Updates the internal $this->entity object with submitted values when the
+   * form is being rebuilt (e.g. submitted via AJAX), so that subsequent
+   * processing (e.g. AJAX callbacks) can rely on it.
+   *
+   * @see \Drupal\Core\Entity\EntityForm::afterBuild()
+   */
+  public static function assessActiveTextEditorAfterBuild(array $element, FormStateInterface $form_state): array {
+    // The case of the form being built initially, and the text editor plugin in
+    // use is already CKEditor 5.
+    if (!$form_state->isProcessingInput()) {
+      $editor = $form_state->get('editor');
+      $already_using_ckeditor5 = $editor && $editor->getEditor() === 'ckeditor5';
+    }
+    else {
+      // Whenever there is user input, this cannot be the initial build of the
+      // form and hence we need to inspect user input.
+      $already_using_ckeditor5 = FALSE;
+      NestedArray::getValue($form_state->getUserInput(), ['editor', 'settings', 'is_already_using_ckeditor5'], $already_using_ckeditor5);
+    }
+
+    $form_state->set('ckeditor5_is_active', $already_using_ckeditor5);
+    $form_state->set('ckeditor5_is_selected', $form_state->getValue(['editor', 'editor']) === 'ckeditor5');
+    return $element;
+  }
+
+  /**
+   * Validate callback to inform the user of CKEditor 5 compatibility problems.
+   */
+  public static function validateSwitchingToCKEditor5(array $form, FormStateInterface $form_state): void {
+    if (!$form_state->get('ckeditor5_is_active') && $form_state->get('ckeditor5_is_selected')) {
+      $minimal_ckeditor5_editor = Editor::create([
+        'format' => NULL,
+        'editor' => 'ckeditor5',
+      ]);
+      $submitted_filter_format = CKEditor5::getSubmittedFilterFormat($form_state);
+      $fundamental_incompatibilities = CKEditor5::validatePair($minimal_ckeditor5_editor, $submitted_filter_format, FALSE);
+      foreach ($fundamental_incompatibilities as $violation) {
+        // @codingStandardsIgnoreLine
+        $form_state->setErrorByName('editor][editor', t($violation->getMessageTemplate(), $violation->getParameters()));
+      }
+    }
+  }
+
+  /**
+   * Value callback to set the CKEditor 5-generated "allowed_html" value.
+   *
+   * Used to set the value of filter_html's "allowed_html" form item if the form
+   * has been validated and hence `ckeditor5_validated_pair` is available
+   * in form state. This allows setting a guaranteed to be valid value.
+   *
+   * `ckeditor5_validated_pair` can be set from two places:
+   * - When switching to CKEditor 5, this is populated by
+   *   CKEditor5::buildConfigurationForm().
+   * - When making filter or editor settings changes, it is populated by
+   *  CKEditor5::validateConfigurationForm().
+   *
+   * @param array $element
+   *   An associative array containing the properties of the element.
+   * @param mixed $input
+   *   The incoming input to populate the form element. If this is FALSE,
+   *   the element's default value should be returned.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   *
+   * @return string
+   *   The value to assign to the element.
+   */
+  public static function getGeneratedAllowedHtmlValue(array &$element, $input, FormStateInterface $form_state): string {
+    if ($form_state->isValidationComplete()) {
+      $validated_format = $form_state->get('ckeditor5_validated_pair')->getFilterFormat();
+      $configuration = $validated_format->filters()->get('filter_html')->getConfiguration();
+      return $configuration['settings']['allowed_html'];
+    }
+    else {
+      if ($input !== FALSE) {
+        return $input;
+      }
+      return $element['#default_value'];
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $json = $form_state->getValue(['toolbar', 'items']);
+    $toolbar_items = Json::decode($json);
+
+    // This basic validation must live in the form logic because it can only
+    // occur in a form context.
+    if (!$toolbar_items) {
+      $form_state->setErrorByName('toolbar][items', $this->t('Invalid toolbar value.'));
+      return;
+    }
+
+    // Construct a Text Editor config entity with the submitted values for
+    // validation. Do this on a clone: do not manipulate form state.
+    $submitted_editor = clone $form_state->get('editor');
+    $settings = $submitted_editor->getSettings();
+    // Update settings first to match the submitted toolbar items. This is
+    // necessary for ::shouldHaveVisiblePluginSettingsForm() to work.
+    $settings['toolbar']['items'] = $toolbar_items;
+    $submitted_editor->setSettings($settings);
+    $eventual_editor_and_format_for_plugin_settings_visibility = $this->getEventualEditorWithPrimedFilterFormat($form_state, $submitted_editor);
+    $settings['plugins'] = [];
+    foreach ($this->ckeditor5PluginManager->getDefinitions() as $plugin_id => $definition) {
+      if (!$definition->isConfigurable()) {
+        continue;
+      }
+      // Create a fresh instance of this CKEditor 5 plugin, not tied to a text
+      // editor configuration entity.
+      $plugin = $this->ckeditor5PluginManager->getPlugin($plugin_id, NULL);
+      // If this plugin is configurable but it has empty default configuration,
+      // that means the configuration must be stored out of band.
+      // @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\ImageUpload
+      // @see editor_image_upload_settings_form()
+      $default_configuration = $plugin->defaultConfiguration();
+      $configuration_stored_out_of_band = empty($default_configuration);
+
+      if ($form_state->hasValue(['plugins', $plugin_id])) {
+        $subform = $form['plugins'][$plugin_id];
+        $subform_state = SubformState::createForSubform($subform, $form, $form_state);
+        $plugin->validateConfigurationForm($subform, $subform_state);
+        $plugin->submitConfigurationForm($subform, $subform_state);
+
+        // If the configuration is stored out of band, ::submitConfigurationForm
+        // will already have stored it. If it is not stored out of band,
+        // populate $settings, to populate $submitted_editor.
+        if (!$configuration_stored_out_of_band) {
+          $settings['plugins'][$plugin_id] = $plugin->getConfiguration();
+        }
+      }
+      // @see \Drupal\ckeditor5\Plugin\Editor\CKEditor5::injectPluginSettingsForm()
+      elseif ($this->shouldHaveVisiblePluginSettingsForm($definition, $eventual_editor_and_format_for_plugin_settings_visibility)) {
+        if (!$configuration_stored_out_of_band) {
+          $settings['plugins'][$plugin_id] = $default_configuration;
+        }
+      }
+    }
+    // All plugin settings have been collected, including defaults that depend
+    // on visibility. Store the collected settings, throw away the interim state
+    // that allowed determining which defaults to add.
+    unset($eventual_editor_and_format_for_plugin_settings_visibility);
+    $submitted_editor->setSettings($settings);
+
+    // Validate the text editor + text format pair.
+    // Note that the eventual pair is computed and validated, not the received
+    // pair: if the filter_html filter is in use, the CKEditor 5 configuration
+    // dictates the filter_html's filter plugin's "allowed_html" setting.
+    // @see ckeditor5_form_filter_format_form_alter()
+    // @see ::getGeneratedAllowedHtmlValue()
+    $eventual_editor_and_format = $this->getEventualEditorWithPrimedFilterFormat($form_state, $submitted_editor);
+    $violations = CKEditor5::validatePair($eventual_editor_and_format, $eventual_editor_and_format->getFilterFormat());
+    foreach ($violations as $violation) {
+      $form_item_name = static::mapPairViolationPropertyPathsToFormNames($violation->getPropertyPath(), $form);
+      // When adding a toolbar item, it is possible that not all conditions for
+      // using it have been met yet. FormBuilder refuses to rebuild forms when a
+      // validation error is present. But to meet the condition for the toolbar
+      // item, configuration must be set in a vertical tab that must still
+      // appear. Work-around: reduce the validation error to a warning message.
+      // @see \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemConditionsMetConstraintValidator
+      if ($form_state->isRedirectDisabled() && $form_item_name === 'editor][settings][toolbar][items') {
+        $this->messenger()->addWarning($violation->getMessage());
+        continue;
+      }
+      $form_state->getCompleteFormState()->setErrorByName($form_item_name, $violation->getMessage());
+    }
+
+    // Pass it on to ::submitConfigurationForm().
+    $form_state->get('editor')->setSettings($settings);
+
+    // Provide the validated eventual pair in form state to
+    // ::getGeneratedAllowedHtmlValue(), to update filter_html's
+    // "allowed_html".
+    $form_state->set('ckeditor5_validated_pair', $eventual_editor_and_format);
+
+    assert(TRUE === $this->checkConfigSchema(\Drupal::getContainer()->get('config.typed'), 'editor.editor.id_does_not_matter', $submitted_editor->toArray()), 'Schema errors: ' . print_r($this->checkConfigSchema(\Drupal::getContainer()->get('config.typed'), 'editor.editor.id_does_not_matter', $submitted_editor->toArray()), TRUE));
+  }
+
+  /**
+   * Gets the submitted text format config entity from form state.
+   *
+   * Needed for validation.
+   *
+   * @param \Drupal\Core\Form\FormStateInterface $filter_format_form_state
+   *   The text format configuration form's form state.
+   *
+   * @return \Drupal\filter\FilterFormatInterface
+   *   A FilterFormat config entity representing the current filter form state.
+   */
+  protected static function getSubmittedFilterFormat(FormStateInterface $filter_format_form_state): FilterFormatInterface {
+    $submitted_filter_format = clone $filter_format_form_state->getFormObject()->getEntity();
+    assert($submitted_filter_format instanceof FilterFormatInterface);
+
+    // Get only the values of the filter_format form state that are relevant for
+    // checking compatibility. This logic is copied from FilterFormatFormBase.
+    // @see \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraintValidator
+    // @see \Drupal\filter\FilterFormatFormBase::submitForm()
+    $filter_format_form_values = array_intersect_key(
+      $filter_format_form_state->getValues(),
+      array_flip(['filters', 'filter_settings']
+    ));
+    foreach ($filter_format_form_values as $key => $value) {
+      if ($key !== 'filters') {
+        $submitted_filter_format->set($key, $value);
+      }
+      else {
+        foreach ($value as $instance_id => $config) {
+          $submitted_filter_format->setFilterConfig($instance_id, $config);
+        }
+      }
+    }
+
+    return $submitted_filter_format;
+  }
+
+  /**
+   * Gets the eventual text format config entity: from form state + editor.
+   *
+   * Needed for validation.
+   *
+   * @param \Drupal\Core\Form\SubformStateInterface $editor_form_state
+   *   The text editor configuration form's form state.
+   * @param \Drupal\editor\EditorInterface $submitted_editor
+   *   The current text editor config entity.
+   *
+   * @return \Drupal\editor\EditorInterface
+   *   A clone of the received Editor config entity , with a primed associated
+   *   FilterFormat that corresponds to the current form state, to avoid the
+   *   stored FilterFormat config entity being loaded.
+   */
+  protected function getEventualEditorWithPrimedFilterFormat(SubformStateInterface $editor_form_state, EditorInterface $submitted_editor): EditorInterface {
+    $submitted_filter_format = static::getSubmittedFilterFormat($editor_form_state->getCompleteFormState());
+
+    $pair = static::createEphemeralPairedEditor($submitted_editor, $submitted_filter_format);
+
+    if ($pair->getFilterFormat()->filters('filter_html')->status) {
+      // Compute elements provided by the current CKEditor 5 settings.
+      $enabled_plugins = array_keys($this->ckeditor5PluginManager->getEnabledDefinitions($pair));
+      $elements = $this->ckeditor5PluginManager->getProvidedElements($enabled_plugins, $pair);
+
+      // Compute eventual filter_html setting. Eventual as in: this is the list
+      // of eventually allowed HTML tags.
+      // @see \Drupal\filter\FilterFormatFormBase::submitForm()
+      // @see ckeditor5_form_filter_format_form_alter()
+      $allowed_html = implode(' ', HTMLRestrictionsUtilities::toReadableElements($elements));
+      $filter_html_config = $pair->getFilterFormat()->filters('filter_html')->getConfiguration();
+      $filter_html_config['settings']['allowed_html'] = $allowed_html;
+      $pair->getFilterFormat()->setFilterConfig('filter_html', $filter_html_config);
+    }
+
+    return $pair;
+  }
+
+  /**
+   * Creates an ephemeral pair of text editor + text format config entity.
+   *
+   * Clones the given text editor config entity object and then overwrites its
+   * $filterFormat property, to prevent loading the text format config entity
+   * from entity storage in calls to Editor::hasAssociatedFilterFormat() and
+   * Editor::getFilterFormat().
+   * This is necessary to be able to evaluate unsaved text editor and format
+   * config entities:
+   * - for assessing which CKEditor 5 plugins are enabled and whose settings
+   *   forms to show
+   * - for validating them.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   The submitted text editor config entity, constructed from form values.
+   * @param \Drupal\filter\FilterFormatInterface $filter_format
+   *   The submitted text format config entity, constructed from form values.
+   *
+   * @return \Drupal\editor\EditorInterface
+   *   A clone of the given text editor config entity, with its $filterFormat
+   *   property set to a clone of the given text format config entity.
+   *
+   * @throws \ReflectionException
+   *
+   * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManager::isPluginDisabled()
+   * @todo Remove this in https://www.drupal.org/project/drupal/issues/3231347
+   */
+  protected static function createEphemeralPairedEditor(EditorInterface $editor, FilterFormatInterface $filter_format): EditorInterface {
+    $paired_editor = clone $editor;
+    $reflector = new \ReflectionObject($paired_editor);
+    $property = $reflector->getProperty('filterFormat');
+    $property->setAccessible(TRUE);
+    $property->setValue($paired_editor, clone $filter_format);
+    return $paired_editor;
+  }
+
+  /**
+   * Maps Text Editor config object property paths to form names.
+   *
+   * @param string $property_path
+   *   A config object property path.
+   * @param array $subform
+   *   The subform being checked.
+   *
+   * @return string
+   *   The corresponding form name in the subform.
+   */
+  protected static function mapViolationPropertyPathsToFormNames(string $property_path, array $subform): string {
+    $parts = explode('.', $property_path);
+    // The "settings" form element does exist, but one level above the Text
+    // Editor-specific form. This is operating on a subform.
+    $shifted = array_shift($parts);
+    assert($shifted === 'settings');
+
+    // It is not required (nor sensible) for the form structure to match the
+    // config schema structure 1:1. Automatically identify the relevant form
+    // name. Try to be specific. Worst case, an entire plugin settings vertical
+    // tab is targeted. (Hence the minimum of 2 parts: the property path gets at
+    // minimum mapped to 'toolbar.items' or 'plugins.<plugin ID>'.)
+    while (count($parts) > 2 && !NestedArray::keyExists($subform, $parts)) {
+      array_pop($parts);
+    }
+    assert(NestedArray::keyExists($subform, $parts));
+    return implode('][', array_merge(['settings'], $parts));
+  }
+
+  /**
+   * Maps Text Editor + Text Format pair property paths to form names.
+   *
+   * @param string $property_path
+   *   A config object property path.
+   * @param array $form
+   *   The form being checked.
+   *
+   * @return string
+   *   The corresponding form name in the complete form.
+   */
+  protected static function mapPairViolationPropertyPathsToFormNames(string $property_path, array $form): string {
+    // Fundamental compatibility errors are at the root. Map these to the text
+    // editor plugin dropdown.
+    if ($property_path === '') {
+      return 'editor][editor';
+    }
+
+    // Filters are top-level.
+    if (preg_match('/^filters\..*/', $property_path)) {
+      return implode('][', array_merge(explode('.', $property_path), ['settings']));
+    }
+
+    // Everything else is in the subform.
+    return 'editor][' . static::mapViolationPropertyPathsToFormNames($property_path, $form);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    // @see ::validateConfigurationForm()
+    $editor = $form_state->get('editor');
+
+    // Prepare the editor settings for editor_form_filter_admin_format_submit().
+    // This strips away unwanted form values too, because those never can exist
+    // in the already validated Editor config entity.
+    $form_state->setValues($editor->getSettings());
+
+    parent::submitConfigurationForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getJSSettings(Editor $editor) {
+    $toolbar_items = $editor->getSettings()['toolbar']['items'];
+    $plugin_config = $this->ckeditor5PluginManager->getCKEditor5PluginConfig($editor);
+
+    $settings = [
+      'toolbar' => [
+        'items' => $toolbar_items,
+        'shouldNotGroupWhenFull' => in_array('-', $toolbar_items, TRUE),
+      ],
+    ] + $plugin_config;
+
+    if ($this->moduleHandler->moduleExists('locale')) {
+      $ui_langcode = 'en';
+      $ckeditor_langcodes = $this->getLangcodes();
+      $language_interface = $this->languageManager->getCurrentLanguage();
+      if (isset($ckeditor_langcodes[$language_interface->getId()])) {
+        $ui_langcode = $ckeditor_langcodes[$language_interface->getId()];
+      }
+      $settings['language']['ui'] = $ui_langcode;
+    }
+
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLibraries(Editor $editor) {
+    $plugin_libraries = $this->ckeditor5PluginManager->getEnabledLibraries($editor);
+
+    if ($this->moduleHandler->moduleExists('locale')) {
+      $ui_langcode = 'en';
+      $ckeditor_langcodes = $this->getLangcodes();
+      $language_interface = $this->languageManager->getCurrentLanguage();
+      if (isset($ckeditor_langcodes[$language_interface->getId()])) {
+        $ui_langcode = $ckeditor_langcodes[$language_interface->getId()];
+      }
+      $plugin_libraries[] = 'core/ckeditor5.translations.' . $ui_langcode;
+    }
+
+    return $plugin_libraries;
+  }
+
+  /**
+   * Returns a list of language codes supported by CKEditor 5.
+   *
+   * @return array
+   *   An associative array keyed by language codes.
+   */
+  protected function getLangcodes(): array {
+    // Cache the file system based language list calculation because this would
+    // be expensive to calculate all the time. The cache is cleared on core
+    // upgrades which is the only situation the CKEditor file listing should
+    // change.
+    $langcode_cache = $this->cache->get('ckeditor5.langcodes');
+    if (!empty($langcode_cache)) {
+      $langcodes = $langcode_cache->data;
+    }
+    if (empty($langcodes)) {
+      $langcodes = [];
+      // Collect languages included with CKEditor 5 based on file listing.
+      $files = scandir('core/assets/vendor/ckeditor5/translations');
+      foreach ($files as $file) {
+        if ($file[0] !== '.' && preg_match('/\.js$/', $file)) {
+          $langcode = basename($file, '.js');
+          $langcodes[$langcode] = $langcode;
+        }
+      }
+      $this->cache->set('ckeditor5.langcodes', $langcodes);
+    }
+
+    // Get language mapping if available to map to Drupal language codes.
+    // This is configurable in the user interface and not expensive to get, so
+    // we don't include it in the cached language list.
+    $language_mappings = $this->moduleHandler->moduleExists('language') ? language_get_browser_drupal_langcode_mappings() : [];
+    foreach ($langcodes as $langcode) {
+      // If this language code is available in a Drupal mapping, use that to
+      // compute a possibility for matching from the Drupal langcode to the
+      // CKEditor langcode.
+      // For instance, CKEditor uses the langcode 'no' for Norwegian, Drupal
+      // uses 'nb'. This would then remove the 'no' => 'no' mapping and replace
+      // it with 'nb' => 'no'. Now Drupal knows which CKEditor translation to
+      // load.
+      if (isset($language_mappings[$langcode]) && !isset($langcodes[$language_mappings[$langcode]])) {
+        $langcodes[$language_mappings[$langcode]] = $langcode;
+        unset($langcodes[$langcode]);
+      }
+    }
+
+    return $langcodes;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..b9c3dc6062afcf327dc193d282feba2c1435377c
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraint.php
@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * CKEditor 5 element.
+ *
+ * @Constraint(
+ *   id = "CKEditor5Element",
+ *   label = @Translation("CKEditor 5 element", context = "Validation"),
+ * )
+ */
+class CKEditor5ElementConstraint extends Constraint {
+
+  /**
+   * The default violation message.
+   *
+   * @var string
+   */
+  public $message = 'The following tag is not valid HTML: %provided_element.';
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraintValidator.php
new file mode 100644
index 0000000000000000000000000000000000000000..fe62d144218f1446531fa95da91510ac3482afc1
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraintValidator.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\Component\Utility\Html;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * CKEditor 5 element validator.
+ *
+ * @internal
+ */
+class CKEditor5ElementConstraintValidator extends ConstraintValidator {
+
+  /**
+   * {@inheritdoc}
+   *
+   * @throws \Symfony\Component\Validator\Exception\UnexpectedTypeException
+   *   Thrown when the given constraint is not supported by this validator.
+   */
+  public function validate($element, $constraint) {
+    if (!$constraint instanceof CKEditor5ElementConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\CKEditor5Element');
+    }
+    $body_child_nodes = Html::load(str_replace('>', ' />', trim($element)))->getElementsByTagName('body')->item(0)->childNodes;
+
+    if ($body_child_nodes->count() !== 1 || $body_child_nodes->item(0)->nodeType !== XML_ELEMENT_NODE) {
+      $this->context->buildViolation($constraint->message)
+        ->setParameter('%provided_element', $element)
+        ->addViolation();
+    }
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/EnabledConfigurablePluginsConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/EnabledConfigurablePluginsConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c8e843134c46983962865f6b0126d1fb3ca68e3
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/EnabledConfigurablePluginsConstraint.php
@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * The CKEditor 5 plugin settings.
+ *
+ * @Constraint(
+ *   id = "CKEditor5EnabledConfigurablePlugins",
+ *   label = @Translation("CKEditor 5 enabled configurable plugins", context = "Validation"),
+ * )
+ *
+ * @internal
+ */
+class EnabledConfigurablePluginsConstraint extends Constraint {
+
+  /**
+   * The default violation message.
+   *
+   * @var string
+   */
+  public $message = 'Configuration for the enabled plugin "%plugin_label" (%plugin_id) is missing.';
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/EnabledConfigurablePluginsConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/EnabledConfigurablePluginsConstraintValidator.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d610b9fc1f8848a54f84793a42f42aebd971d46
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/EnabledConfigurablePluginsConstraintValidator.php
@@ -0,0 +1,78 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Enabled configurable plugin settings validator.
+ *
+ * @internal
+ */
+class EnabledConfigurablePluginsConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface {
+
+  use PluginManagerDependentValidatorTrait;
+  use TextEditorObjectDependentValidatorTrait;
+
+  /**
+   * {@inheritdoc}
+   *
+   * @throws \Symfony\Component\Validator\Exception\UnexpectedTypeException
+   *   Thrown when the given constraint is not supported by this validator.
+   */
+  public function validate($settings, Constraint $constraint) {
+    if (!$constraint instanceof EnabledConfigurablePluginsConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\EnabledConfigurablePluginsConstraint');
+    }
+
+    $configurable_enabled_definitions = $this->getConfigurableEnabledDefinitions();
+    try {
+      $plugin_settings = $this->context->getRoot()->get('settings.plugins')->getValue();
+    }
+    catch (\InvalidArgumentException $e) {
+      $plugin_settings = [];
+    }
+
+    foreach ($configurable_enabled_definitions as $id => $definition) {
+      if ($definition->hasConditions() && isset($definition->getConditions()['imageUploadStatus']) && $definition->getConditions()['imageUploadStatus'] === TRUE) {
+        // This is the exception to the rule: this is a privileged plugin due to
+        // the Text Editor config entity's built-in image upload settings.
+        // @see \Drupal\editor\Entity\Editor::getImageUploadSettings()
+        // @see editor_image_upload_settings_form()
+        // @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\ImageUpload::buildConfigurationForm()
+        continue;
+      }
+
+      if (!isset($plugin_settings[$id]) || empty($plugin_settings[$id])) {
+        $this->context->buildViolation($constraint->message)
+          ->setParameter('%plugin_label', $definition->label())
+          ->setParameter('%plugin_id', $id)
+          ->atPath("plugins.$id")
+          ->addViolation();
+      }
+    }
+  }
+
+  /**
+   * Gets all configurable CKEditor 5 plugin definitions that are enabled.
+   *
+   * @return \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition[]
+   *   An array of enabled configurable CKEditor 5 plugin definitions.
+   */
+  private function getConfigurableEnabledDefinitions(): array {
+    $text_editor = $this->createTextEditorObjectFromContext();
+    $enabled_definitions = $this->pluginManager->getEnabledDefinitions($text_editor);
+    $configurable_enabled_definitions = array_filter($enabled_definitions, function (CKEditor5PluginDefinition $definition): bool {
+      return $definition->isConfigurable();
+    });
+
+    return $configurable_enabled_definitions;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..6932fe8ae4f4180362559d3cd630f793823388b9
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraint.php
@@ -0,0 +1,56 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * The fundamental compatibility constraint.
+ *
+ * @Constraint(
+ *   id = "CKEditor5FundamentalCompatibility",
+ *   label = @Translation("CKEditor 5 fundamental text format compatibility", context = "Validation"),
+ * )
+ *
+ * @internal
+ */
+class FundamentalCompatibilityConstraint extends Constraint {
+
+  /**
+   * The violation message when no markup filters are enabled.
+   *
+   * @var string
+   */
+  public $noMarkupFiltersMessage = 'CKEditor 5 only works with HTML-based text formats. The "%filter_label" (%filter_plugin_id) filter implies this text format is not HTML anymore.';
+
+  /**
+   * The violation message when fundamental HTML elements are forbidden.
+   *
+   * @var string
+   */
+  public $forbiddenElementsMessage = 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are forbidden by the "%filter_label" (%filter_plugin_id) filter.';
+
+  /**
+   * The violation message when fundamental HTML elements are not allowed.
+   *
+   * @var string
+   */
+  public $nonAllowedElementsMessage = 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are not allowed by the "%filter_label" (%filter_plugin_id) filter.';
+
+  /**
+   * The violation message when HTML elements cannot be generated by CKE5.
+   *
+   * @var string
+   */
+  public $notSupportedElementsMessage = 'The current CKEditor 5 build requires the following elements and attributes: <br><code>@list</code><br>The following elements are not supported: <br><code>@diff</code>';
+
+  /**
+   * The violation message when CKE5 can generate disallowed HTML elements.
+   *
+   * @var string
+   */
+  public $missingElementsMessage = 'The current CKEditor 5 build requires the following elements and attributes: <br><code>@list</code><br>The following elements are missing: <br><code>@diff</code>';
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraintValidator.php
new file mode 100644
index 0000000000000000000000000000000000000000..43de2c35c9a5edcc282d461e79b210f961f56d7f
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraintValidator.php
@@ -0,0 +1,293 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\editor\EditorInterface;
+use Drupal\filter\FilterFormatInterface;
+use Drupal\filter\Plugin\FilterInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Validates fundamental compatibility of CKEditor 5 with the given text format.
+ *
+ * Fundamental requirements:
+ * 1. No TYPE_MARKUP_LANGUAGE filters allowed.
+ * 2. Fundamental CKEditor 5 plugins' HTML tags are allowed.
+ * 3. The HTML restrictions of all TYPE_HTML_RESTRICTOR filters allow the
+ *    configured CKEditor 5 plugins to work.
+ *
+ * @see \Drupal\filter\Plugin\FilterInterface::TYPE_HTML_RESTRICTOR
+ *
+ * @internal
+ */
+class FundamentalCompatibilityConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface {
+
+  use PluginManagerDependentValidatorTrait;
+  use TextEditorObjectDependentValidatorTrait;
+
+  /**
+   * The fundamental CKEditor 5 plugins without which it cannot function.
+   *
+   * @var string[]
+   */
+  const FUNDAMENTAL_CKEDITOR5_PLUGINS = [
+    'ckeditor5_essentials',
+    'ckeditor5_paragraph',
+  ];
+
+  /**
+   * {@inheritdoc}
+   *
+   * @throws \Symfony\Component\Validator\Exception\UnexpectedTypeException
+   *   Thrown when the given constraint is not supported by this validator.
+   */
+  public function validate($toolbar_item, Constraint $constraint) {
+    if (!$constraint instanceof FundamentalCompatibilityConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\FundamentalCompatibility');
+    }
+
+    $text_editor = $this->createTextEditorObjectFromContext();
+
+    // First: the two fundamental checks against the text format. If any of
+    // them adds a constraint violation, return early, because it is a
+    // fundamental compatibility problem.
+    $this->checkNoMarkupFilters($text_editor->getFilterFormat(), $constraint);
+    if ($this->context->getViolations()->count() > 0) {
+      return;
+    }
+    $this->checkHtmlRestrictionsAreCompatible($text_editor->getFilterFormat(), $constraint);
+    if ($this->context->getViolations()->count() > 0) {
+      return;
+    }
+
+    // Finally: ensure the CKEditor 5 configuration's ability to generate HTML
+    // markup precisely matches that of the text format.
+    $this->checkHtmlRestrictionsMatch($text_editor, $constraint);
+  }
+
+  /**
+   * Checks no TYPE_MARKUP_LANGUAGE filters are present.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The text format to validate.
+   * @param \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraint $constraint
+   *   The constraint to validate.
+   */
+  private function checkNoMarkupFilters(FilterFormatInterface $text_format, FundamentalCompatibilityConstraint $constraint): void {
+    $markup_filters = static::getFiltersInFormatOfType(
+      $text_format,
+      FilterInterface::TYPE_MARKUP_LANGUAGE
+    );
+    if (!empty($markup_filters)) {
+      foreach ($markup_filters as $markup_filter) {
+        $this->context->buildViolation($constraint->noMarkupFiltersMessage)
+          ->setParameter('%filter_label', $markup_filter->getLabel())
+          ->setParameter('%filter_plugin_id', $markup_filter->getPluginId())
+          ->addViolation();
+      }
+    }
+  }
+
+  /**
+   * Checks that fundamental CKEditor 5 plugins' HTML tags are allowed.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The text format to validate.
+   * @param \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraint $constraint
+   *   The constraint to validate.
+   */
+  private function checkHtmlRestrictionsAreCompatible(FilterFormatInterface $text_format, FundamentalCompatibilityConstraint $constraint): void {
+    $minimum_tags = array_keys($this->pluginManager->getProvidedElements(self::FUNDAMENTAL_CKEDITOR5_PLUGINS));
+
+    $html_restrictions = $text_format->getHtmlRestrictions();
+
+    $forbidden_minimum_tags = isset($html_restrictions['forbidden_tags'])
+      ? array_diff($minimum_tags, $html_restrictions['forbidden_tags'])
+      : [];
+    if (!empty($forbidden_minimum_tags)) {
+      $offending_filter = static::findHtmlRestrictorFilterForbiddingTags($text_format, $minimum_tags);
+      $this->context->buildViolation($constraint->forbiddenElementsMessage)
+        ->setParameter('%filter_label', $offending_filter->getLabel())
+        ->setParameter('%filter_plugin_id', $offending_filter->getPluginId())
+        ->addViolation();
+    }
+
+    $not_allowed_minimum_tags = isset($html_restrictions['allowed'])
+      ? array_diff($minimum_tags, array_keys($html_restrictions['allowed']))
+      : [];
+    if (!empty($not_allowed_minimum_tags)) {
+      $offending_filter = static::findHtmlRestrictorFilterNotAllowingTags($text_format, $minimum_tags);
+      $this->context->buildViolation($constraint->nonAllowedElementsMessage)
+        ->setParameter('%filter_label', $offending_filter->getLabel())
+        ->setParameter('%filter_plugin_id', $offending_filter->getPluginId())
+        ->addViolation();
+    }
+  }
+
+  /**
+   * Checks the HTML restrictions match the enabled CKEditor 5 plugins' output.
+   *
+   * @param \Drupal\editor\EditorInterface $text_editor
+   *   The text editor to validate.
+   * @param \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraint $constraint
+   *   The constraint to validate.
+   */
+  private function checkHtmlRestrictionsMatch(EditorInterface $text_editor, FundamentalCompatibilityConstraint $constraint): void {
+    $html_restrictor_filters = static::getFiltersInFormatOfType(
+      $text_editor->getFilterFormat(),
+      FilterInterface::TYPE_HTML_RESTRICTOR
+    );
+
+    $enabled_plugins = array_keys($this->pluginManager->getEnabledDefinitions($text_editor));
+    $provided = $this->pluginManager->getProvidedElements($enabled_plugins, $text_editor);
+
+    foreach ($html_restrictor_filters as $filter_plugin_id => $filter) {
+      $restrictions = $filter->getHTMLRestrictions();
+      if (!isset($restrictions['allowed'])) {
+        // @todo Handle HTML restrictor filters that only set forbidden_tags
+        //   https://www.drupal.org/project/ckeditor5/issues/3231336.
+        continue;
+      }
+
+      $allowed = $restrictions['allowed'];
+      // @todo Validate attributes allowed or forbidden on all elements
+      //   https://www.drupal.org/project/ckeditor5/issues/3231334.
+      if (isset($allowed['*'])) {
+        unset($allowed['*']);
+      }
+
+      $diff_allowed = HTMLRestrictionsUtilities::diffAllowedElements($allowed, $provided);
+      $diff_elements = HTMLRestrictionsUtilities::diffAllowedElements($provided, $allowed);
+
+      if (!empty($diff_allowed)) {
+        $this->context->buildViolation($constraint->notSupportedElementsMessage)
+          ->setParameter('@list', implode(' ', HTMLRestrictionsUtilities::toReadableElements($provided)))
+          ->setParameter('@diff', implode(' ', HTMLRestrictionsUtilities::toReadableElements($diff_allowed)))
+          ->atPath("filters.$filter_plugin_id")
+          ->addViolation();
+      }
+      elseif (!empty($diff_elements)) {
+        $this->context->buildViolation($constraint->missingElementsMessage)
+          ->setParameter('@list', implode(' ', HTMLRestrictionsUtilities::toReadableElements($provided)))
+          ->setParameter('@diff', implode(' ', HTMLRestrictionsUtilities::toReadableElements($diff_elements)))
+          ->atPath("filters.$filter_plugin_id")
+          ->addViolation();
+      }
+    }
+  }
+
+  /**
+   * Gets the filters of the given type in this text format.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   A text format whose filters to get.
+   * @param int $filter_type
+   *   One of FilterInterface::TYPE_*.
+   * @param callable|null $extra_requirements
+   *   An optional callable that can check a filter of this type for additional
+   *   conditions to be met. Must return TRUE when it meets the conditions,
+   *   FALSE otherwise.
+   *
+   * @return \Drupal\filter\Plugin\FilterInterface[]
+   *   The matched filter plugins.
+   */
+  private static function getFiltersInFormatOfType(FilterFormatInterface $text_format, int $filter_type, callable $extra_requirements = NULL): array {
+    assert(in_array($filter_type, [
+      FilterInterface::TYPE_MARKUP_LANGUAGE,
+      FilterInterface::TYPE_HTML_RESTRICTOR,
+      FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE,
+      FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE,
+    ]));
+    return array_filter($text_format->filters()->getAll(), function (FilterInterface $filter) use ($filter_type, $extra_requirements) {
+      if (!$filter->status) {
+        return FALSE;
+      }
+      if ($filter->getType() === $filter_type && ($extra_requirements === NULL || $extra_requirements($filter))) {
+        return TRUE;
+      }
+      return FALSE;
+    });
+  }
+
+  /**
+   * Analyzes a text format to find the filter not allowing required tags.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   A text format whose filters to check for compatibility.
+   * @param string[] $required_tags
+   *   A list of HTML tags that are required.
+   *
+   * @return \Drupal\filter\Plugin\FilterInterface
+   *   The filter plugin instance not allowing the required tags.
+   *
+   * @throws \InvalidArgumentException
+   */
+  private static function findHtmlRestrictorFilterForbiddingTags(FilterFormatInterface $text_format, array $required_tags): FilterInterface {
+    // Get HTML restrictor filters that actually restrict HTML.
+    $filters = static::getFiltersInFormatOfType(
+      $text_format,
+      FilterInterface::TYPE_HTML_RESTRICTOR,
+      function (FilterInterface $filter) {
+        return $filter->getHTMLRestrictions() !== FALSE;
+      }
+    );
+
+    foreach ($filters as $filter) {
+      $restrictions = $filter->getHTMLRestrictions();
+
+      // @todo Fix
+      //   \Drupal\filter_test\Plugin\Filter\FilterTestRestrictTagsAndAttributes::getHTMLRestrictions(),
+      //   whose computed value for forbidden_tags does not comply with the API
+      //   https://www.drupal.org/project/drupal/issues/3231331.
+      if (array_keys($restrictions['forbidden_tags']) != range(0, count($restrictions['forbidden_tags']))) {
+        $restrictions['forbidden_tags'] = array_keys($restrictions['forbidden_tags']);
+      }
+      if (isset($restrictions['forbidden_tags']) && !empty(array_intersect($required_tags, $restrictions['forbidden_tags']))) {
+        return $filter;
+      }
+    }
+
+    throw new \InvalidArgumentException('This text format does not have a "tags forbidden" restriction that includes the required tags.');
+  }
+
+  /**
+   * Analyzes a text format to find the filter not allowing required tags.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   A text format whose filters to check for compatibility.
+   * @param string[] $required_tags
+   *   A list of HTML tags that are required.
+   *
+   * @return \Drupal\filter\Plugin\FilterInterface
+   *   The filter plugin instance not allowing the required tags.
+   *
+   * @throws \InvalidArgumentException
+   */
+  private static function findHtmlRestrictorFilterNotAllowingTags(FilterFormatInterface $text_format, array $required_tags): FilterInterface {
+    // Get HTML restrictor filters that actually restrict HTML.
+    $filters = static::getFiltersInFormatOfType(
+      $text_format,
+      FilterInterface::TYPE_HTML_RESTRICTOR,
+      function (FilterInterface $filter) {
+        return $filter->getHTMLRestrictions() !== FALSE;
+      }
+    );
+
+    foreach ($filters as $filter) {
+      $restrictions = $filter->getHTMLRestrictions();
+
+      if (isset($restrictions['allowed']) && !empty(array_diff($required_tags, array_keys($restrictions['allowed'])))) {
+        return $filter;
+      }
+    }
+
+    throw new \InvalidArgumentException('This text format does not have a "tags allowed" restriction that excludes the required tags.');
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/PluginManagerDependentValidatorTrait.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/PluginManagerDependentValidatorTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae52ece32d484246690767252b43b442dcd950cc
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/PluginManagerDependentValidatorTrait.php
@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Common functionality for many CKEditor 5 validation constraints.
+ *
+ * @internal
+ */
+trait PluginManagerDependentValidatorTrait {
+
+  /**
+   * The CKEditor 5 plugin manager.
+   *
+   * @var \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+   */
+  protected $pluginManager;
+
+  /**
+   * Constructs a CKEditor5ConstraintValidatorTrait object.
+   *
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface $plugin_manager
+   *   The CKEditor 5 plugin manager.
+   */
+  public function __construct(CKEditor5PluginManagerInterface $plugin_manager) {
+    $this->pluginManager = $plugin_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('plugin.manager.ckeditor5.plugin')
+    );
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/SourceEditingRedundantTagsConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/SourceEditingRedundantTagsConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..76fe468a616df2304ee2a3d573a581d50e157bac
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/SourceEditingRedundantTagsConstraint.php
@@ -0,0 +1,35 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * For disallowing Source Editing tags that are already supported by a plugin.
+ *
+ * @Constraint(
+ *   id = "SourceEditingRedundantTags",
+ *   label = @Translation("Source editing should only use otherwise unavailable tags", context = "Validation"),
+ * )
+ *
+ * @internal
+ */
+class SourceEditingRedundantTagsConstraint extends Constraint {
+
+  /**
+   * When a Source Editing tag is added that an enabled plugin supports.
+   *
+   * @var string
+   */
+  public $enabledPluginsMessage = 'The following tag(s) are already supported by enabled plugins and should not be added to the Source Editing "Manually editable HTML tags" field: %overlapping_tags.';
+
+  /**
+   * When a Source Editing tag is added that a disabled plugin supports.
+   *
+   * @var string
+   */
+  public $availablePluginsMessage = 'The following tag(s) are already supported by available plugins and should not be added to the Source Editing "Manually editable HTML tags" field. Instead, enable the following plugins to support these tags: %overlapping_tags.';
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/SourceEditingRedundantTagsConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/SourceEditingRedundantTagsConstraintValidator.php
new file mode 100644
index 0000000000000000000000000000000000000000..618cd3c5951f708fe014a3ec3da2fc83a410bc68
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/SourceEditingRedundantTagsConstraintValidator.php
@@ -0,0 +1,103 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Ensures tags already available via plugin are not be added to Source Editing.
+ *
+ * @internal
+ */
+class SourceEditingRedundantTagsConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface {
+
+  use PluginManagerDependentValidatorTrait;
+  use TextEditorObjectDependentValidatorTrait;
+
+  /**
+   * {@inheritdoc}
+   *
+   * @throws \Symfony\Component\Validator\Exception\UnexpectedTypeException
+   *   Thrown when the given constraint is not supported by this validator.
+   */
+  public function validate($value, Constraint $constraint) {
+    if (!$constraint instanceof SourceEditingRedundantTagsConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\SourceEditingRedundantTagsConstraint');
+    }
+    if (empty($value)) {
+      return;
+    }
+
+    $text_editor = $this->createTextEditorObjectFromContext();
+    $enabled_plugins = $this->pluginManager->getEnabledDefinitions($text_editor);
+    $disabled_plugins = array_diff_key($this->pluginManager->getDefinitions(), $enabled_plugins);
+    unset($enabled_plugins['ckeditor5_sourceEditing']);
+
+    // An array of tags enabled by every plugin other than Source Editing.
+    $enabled_plugin_tags = $this->pluginManager->getProvidedElements(array_keys($enabled_plugins));
+    $disabled_plugin_tags = $this->pluginManager->getProvidedElements(array_keys($disabled_plugins));
+
+    // An array of just the tags enabled by Source Editing.
+    $source_enabled_tags = HTMLRestrictionsUtilities::allowedElementsStringToHtmlFilterArray($value);
+    $enabled_plugin_overlap = array_intersect_key($enabled_plugin_tags, $source_enabled_tags);
+    $disabled_plugin_overlap = array_intersect_key($disabled_plugin_tags, $source_enabled_tags);
+
+    foreach ([$enabled_plugin_overlap, $disabled_plugin_overlap] as &$overlap) {
+      $checking_enabled = $overlap === $enabled_plugin_overlap;
+      if (!empty($overlap)) {
+        foreach ($overlap as $overlapping_tag => $overlapping_config) {
+          if (is_array($source_enabled_tags[$overlapping_tag])) {
+            unset($overlap[$overlapping_tag]);
+          }
+        }
+      }
+      if (!empty($overlap)) {
+        $plugins_to_check_against = $checking_enabled ? $enabled_plugins : $disabled_plugins;
+        $tags_plugin_report = $this->pluginsSupplyingTagsMessage($overlap, $plugins_to_check_against);
+        $message = $checking_enabled ? $constraint->enabledPluginsMessage : $constraint->availablePluginsMessage;
+        $this->context->buildViolation($message)
+          ->setParameter('%overlapping_tags', $tags_plugin_report)
+          ->addViolation();
+      }
+    }
+  }
+
+  /**
+   * Creates a message listing plugins and the overlapping tags they provide.
+   *
+   * @param array $tags
+   *   An array of overlapping tags.
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition[] $plugin_definitions
+   *   An array of plugin definitions where overlap was found.
+   *
+   * @return string
+   *   A list of plugins that provide the overlapping tags.
+   */
+  private function pluginsSupplyingTagsMessage(array $tags, array $plugin_definitions): string {
+    $message_array = [];
+    $message_string = '';
+    foreach ($plugin_definitions as $plugin_id => $definition) {
+      if ($definition->hasElements()) {
+        $elements_array = HTMLRestrictionsUtilities::allowedElementsStringToHtmlFilterArray(implode('', $definition->getElements()));
+        foreach ($elements_array as $tag_name => $tag_config) {
+          if (isset($tags[$tag_name])) {
+            $message_array[(string) $definition->label()][] = "<$tag_name>";
+          }
+        }
+      }
+    }
+    foreach ($message_array as $plugin_label => $tag_list) {
+      $tags_string = implode(', ', $tag_list);
+      $message_string .= "$plugin_label ($tags_string), ";
+    }
+
+    return trim($message_string, ' ,');
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/TextEditorObjectDependentValidatorTrait.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/TextEditorObjectDependentValidatorTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..63bf2f0dad60cf5ca086ba13bdafc7f9fb39409e
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/TextEditorObjectDependentValidatorTrait.php
@@ -0,0 +1,55 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\editor\EditorInterface;
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\filter\FilterFormatInterface;
+
+/**
+ * Some CKEditor 5 constraint validators need a Text Editor object.
+ */
+trait TextEditorObjectDependentValidatorTrait {
+
+  /**
+   * Creates a text editor object from the execution context.
+   *
+   * Works both for an individual text editor config entity and a pair.
+   *
+   * @return \Drupal\editor\EditorInterface
+   *   A text editor object, with the text format pre-populated.
+   */
+  private function createTextEditorObjectFromContext(): EditorInterface {
+    if ($this->context->getRoot()->getDataDefinition()->getDataType() === 'ckeditor5_valid_pair__format_and_editor') {
+      $text_format = FilterFormat::create([
+        'filters' => $this->context->getRoot()->get('filters')->toArray(),
+      ]);
+    }
+    else {
+      assert($this->context->getRoot()->getDataDefinition()->getDataType() === 'editor.editor.*');
+      $text_format = FilterFormat::load($this->context->getRoot()->get('format')->getValue());
+    }
+    assert($text_format instanceof FilterFormatInterface);
+
+    $text_editor = Editor::create([
+      'editor' => 'ckeditor5',
+      'settings' => $this->context->getRoot()->get('settings')->toArray(),
+      'image_upload' => $this->context->getRoot()->get('image_upload')->toArray(),
+      // Specify `filterFormat` to ensure that the generated Editor config
+      // entity object already has the $filterFormat property set, to prevent
+      // calls to Editor::hasAssociatedFilterFormat() and
+      // Editor::getFilterFormat() from loading the FilterFormat from storage.
+      // As far as this validation constraint validator is concerned, the
+      // concrete FilterFormat entity ID does not matter, all that matters is
+      // its filter configuration. Those exist in $text_format.
+      'filterFormat' => $text_format,
+    ]);
+    assert($text_editor instanceof EditorInterface);
+
+    return $text_editor;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConditionsMetConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConditionsMetConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..37dad3ce6f955b0dee0ae4c81e6e21aaeb0ad545
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConditionsMetConstraint.php
@@ -0,0 +1,49 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * A (placed) CKEditor 5 toolbar item's conditions must be met.
+ *
+ * @Constraint(
+ *   id = "CKEditor5ToolbarItemConditionsMet",
+ *   label = @Translation("CKEditor 5 toolbar item conditions must be met", context = "Validation"),
+ * )
+ *
+ * @internal
+ */
+class ToolbarItemConditionsMetConstraint extends Constraint {
+
+  /**
+   * The violation message when the required image upload status is not set.
+   *
+   * @var string
+   */
+  public $imageUploadStatusRequiredMessage = 'The %toolbar_item toolbar item requires image uploads to be enabled.';
+
+  /**
+   * The violation message when a required filter is missing.
+   *
+   * @var string
+   */
+  public $filterRequiredMessage = 'The %toolbar_item toolbar item requires the %filter filter to be enabled.';
+
+  /**
+   * The violation message when 1 required plugin is missing.
+   *
+   * @var string
+   */
+  public $singleMissingRequiredPluginMessage = 'The %toolbar_item toolbar item requires the %plugin plugin to be enabled.';
+
+  /**
+   * The violation message when >1 required plugin is missing.
+   *
+   * @var string
+   */
+  public $multipleMissingRequiredPluginMessage = 'The %toolbar_item toolbar item requires the %plugins plugins to be enabled.';
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConditionsMetConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConditionsMetConstraintValidator.php
new file mode 100644
index 0000000000000000000000000000000000000000..1987c862b4f6aba91485ed644848f184c4eef1f1
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConditionsMetConstraintValidator.php
@@ -0,0 +1,137 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Toolbar item conditions met constraint validator.
+ *
+ * @internal
+ */
+class ToolbarItemConditionsMetConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface {
+
+  use PluginManagerDependentValidatorTrait;
+  use TextEditorObjectDependentValidatorTrait;
+
+  /**
+   * {@inheritdoc}
+   *
+   * @throws \Symfony\Component\Validator\Exception\UnexpectedTypeException
+   *   Thrown when the given constraint is not supported by this validator.
+   */
+  public function validate($toolbar_item, Constraint $constraint) {
+    if (!$constraint instanceof ToolbarItemConditionsMetConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\ToolbarItemConditionsMetConstraint');
+    }
+
+    try {
+      $definition = $this->findDefinitionForToolbarItem($toolbar_item);
+    }
+    catch (\OutOfBoundsException $e) {
+      // No plugin definition found for this toolbar item. It's the
+      // responsibility of another validation constraint to raise this problem.
+      // @see \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemConstraint
+      return;
+    }
+
+    // If there are no conditions, there is nothing to validate.
+    if (!$definition->hasConditions()) {
+      return;
+    }
+
+    $toolbar_item_label = $definition->getToolbarItems()[$toolbar_item]['label'];
+    $text_editor = $this->createTextEditorObjectFromContext();
+
+    $conditions = $definition->getConditions();
+    foreach ($conditions as $condition_type => $required_value) {
+      switch ($condition_type) {
+        case 'toolbarItem':
+          // Nothing to validate.
+          break;
+
+        case 'imageUploadStatus':
+          $image_upload_settings = $text_editor->getImageUploadSettings();
+          if (!isset($image_upload_settings['status']) || (bool) $image_upload_settings['status'] !== TRUE) {
+            $this->context->buildViolation($constraint->imageUploadStatusRequiredMessage)
+              ->setParameter('%toolbar_item', $toolbar_item_label)
+              ->setInvalidValue($toolbar_item)
+              ->addViolation();
+          }
+          break;
+
+        case 'filter':
+          $filters = $text_editor->getFilterFormat()->filters();
+          if (!$filters->has($required_value) || !$filters->get($required_value)->status) {
+            $filter_label = $filters->has($required_value)
+              ? $filters->get($required_value)->getLabel()
+              : $required_value;
+            $this->context->buildViolation($constraint->filterRequiredMessage)
+              ->setParameter('%toolbar_item', $toolbar_item_label)
+              ->setParameter('%filter', $filter_label)
+              ->setInvalidValue($toolbar_item)
+              ->addViolation();
+          }
+          break;
+
+        case 'plugins':
+          $enabled_definitions = $this->pluginManager->getEnabledDefinitions($text_editor);
+          if (!array_key_exists($definition->id(), $enabled_definitions)) {
+            $required_plugin_ids = $definition->getConditions()['plugins'];
+            $missing_plugin_ids = array_diff($required_plugin_ids, array_keys($enabled_definitions));
+            $all_plugins = $this->pluginManager->getDefinitions();
+            $missing_plugin_labels = array_map(function (string $plugin_id) use ($all_plugins): TranslatableMarkup {
+              return !array_key_exists($plugin_id, $all_plugins)
+                ? $plugin_id
+                : $all_plugins[$plugin_id]->label();
+            }, $missing_plugin_ids);
+            if (count($missing_plugin_ids) === 1) {
+              $message = $constraint->singleMissingRequiredPluginMessage;
+              $parameter = '%plugin';
+            }
+            else {
+              $message = $constraint->multipleMissingRequiredPluginMessage;
+              $parameter = '%plugins';
+            }
+            $this->context->buildViolation($message)
+              ->setParameter('%toolbar_item', $toolbar_item_label)
+              ->setParameter($parameter, implode(', ', $missing_plugin_labels))
+              ->setInvalidValue($toolbar_item)
+              ->addViolation();
+          }
+          break;
+      }
+    }
+  }
+
+  /**
+   * Searches for CKEditor 5 plugin that provides a given toolbar item.
+   *
+   * @param string $toolbar_item
+   *   The toolbar item to be searched for within plugin definitions.
+   *
+   * @return \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition
+   *   The corresponding plugin definition.
+   *
+   * @throws \OutOfBoundsException
+   */
+  protected function findDefinitionForToolbarItem(string $toolbar_item): CKEditor5PluginDefinition {
+    $definitions = $this->pluginManager->getDefinitions();
+    foreach ($definitions as $definition) {
+      if (array_key_exists($toolbar_item, $definition->getToolbarItems())) {
+        return $definition;
+      }
+    }
+
+    // @see \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemConstraint
+    throw new \OutOfBoundsException("Toolbar item '$toolbar_item' not found.");
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..9c31b259fa0980e66c492358663346ac2c02a96d
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConstraint.php
@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * A CKEditor 5 toolbar item.
+ *
+ * @Constraint(
+ *   id = "CKEditor5ToolbarItem",
+ *   label = @Translation("CKEditor 5 toolbar item", context = "Validation"),
+ * )
+ *
+ * @see https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/toolbar.html
+ */
+class ToolbarItemConstraint extends Constraint {
+
+  /**
+   * The default violation message.
+   *
+   * @var string
+   */
+  public $message = 'The provided toolbar item %toolbar_item is not valid.';
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConstraintValidator.php
new file mode 100644
index 0000000000000000000000000000000000000000..d669a85d1d575125e7ccb7975de2d956c19fc93b
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConstraintValidator.php
@@ -0,0 +1,70 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Toolbar item constraint validator.
+ *
+ * @internal
+ */
+class ToolbarItemConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface {
+
+  use PluginManagerDependentValidatorTrait;
+
+  /**
+   * {@inheritdoc}
+   *
+   * @throws \Symfony\Component\Validator\Exception\UnexpectedTypeException
+   *   Thrown when the given constraint is not supported by this validator.
+   */
+  public function validate($toolbar_item, Constraint $constraint) {
+    if (!$constraint instanceof ToolbarItemConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\ToolbarItem');
+    }
+
+    if ($toolbar_item === NULL) {
+      return;
+    }
+
+    if (!static::isValidToolbarItem($toolbar_item)) {
+      $this->context->buildViolation($constraint->message)
+        ->setParameter('%toolbar_item', $toolbar_item)
+        ->setInvalidValue($toolbar_item)
+        ->addViolation();
+    }
+  }
+
+  /**
+   * Validates the given toolbar item.
+   *
+   * @param string $toolbar_item
+   *   A toolbar item as expected by CKEditor 5.
+   *
+   * @return bool
+   *   Whether the given toolbar item is valid or not.
+   */
+  protected function isValidToolbarItem(string $toolbar_item): bool {
+    // Special case: the toolbar group separator.
+    // @see https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/toolbar.html#separating-toolbar-items
+    if ($toolbar_item === '|') {
+      return TRUE;
+    }
+
+    // Special case: the breakpoint separator.
+    // @see https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/toolbar.html#explicit-wrapping-breakpoint
+    if ($toolbar_item === '-') {
+      return TRUE;
+    }
+
+    $available_toolbar_items = array_keys($this->pluginManager->getToolbarItems());
+    return in_array($toolbar_item, $available_toolbar_items, TRUE);
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemDependencyConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemDependencyConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..50d099bf4249b9d3d58bd5f8dd16b3f27ef0462d
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemDependencyConstraint.php
@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * A CKEditor 5 toolbar item.
+ *
+ * @Constraint(
+ *   id = "CKEditor5ToolbarItemDependencyConstraint",
+ *   label = @Translation("CKEditor 5 toolbar item dependency", context = "Validation"),
+ * )
+ *
+ * @internal
+ */
+class ToolbarItemDependencyConstraint extends Constraint {
+
+  /**
+   * The default violation message.
+   *
+   * @var string
+   */
+  public $message = 'Depends on %toolbar_item, which is not enabled.';
+
+  /**
+   * The toolbar item that this validation constraint requires to be enabled.
+   *
+   * @var null|string
+   */
+  public $toolbarItem = NULL;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRequiredOptions() {
+    return ['toolbarItem'];
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemDependencyConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemDependencyConstraintValidator.php
new file mode 100644
index 0000000000000000000000000000000000000000..b3fffe5ff53a16b331b3b12a795c131c06dc4562
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemDependencyConstraintValidator.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Toolbar item dependency constraint validator.
+ *
+ * @internal
+ */
+class ToolbarItemDependencyConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface {
+
+  use PluginManagerDependentValidatorTrait;
+
+  /**
+   * {@inheritdoc}
+   *
+   * @throws \Symfony\Component\Validator\Exception\UnexpectedTypeException
+   *   Thrown when the given constraint is not supported by this validator.
+   */
+  public function validate($toolbar_item, Constraint $constraint) {
+    if (!$constraint instanceof ToolbarItemDependencyConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\ToolbarItemDependency');
+    }
+
+    $toolbar_items = $this->context->getRoot()->get('settings.toolbar.items')->toArray();
+    if (!in_array($constraint->toolbarItem, $toolbar_items, TRUE)) {
+      $this->context->buildViolation($constraint->message)
+        ->setParameter('%toolbar_item', $constraint->toolbarItem)
+        ->addViolation();
+    }
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/SmartDefaultSettings.php b/core/modules/ckeditor5/src/SmartDefaultSettings.php
new file mode 100644
index 0000000000000000000000000000000000000000..0fb8adabf11b22cd8261b1b5a93da45b51be9c6b
--- /dev/null
+++ b/core/modules/ckeditor5/src/SmartDefaultSettings.php
@@ -0,0 +1,663 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5;
+
+use Drupal\ckeditor\CKEditorPluginButtonsInterface;
+use Drupal\ckeditor\CKEditorPluginContextualInterface;
+use Drupal\ckeditor\CKEditorPluginManager;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginElementsSubsetInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface;
+use Drupal\Component\Plugin\PluginManagerInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\editor\EditorInterface;
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\FilterFormatInterface;
+
+/**
+ * Generates CKEditor 5 settings for existing text editors/formats.
+ *
+ * @internal
+ *   This class may change at any time. It is not for use outside this module.
+ */
+final class SmartDefaultSettings {
+
+  use StringTranslationTrait;
+
+  /**
+   * The CKEditor 5 plugin manager.
+   *
+   * @var \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+   */
+  protected $pluginManager;
+
+  /**
+   * The CKEditor 4 to 5 upgrade plugin manager.
+   *
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $upgradePluginManager;
+
+  /**
+   * The "CKEditor 4 plugin" plugin manager.
+   *
+   * @var \Drupal\ckeditor\CKEditorPluginManager
+   */
+  protected $cke4PluginManager;
+
+  /**
+   * Constructs a SmartDefaultSettings object.
+   *
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface $plugin_manager
+   *   The CKEditor 5 plugin manager.
+   * @param \Drupal\Component\Plugin\PluginManagerInterface $upgrade_plugin_manager
+   *   The CKEditor 4 to 5 upgrade plugin manager.
+   * @param \Drupal\ckeditor\CKEditorPluginManager $cke4_plugin_manager
+   *   The CKEditor 4 plugin manager.
+   */
+  public function __construct(CKEditor5PluginManagerInterface $plugin_manager, PluginManagerInterface $upgrade_plugin_manager, CKEditorPluginManager $cke4_plugin_manager = NULL) {
+    $this->pluginManager = $plugin_manager;
+    $this->upgradePluginManager = $upgrade_plugin_manager;
+    $this->cke4PluginManager = $cke4_plugin_manager;
+  }
+
+  /**
+   * Computes the closest possible equivalent settings for switching to CKEditor 5.
+   *
+   * @param \Drupal\editor\EditorInterface|null $text_editor
+   *   The editor being reconfigured for CKEditor 5 to match the CKEditor 4
+   *   settings as closely as possible (if it was using CKEditor 4).
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The text format for which to compute smart default settings.
+   *
+   * @return array
+   *   An array with two values:
+   *   1. The cloned config entity with settings modified for CKEditor 5 … or a
+   *      completely new config entity if this text format did not yet have one.
+   *   2. Messages explaining what conclusions were reached.
+   *
+   * @throws \InvalidArgumentException
+   *   Thrown when computing smart default settings for a new text format, or
+   *   when the given text editor and format do not form a pair.
+   */
+  public function computeSmartDefaultSettings(?EditorInterface $text_editor, FilterFormatInterface $text_format): array {
+    if ($text_format->isNew()) {
+      throw new \InvalidArgumentException('Smart default settings can only be computed when there is a pre-existing text format.');
+    }
+    if ($text_editor && $text_editor->id() !== $text_format->id()) {
+      throw new \InvalidArgumentException('The given text editor and text format must form a pair.');
+    }
+
+    $messages = [];
+
+    // Ensure that unsaved changes to the text format object are also respected.
+    if ($text_editor) {
+      // Overwrite the Editor config entity object's $filterFormat property, to
+      // prevent calls to Editor::hasAssociatedFilterFormat() and
+      // Editor::getFilterFormat() from loading the FilterFormat from storage.
+      // @todo Remove in https://www.drupal.org/project/ckeditor5/issues/3218985.
+      $reflector = new \ReflectionObject($text_editor);
+      $property = $reflector->getProperty('filterFormat');
+      $property->setAccessible(TRUE);
+      $property->setValue($text_editor, $text_format);
+    }
+
+    // When there is a pre-existing text editor, pass that. Otherwise, generate
+    // an empty shell of a text editor config entity — this will then
+    // automatically get the default CKEditor 5 settings.
+    // @todo Update after https://www.drupal.org/project/drupal/issues/3226673.
+    /** @var \Drupal\editor\Entity\Editor $editor */
+    $editor = $text_editor !== NULL
+      ? clone $text_editor
+      : Editor::create([
+        'format' => $text_format->id(),
+        // @see \Drupal\editor\Entity\Editor::__construct()
+        // @see \Drupal\ckeditor5\Plugin\Editor\CKEditor5::getDefaultSettings()
+        'editor' => 'ckeditor5',
+      ]);
+    $editor->setEditor('ckeditor5');
+
+    // Compute the appropriate settings based on the CKEditor 4 configuration
+    // if it exists.
+    $old_editor = $editor->id() ? Editor::load($editor->id()) : NULL;
+    if ($old_editor && $old_editor->getEditor() === 'ckeditor') {
+      $enabled_cke4_plugins = $this->getEnabledCkeditor4Plugins($old_editor);
+      [$upgraded_settings, $messages] = $this->createSettingsFromCKEditor4($old_editor->getSettings(), $enabled_cke4_plugins);
+      $editor->setSettings($upgraded_settings);
+      $editor->setImageUploadSettings($old_editor->getImageUploadSettings());
+    }
+
+    // First, add toolbar items based on HTML tags.
+    // NOTE: Helper updates $editor->settings by reference and returns info for the message.
+    $result = $this->addToolbarItemsToMatchHtmlTagsInFormat($text_format, $editor);
+    if ($result !== NULL) {
+      [$enabling_message_content, $unsupported] = $result;
+      if ($enabling_message_content) {
+        $messages[] = $this->t('The following plugins were enabled to support tags that are allowed by this text format: %enabling_message_content.',
+          ['%enabling_message_content' => $enabling_message_content],
+        );
+      }
+      unset($unsupported['*']);
+      // Warn user about unsupported tags.
+      if (!empty($unsupported)) {
+        $unsupported_string = implode(' ', HTMLRestrictionsUtilities::toReadableElements($unsupported));
+        $this->addTagsToSourceEditing($editor, $unsupported_string);
+        $messages[] = $this->t("The following tags were permitted by this format's filter configuration, but no plugin was available that supports them. To ensure the tags remain supported by this text format, the following were added to the Source Editing plugin's <em>Manually editable HTML tags</em>: @unsupported_string.", [
+          '@unsupported_string' => $unsupported_string,
+        ]);
+      }
+    }
+
+    // Next, add more toolbar items to try to also support attributes on already
+    // supported tags that have still unsupported attributes.
+    $result = $this->addToolbarItemsToMatchHtmlAttributesInFormat($text_format, $editor);
+    if ($result !== NULL) {
+      [$enabled_for_attributes_message_content, $missing_attributes] = $result;
+      if ($enabled_for_attributes_message_content) {
+        $messages[] = $this->t('The following plugins were enabled to support specific attributes that are allowed by this text format: %enabled_for_attributes_message_content.',
+          ['%enabled_for_attributes_message_content' => $enabled_for_attributes_message_content],
+        );
+      }
+      // Warn user about supported tags but missing attributes.
+      if ($missing_attributes) {
+        $this->addTagsToSourceEditing($editor, $missing_attributes);
+        $messages[] = $this->t("This format's HTML filters includes plugins that support the following tags, but not some of their attributes. To ensure these attributes remain supported by this text format, the following were added to the Source Editing plugin's <em>Manually editable HTML tags</em>: @missing_attributes.", [
+          '@missing_attributes' => $missing_attributes,
+        ]);
+      }
+    }
+
+    // Finally: for all enabled plugins, find the ones that are configurable,
+    // and add their default settings. For enabled plugins with element subsets,
+    // compute the appropriate settings to achieve the subset that matches the
+    // original text format restrictions.
+    $this->addDefaultSettingsForEnabledConfigurablePlugins($editor);
+    $this->computeSubsetSettingForEnabledPluginsWithSubsets($editor, $text_format);
+
+    return [$editor, $messages];
+  }
+
+  private function addTagsToSourceEditing(EditorInterface $editor, string $tags): array {
+    $messages = [];
+    $settings = $editor->getSettings();
+    if (!isset($settings['toolbar']['items']) || !in_array('sourceEditing', $settings['toolbar']['items'])) {
+      $messages[] = $this->t('The <em>Source Editing</em> plugin was enabled to support tags and/or attributes that are not explicitly supported by any available CKEditor 5 plugins.');
+      $settings['toolbar']['items'][] = 'sourceEditing';
+    }
+    $source_editing_allowed_tags = $settings['plugins']['ckeditor5_sourceEditing']['allowed_tags'] ?? [];
+    $settings['plugins']['ckeditor5_sourceEditing']['allowed_tags'] = array_merge($source_editing_allowed_tags, HTMLRestrictionsUtilities::allowedElementsStringToPluginElementsArray($tags));
+    $editor->setSettings($settings);
+    return $messages;
+  }
+
+  /**
+   * Creates equivalent CKEditor 5 settings from CKEditor 4 settings.
+   *
+   * @param array $ckeditor4_settings
+   *   The value for "settings" in a Text Editor config entity configured to use
+   *   CKEditor 4.
+   * @param string[] $enabled_ckeditor4_plugins
+   *   The list of enabled CKEditor 4 plugins: their settings will be mapped to
+   *   the CKEditor 5 equivalents, if they have any.
+   *
+   * @return array
+   *   An array with two values:
+   *   1. An equivalent value for CKEditor 5.
+   *   2. Messages explaining upgrade path issues.
+   *
+   * @throws \LogicException
+   *   Thrown when an upgrade plugin is attempting to generate plugin settings
+   *   for a CKEditor 4 plugin upgrade path that have already been generated.
+   */
+  private function createSettingsFromCKEditor4(array $ckeditor4_settings, array $enabled_ckeditor4_plugins): array {
+    $settings = [
+      'toolbar' => [
+        'items' => [],
+      ],
+      'plugins' => [],
+    ];
+    $messages = [];
+
+    // First: toolbar items.
+    // @see \Drupal\ckeditor\CKEditorPluginButtonsInterface
+    foreach ($ckeditor4_settings['toolbar']['rows'] as $row) {
+      foreach ($row as $group) {
+        $some_added = FALSE;
+        foreach ($group['items'] as $cke4_button) {
+          try {
+            $equivalent = $this->upgradePluginManager->mapCKEditor4ToolbarButtonToCKEditor5ToolbarItem($cke4_button);
+          }
+          catch (\OutOfBoundsException $e) {
+            $messages[] = $this->t('The CKEditor 4 button %button does not have a known upgrade path. If it allowed editing markup, then you can do so now through the Source Editing functionality.', [
+              '%button' => $cke4_button,
+            ]);
+            continue;
+          }
+          if ($equivalent) {
+            $settings['toolbar']['items'][] = $equivalent;
+            $some_added = TRUE;
+          }
+        }
+        // Add a CKEditor 5 toolbar group separator for every group.
+        if ($some_added) {
+          $settings['toolbar']['items'][] = '|';
+        }
+      }
+    }
+    // Remove the trailing CKEditor 5 toolbar group separator.
+    array_pop($settings['toolbar']['items']);
+    // Strip the CKEditor 4 buttons without a CKEditor 5 equivalent.
+    $settings['toolbar']['items'] = array_filter($settings['toolbar']['items']);
+
+    // Second: plugin settings.
+    // @see \Drupal\ckeditor\CKEditorPluginConfigurableInterface
+    $enabled_ckeditor4_plugins_with_settings = array_intersect_key($ckeditor4_settings['plugins'], array_flip($enabled_ckeditor4_plugins));
+    foreach ($enabled_ckeditor4_plugins_with_settings as $cke4_plugin_id => $cke4_plugin_settings) {
+      try {
+        $cke5_plugin_settings = $this->upgradePluginManager->mapCKEditor4SettingsToCKEditor5Configuration($cke4_plugin_id, $cke4_plugin_settings);
+        if ($cke5_plugin_settings === NULL) {
+          continue;
+        }
+        assert(count($cke5_plugin_settings) === 1);
+        $cke5_plugin_id = array_keys($cke5_plugin_settings)[0];
+        if (isset($settings['plugins'][$cke5_plugin_id])) {
+          throw new \LogicException(sprintf('The %s plugin settings have already been upgraded. Only a single @CKEditor4To5Upgrade is allowed to migrate the settings for a particular CKEditor 4 plugin.', $cke5_plugin_id));
+        }
+        $settings['plugins'] += $cke5_plugin_settings;
+      }
+      catch (\OutOfBoundsException $e) {
+        $messages[] = $this->t('The %cke4_plugin_id plugin settings do not have a known upgrade path.', [
+          '%cke4_plugin_id' => $cke4_plugin_id,
+        ]);
+        continue;
+      }
+    }
+
+    return [$settings, $messages];
+  }
+
+  /**
+   * Gets all enabled CKEditor 4 plugins.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A text editor config entity configured to use CKEditor 4.
+   *
+   * @return string[]
+   *   The enabled CKEditor 4 plugin IDs.
+   */
+  protected function getEnabledCkeditor4Plugins(EditorInterface $editor): array {
+    assert($editor->getEditor() === 'ckeditor');
+
+    // This is largely copied from the CKEditor 4 plugin manager, because it
+    // unfortunately does not provide the API this needs.
+    // @see \Drupal\ckeditor\CKEditorPluginManager::getEnabledPluginFiles()
+    $plugins = array_keys($this->cke4PluginManager->getDefinitions());
+    $toolbar_buttons = $this->cke4PluginManager->getEnabledButtons($editor);
+    $enabled_plugins = [];
+    $additional_plugins = [];
+    foreach ($plugins as $plugin_id) {
+      $plugin = $this->cke4PluginManager->createInstance($plugin_id);
+
+      $enabled = FALSE;
+      // Enable this plugin if it provides a button that has been enabled.
+      if ($plugin instanceof CKEditorPluginButtonsInterface) {
+        $plugin_buttons = array_keys($plugin->getButtons());
+        $enabled = (count(array_intersect($toolbar_buttons, $plugin_buttons)) > 0);
+      }
+      // Otherwise enable this plugin if it declares itself as enabled.
+      if (!$enabled && $plugin instanceof CKEditorPluginContextualInterface) {
+        $enabled = $plugin->isEnabled($editor);
+      }
+
+      if ($enabled) {
+        $enabled_plugins[] = $plugin_id;
+        // Check if this plugin has dependencies that also need to be enabled.
+        $additional_plugins = array_merge($additional_plugins, array_diff($plugin->getDependencies($editor), $additional_plugins));
+      }
+    }
+
+    // Add the list of dependent plugins.
+    foreach ($additional_plugins as $plugin_id) {
+      $enabled_plugins[$plugin_id] = $plugin_id;
+    }
+
+    return $enabled_plugins;
+  }
+
+  /**
+   * Adds CKEditor 5 toolbar items to match the format's HTML tags.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $format
+   *   The text format for which to compute smart default settings.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   The text editor config entity to update.
+   *
+   * @return array|null
+   *   NULL when nothing happened, otherwise an array with two values:
+   *   1. a description (for use in a message) of which CKEditor 5 plugins were
+   *      enabled to match the HTML tags allowed by the text format.
+   *   2. the unsupported tags
+   */
+  private function addToolbarItemsToMatchHtmlTagsInFormat(FilterFormatInterface $format, EditorInterface $editor): ?array {
+    $html_restrictions_needed_elements = $format->getHtmlRestrictions();
+    if ($html_restrictions_needed_elements === FALSE) {
+      return NULL;
+    }
+
+    // Add all buttons until we match or exceed the current text format
+    // restrictions.
+    $enabled_plugins = array_keys($this->pluginManager->getEnabledDefinitions($editor));
+    $provided_elements = $this->pluginManager->getProvidedElements($enabled_plugins);
+
+    // Automatically add the plugins that add support for the tags we want this
+    // CKEditor 5 instance to support.
+    $missing_tags = array_diff(array_keys($html_restrictions_needed_elements['allowed']), array_keys($provided_elements));
+    $to_add = [];
+    $unsupported = [];
+    foreach ($missing_tags as $tag) {
+      $id = $this->pluginManager->findPluginSupportingElement($tag);
+      if ($id) {
+        $to_add[$tag] = $id;
+      }
+      // Add any tag that isn't the "star protector" tag to the array of
+      // unsupported tags.
+      // @see the $star_protector variable in
+      // \Drupal\filter\Plugin\Filter\FilterHtml::getHTMLRestrictions
+      // @todo this can be an 'else' with no conditions after
+      // https://www.drupal.org/project/drupal/issues/3226368
+      elseif ($tag !== '__zqh6vxfbk3cg__') {
+        $unsupported[$tag] = $html_restrictions_needed_elements['allowed'][$tag];
+      }
+    }
+
+    $enabling_message_content = '';
+    $enabling_message_prep = [];
+    foreach ($to_add as $tag_name => $plugin_name) {
+      $enabling_message_prep[$plugin_name][] = $tag_name;
+    }
+
+    $editor_settings_to_update = $editor->getSettings();
+    $new_group_created = FALSE;
+    foreach ($enabling_message_prep as $plugin_id => $tag_names) {
+      $label = $this->pluginManager->getDefinition($plugin_id)->label();
+      $tags = array_reduce($tag_names, function ($carry, $item) {
+        return $carry . "<$item>";
+      });
+      $enabling_message_content .= "$label (for tags: $tags) ";
+      $definition = $this->pluginManager->getDefinition($plugin_id);
+      if ($definition->hasToolbarItems()) {
+        if (!$new_group_created) {
+          $editor_settings_to_update['toolbar']['items'][] = '|';
+          $new_group_created = TRUE;
+        }
+        $editor_settings_to_update['toolbar']['items'] = array_merge($editor_settings_to_update['toolbar']['items'], array_keys($definition->getToolbarItems()));
+      }
+    }
+
+    if (!empty($enabling_message_content)) {
+      $editor->setSettings($editor_settings_to_update);
+      $enabling_message_content = substr($enabling_message_content, 0, -1);
+      return [$enabling_message_content, $unsupported];
+    }
+    else {
+      return [NULL, $unsupported];
+    }
+  }
+
+  /**
+   * Adds CKEditor 5 toolbar items to match the format's HTML attributes.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $format
+   *   The text format for which to compute smart default settings.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   The text editor config entity to update.
+   *
+   * @return array|null
+   *   NULL when nothing happened, otherwise an array with two values:
+   *   1. a description (for use in a message) of which CKEditor 5 plugins were
+   *      enabled to match the HTML attributes allowed by the text format.
+   *   2. the unsupported attributes
+   */
+  private function addToolbarItemsToMatchHtmlAttributesInFormat(FilterFormatInterface $format, EditorInterface $editor): ?array {
+    $html_restrictions_needed_elements = $format->getHtmlRestrictions();
+    if ($html_restrictions_needed_elements === FALSE) {
+      return NULL;
+    }
+
+    $enabled_plugins = array_keys($this->pluginManager->getEnabledDefinitions($editor));
+    $provided_elements = $this->pluginManager->getProvidedElements($enabled_plugins);
+    $missing = HTMLRestrictionsUtilities::diffAllowedElements($editor->getFilterFormat()->getHtmlRestrictions()['allowed'], $provided_elements);
+    $supported_tags_with_unsupported_attributes = array_intersect_key($missing, $provided_elements);
+    $supported_tags_with_unsupported_attributes = array_filter($supported_tags_with_unsupported_attributes, function ($tag_config) {
+      return is_array($tag_config);
+    });
+
+    if (!empty($supported_tags_with_unsupported_attributes)) {
+      // This will be populated with plugins that aren't currently enabled, but
+      // provide element configuration that include attributes. I.e. they are
+      // the only plugins that can potentially address unsupported attributes
+      // in supported tags.
+      $disabled_plugins_with_attribute_config = [];
+      $all_plugins_definitions = $this->pluginManager->getDefinitions();
+      foreach ($all_plugins_definitions as $plugin_id => $definition) {
+        // Only proceed if the plugin has configured elements and the plugin
+        // does not have conditions. In the future we could add support for
+        // automatically enabling filters, but for now we assume that the filter
+        // configuration cannot be modified.
+        if (!in_array($plugin_id, $enabled_plugins) && !$definition->hasConditions()) {
+          $plugins_provided_elements = $this->pluginManager->getProvidedElements([$plugin_id], NULL, TRUE);
+          if (!empty($plugins_provided_elements)) {
+            // Filter elements that do not have attribute configuration.
+            $elements_with_attribute_config = array_filter($plugins_provided_elements, function ($elements) {
+              return $elements !== FALSE;
+            });
+            if (!empty($elements_with_attribute_config)) {
+              foreach ($elements_with_attribute_config as $tag_name => $attribute_config) {
+                // If the 'tag' is a wildcard, add the attribute config to
+                // all qualifying tags.
+                if (substr($tag_name, 0, 1) === '$') {
+                  // An array of all the tags that match the wildcard value.
+                  $wildcard_tags = HTMLRestrictionsUtilities::getWildcardTags($tag_name);
+
+                  // Matching wildcard tags that are also tags that have
+                  // attribute config that is not yet supported.
+                  $wildcard_tags_in_config_missing_attributes = array_intersect_key(array_flip($wildcard_tags), $supported_tags_with_unsupported_attributes);
+                  foreach (array_keys($wildcard_tags_in_config_missing_attributes) as $wildcard_provided_tag) {
+                    $elements_with_attribute_config[$wildcard_provided_tag] = $attribute_config;
+                  }
+
+                  // Remove the wildcard 'tag', as the tags it represents are
+                  // now accounted for.
+                  unset($elements_with_attribute_config[$tag_name]);
+                }
+              }
+              $disabled_plugins_with_attribute_config[$plugin_id] = $elements_with_attribute_config;
+            }
+          }
+        }
+      }
+
+      // This will contain plugins to be enabled if they provide support for the
+      // not-yet-supported attributes.
+      $plugins_to_enable_to_support_attribute_config = [];
+      foreach ($supported_tags_with_unsupported_attributes as $tag_name => $attributes_config) {
+        foreach ($attributes_config as $attribute_name => $attribute_config) {
+          // This means the existing config must allow all values of the
+          // attribute.
+          if ($attribute_config === TRUE) {
+            // See if there is a disabled plugin that will provide full use of
+            // the attribute for a given tag.
+            foreach ($disabled_plugins_with_attribute_config as $disabled_plugin_id => $disabled_plugin_elements_config) {
+              if (isset($disabled_plugin_elements_config[$tag_name][$attribute_name]) && $disabled_plugin_elements_config[$tag_name][$attribute_name] === TRUE) {
+                // Add this to the 'plugins to enable' array. Setting this value
+                // to TRUE instead of an array indicates to the message system
+                // that the attribute is allowed for the tag with any value.
+                $plugins_to_enable_to_support_attribute_config[$disabled_plugin_id][$attribute_name][$tag_name] = TRUE;
+
+                // This attribute can be removed from the list of unsupported
+                // attributes for the tag.
+                unset($supported_tags_with_unsupported_attributes[$tag_name][$attribute_name]);
+              }
+            }
+          }
+          else {
+            // This condition is reached if the existing configuration has the
+            // attribute value restricted to specific values.
+            // @todo currently, this will enable plugins that allow ALL values
+            //   for an attribute. This means the attribute+value is now allowed
+            //   but additional attribute values are permitted as well. This may
+            //   need to be more selective
+            //   https://www.drupal.org/project/ckeditor5/issues/3231328.
+            foreach ($attribute_config as $allowed_attribute_value => $noop) {
+              foreach ($disabled_plugins_with_attribute_config as $disabled_plugin_id => $disabled_plugin_config) {
+                if (isset($disabled_plugin_config[$tag_name][$attribute_name])) {
+                  if ($disabled_plugin_config[$tag_name][$attribute_name] === TRUE) {
+                    unset($supported_tags_with_unsupported_attributes[$tag_name][$attribute_name]);
+                    $plugins_to_enable_to_support_attribute_config[$disabled_plugin_id][$attribute_name][$tag_name] = TRUE;
+                  }
+                  elseif (is_array($disabled_plugin_config[$tag_name][$attribute_name])) {
+                    foreach ($disabled_plugin_config[$tag_name][$attribute_name] as $disabled_plugin_attribute_name => $disabled_plugin_allowed_value) {
+                      if ($disabled_plugin_attribute_name === $allowed_attribute_value) {
+                        unset($supported_tags_with_unsupported_attributes[$tag_name][$attribute_name][$allowed_attribute_value]);
+                        if (empty($supported_tags_with_unsupported_attributes[$tag_name][$attribute_name])) {
+                          unset($supported_tags_with_unsupported_attributes[$tag_name][$attribute_name]);
+                        }
+                        $plugins_to_enable_to_support_attribute_config[$disabled_plugin_id][$attribute_name][$tag_name][] = $allowed_attribute_value;
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+
+      $supported_tags_with_unsupported_attributes = array_filter($supported_tags_with_unsupported_attributes);
+      $missing_attributes = implode(' ', HTMLRestrictionsUtilities::toReadableElements($supported_tags_with_unsupported_attributes));
+
+      // If additional plugins need to be enable to support attribute config,
+      // loop through the list to enable the plugins and build a UI message that
+      // will convey this plugin-enabling to the user.
+      if (!empty($plugins_to_enable_to_support_attribute_config)) {
+        $enabled_for_attributes_message_content = '';
+        $editor_settings_to_update = $editor->getSettings();
+        foreach ($plugins_to_enable_to_support_attribute_config as $plugin_id => $reason_why_enabled) {
+          $plugin_definition = $this->pluginManager->getDefinition($plugin_id);
+          $label = $plugin_definition->label();
+          if ($plugin_definition->hasToolbarItems()) {
+            $editor_settings_to_update['toolbar']['items'] = array_merge($editor_settings_to_update['toolbar']['items'], array_keys($plugin_definition->getToolbarItems()));
+            foreach ($reason_why_enabled as $attribute_name => $attribute_config) {
+              $enabled_for_attributes_message_content .= "$label (";
+              foreach ($attribute_config as $tag_name => $attribute_value_config) {
+                $enabled_for_attributes_message_content .= " for tag: <$tag_name> to support: $attribute_name";
+                if (is_array($attribute_value_config)) {
+                  $enabled_for_attributes_message_content .= " with value(s): ";
+                  foreach ($attribute_value_config as $allowed_value) {
+                    $enabled_for_attributes_message_content .= " $allowed_value,";
+                  }
+                  $enabled_for_attributes_message_content = substr($enabled_for_attributes_message_content, 0, -1) . '), ';
+                }
+              }
+            }
+          }
+        }
+        $editor->setSettings($editor_settings_to_update);
+        // Some plugins enabled, maybe some missing attributes.
+        return [
+          substr($enabled_for_attributes_message_content, 0, -2),
+          $missing_attributes,
+        ];
+      }
+      else {
+        // No plugins enabled, maybe some missing attributes.
+        return [
+          NULL,
+          $missing_attributes,
+        ];
+      }
+    }
+    else {
+      return NULL;
+    }
+  }
+
+  /**
+   * Adds default settings for all enabled CKEditor 5 plugins.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   The text editor config entity to update.
+   */
+  private function addDefaultSettingsForEnabledConfigurablePlugins(EditorInterface $editor): void {
+    $settings = $editor->getSettings();
+    $update_settings = FALSE;
+    $enabled_definitions = $this->pluginManager->getEnabledDefinitions($editor);
+    $configurable_definitions = array_filter($enabled_definitions, function (CKEditor5PluginDefinition $definition): bool {
+      return $definition->isConfigurable();
+    });
+
+    foreach ($configurable_definitions as $plugin_name => $definition) {
+      // Skip image upload as its configuration is stored in a discrete
+      // property of the $editor object, not its settings. Also skip any plugin
+      // that already has configuration data as default values are not needed.
+      if ($plugin_name === 'ckeditor5_imageUpload' || isset($settings['plugins'][$plugin_name])) {
+        continue;
+      }
+      $update_settings = TRUE;
+      $settings['plugins'][$plugin_name] = $this->pluginManager->getPlugin($plugin_name, NULL)->defaultConfiguration();
+    }
+
+    if ($update_settings) {
+      $editor->setSettings($settings);
+    }
+  }
+
+  /**
+   * Computes configuration for all enabled CKEditor 5 plugins with subsets.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   The text editor config entity to update.
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The text format for which to compute smart default settings.
+   */
+  private function computeSubsetSettingForEnabledPluginsWithSubsets(EditorInterface $editor, FilterFormatInterface $text_format): void {
+    $settings = $editor->getSettings();
+    $update_settings = FALSE;
+    $enabled_definitions = $this->pluginManager->getEnabledDefinitions($editor);
+    $configurable_subset_definitions = array_filter($enabled_definitions, function (CKEditor5PluginDefinition $definition): bool {
+      return is_a($definition->getClass(), CKEditor5PluginElementsSubsetInterface::class, TRUE);
+    });
+
+    foreach ($configurable_subset_definitions as $plugin_name => $definition) {
+      // Skip Source Editing as that has already been configured.
+      if ($plugin_name === 'ckeditor5_sourceEditing') {
+        continue;
+      }
+
+      try {
+        $subset_configuration = $this->upgradePluginManager->computeCKEditor5PluginSubsetConfiguration($plugin_name, $text_format);
+      }
+      catch (\OutOfBoundsException $e) {
+        $messages[] = $this->t('The CKEditor 5 plugin %button has a configurable subset of elements, but does not have a known upgrade path to configure that subset to match your text format. Hence it is now using its default configuration.', [
+          '%plugin' => $plugin_name,
+        ]);
+        continue;
+      }
+      if ($subset_configuration) {
+        $update_settings = TRUE;
+        assert(isset($settings['plugins'][$plugin_name]));
+        $default_configuration = $settings['plugins'][$plugin_name];
+        // The subset configuration's key-value pairs must override those of the
+        // default configuration.
+        $settings['plugins'][$plugin_name] = $subset_configuration + $default_configuration;
+      }
+    }
+
+    if ($update_settings) {
+      $editor->setSettings($settings);
+    }
+  }
+
+}
diff --git a/core/modules/ckeditor5/templates/ckeditor5-settings-toolbar.html.twig b/core/modules/ckeditor5/templates/ckeditor5-settings-toolbar.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6ab2cf974e4d339b8dba82c414d1bd23d744715f
--- /dev/null
+++ b/core/modules/ckeditor5/templates/ckeditor5-settings-toolbar.html.twig
@@ -0,0 +1,26 @@
+{#
+/**
+ * @file
+ * Default theme implementation to display CKEditor 5 toolbar settings.
+ *
+ * @internal
+ *   This template is internal because it's used for rendering the CKEditor 5
+ *   toolbar settings UI in the Drupal admin UI. The toolbar settings UI is
+ *   internal, and utilizing or overriding it outside of core usages is not
+ *   supported because the UI can change at any point.
+ */
+#}
+{% apply spaceless %}
+  <fieldset aria-labelledby="ckeditor5-toolbar-configuration" aria-describedby="ckeditor5-toolbar-description">
+    <legend id="ckeditor5-toolbar-configuration">{{ 'Toolbar configuration'|t }}</legend>
+    <div class="fieldset-wrapper">
+      <div id="ckeditor5-toolbar-description" class="fieldset-description">
+        {%- trans -%}
+          Move a button into the <em>Active toolbar</em> to enable it, or into the list of <em>Available buttons</em> to disable it. Buttons may be moved with the mouse or keyboard arrow keys.
+        {%- endtrans -%}
+      </div>
+      <div id="ckeditor5-toolbar-app"></div>
+      {{ form }}
+    </div>
+  </fieldset>
+{% endapply %}
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor4to5upgrade_plugin_test/ckeditor4to5upgrade_plugin_test.info.yml b/core/modules/ckeditor5/tests/modules/ckeditor4to5upgrade_plugin_test/ckeditor4to5upgrade_plugin_test.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d86e9bb5b9046cd86c4a8d27311ddb9eab522092
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor4to5upgrade_plugin_test/ckeditor4to5upgrade_plugin_test.info.yml
@@ -0,0 +1,7 @@
+name: CKEditor 4 to 5 Upgrade plugin Test
+type: module
+description: "Provides test plugins for testing CKEditor 4 to 5 upgrade infrastructure."
+package: Testing
+core_version_requirement: ^9
+dependencies:
+  - ckeditor5:ckeditor5
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor4to5upgrade_plugin_test/ckeditor4to5upgrade_plugin_test.module b/core/modules/ckeditor5/tests/modules/ckeditor4to5upgrade_plugin_test/ckeditor4to5upgrade_plugin_test.module
new file mode 100644
index 0000000000000000000000000000000000000000..cb99f7acc40008e8f081ea73669cdcd96343ba80
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor4to5upgrade_plugin_test/ckeditor4to5upgrade_plugin_test.module
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * @file
+ * Implements hooks for the CKEditor 4 to 5 Upgrade plugin Test module.
+ */
+
+declare(strict_types = 1);
+
+/**
+ * Implements hook_ckeditor4to5upgrade_plugin_info_alter().
+ */
+function ckeditor4to5upgrade_plugin_test_ckeditor4to5upgrade_plugin_info_alter(array &$plugin_definitions): void {
+  switch (\Drupal::state()->get('ckeditor4to5upgrade_plugin_test')) {
+    case 'duplicate_button':
+      $plugin_definitions['foo'] = array_intersect_key($plugin_definitions['core'], ['cke4_buttons' => TRUE]);
+      break;
+
+    case 'duplicate_plugin_settings':
+      $plugin_definitions['foo'] = array_intersect_key($plugin_definitions['core'], ['cke4_plugin_settings' => TRUE]);
+      break;
+
+    case 'duplicate_subset':
+      $plugin_definitions['foo'] = array_intersect_key($plugin_definitions['core'], ['cke5_plugin_elements_subset_configuration' => TRUE]);
+      break;
+
+    case 'lying_button':
+      $plugin_definitions['foo'] = [
+        'cke4_buttons' => ['foo'],
+        'class' => $plugin_definitions['core']['class'],
+      ];
+      break;
+
+    case 'lying_plugin_settings':
+      $plugin_definitions['foo'] = [
+        'cke4_plugin_settings' => ['foo'],
+        'class' => $plugin_definitions['core']['class'],
+      ];
+      break;
+
+    case 'lying_subset':
+      $plugin_definitions['foo'] = [
+        'cke5_plugin_elements_subset_configuration' => ['foo'],
+        'class' => $plugin_definitions['core']['class'],
+      ];
+      break;
+
+    default:
+      throw new \LogicException();
+  }
+}
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_definition_supporting_element/ckeditor5_definition_supporting_element.ckeditor5.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_definition_supporting_element/ckeditor5_definition_supporting_element.ckeditor5.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0381bb6165368f85a23348dd78191a9e9f76b2f4
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_definition_supporting_element/ckeditor5_definition_supporting_element.ckeditor5.yml
@@ -0,0 +1,111 @@
+ckeditor5_definition_supporting_element_just_nav:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <nav>
+    elements:
+      - <nav>
+
+ckeditor5_definition_supporting_element_just_article:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <article>
+    elements:
+      - <article>
+
+ckeditor5_definition_supporting_element_article_class:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <article class>
+    elements:
+      - <article class>
+
+ckeditor5_definition_supporting_element_article_class_with_values:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <article class="…">
+    elements:
+      - <article class="this-value that-value">
+
+ckeditor5_definition_supporting_element_just_footer:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <footer>
+    elements:
+      - <footer>
+
+ckeditor5_definition_supporting_element_footer_class:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <footer class>
+    elements:
+      - <footer class>
+
+ckeditor5_definition_supporting_element_just_aside:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <aside>
+    elements:
+      - <aside>
+
+ckeditor5_definition_supporting_element_aside_class_with_values:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <article class="…">
+    elements:
+      - <aside class="this-value that-value">
+
+ckeditor5_definition_supporting_element_main_class:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <main class>
+    elements:
+      - <main class>
+
+ckeditor5_definition_supporting_element_main_class_with_values:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <main class="…">
+    elements:
+      - <main class="this-value that-value">
+
+ckeditor5_definition_supporting_element_figure_one_attrib:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <figure data-one>
+    elements:
+      - <figure data-one>
+
+ckeditor5_definition_supporting_element_figure_two_attrib:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <figure data-one data-two>
+    elements:
+      - <figure data-one data-two>
+
+ckeditor5_definition_supporting_element_dialog_two_attrib:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <dialog data-one data-two>
+    elements:
+      - <dialog data-one data-two>
+
+ckeditor5_definition_supporting_element_dialog_one_attrib:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <dialog data-one>
+    elements:
+      - <dialog data-one>
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_definition_supporting_element/ckeditor5_definition_supporting_element.info.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_definition_supporting_element/ckeditor5_definition_supporting_element.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ed19a8b2df559072bcf4c5c47a63dba9b50f98fa
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_definition_supporting_element/ckeditor5_definition_supporting_element.info.yml
@@ -0,0 +1,7 @@
+name: CKEditor 5 Definition Supporting Tags Test
+type: module
+description: "Provides test plugins for CKEditor 5 to test finding plugin definitions that support specific tags."
+package: Testing
+core_version_requirement: ^9
+dependencies:
+  - ckeditor5:ckeditor5
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_conditions_test/ckeditor5_plugin_conditions_test.ckeditor5.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_conditions_test/ckeditor5_plugin_conditions_test.ckeditor5.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6319b3c588e0303dba78ba54d5c0516655a40b53
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_conditions_test/ckeditor5_plugin_conditions_test.ckeditor5.yml
@@ -0,0 +1,14 @@
+ckeditor5_plugin_conditions_test_plugins_condition:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: TEST — Plugins Condition
+    toolbar_items:
+      fooBarConditions:
+        label: Foo Bar (Test Plugins Condition)
+    conditions:
+      plugins:
+        - ckeditor5_heading
+        - ckeditor5_table
+    elements:
+      - <foo>
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_conditions_test/ckeditor5_plugin_conditions_test.info.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_conditions_test/ckeditor5_plugin_conditions_test.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3b83a0089ea1a7bde002988927afec350d931acc
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_conditions_test/ckeditor5_plugin_conditions_test.info.yml
@@ -0,0 +1,7 @@
+name: CKEditor 5 Plugin Conditions Test
+type: module
+description: "Provides test plugins for CKEditor 5 to test plugin conditions."
+package: Testing
+core_version_requirement: ^9
+dependencies:
+  - ckeditor5:ckeditor5
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/ckeditor5_plugin_elements_subset.ckeditor5.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/ckeditor5_plugin_elements_subset.ckeditor5.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c5218e7e2f5e02ce8ff49d943cdc263e650c158b
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/ckeditor5_plugin_elements_subset.ckeditor5.yml
@@ -0,0 +1,9 @@
+ckeditor5_plugin_elements_subset_sneakySuperset:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: Sneaky Superset
+    class: Drupal\ckeditor5_plugin_elements_subset\Plugin\CKEditor5Plugin\SneakySuperset
+    elements:
+      - <foo>
+      - <bar>
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/ckeditor5_plugin_elements_subset.info.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/ckeditor5_plugin_elements_subset.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a47112763e43a50da422360f91ef18c84df97d9f
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/ckeditor5_plugin_elements_subset.info.yml
@@ -0,0 +1,7 @@
+name: CKEditor 5 Plugin Elements Subset Test
+type: module
+description: "Provides test plugin to test CKEditor5PluginElementsSubsetInterface"
+package: Testing
+core_version_requirement: ^9
+dependencies:
+  - ckeditor5:ckeditor5
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/config/schema/ckeditor5_plugin_elements_subset.schema.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/config/schema/ckeditor5_plugin_elements_subset.schema.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3a861e26a5be00f1579f4cd4a4083ecda90a2c3d
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/config/schema/ckeditor5_plugin_elements_subset.schema.yml
@@ -0,0 +1,10 @@
+ckeditor5.plugin.ckeditor5_plugin_elements_subset_sneakySuperset:
+  type: mapping
+  label: Sneaky Superset
+  mapping:
+    configured_subset:
+      type: sequence
+      label: 'Allowed Tags'
+      sequence:
+        type: ckeditor5.element
+        label: 'Allowed Tag'
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/src/Plugin/CKEditor5Plugin/SneakySuperset.php b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/src/Plugin/CKEditor5Plugin/SneakySuperset.php
new file mode 100644
index 0000000000000000000000000000000000000000..398758e298af82a0d476c10729423399341a95d4
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/src/Plugin/CKEditor5Plugin/SneakySuperset.php
@@ -0,0 +1,51 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\ckeditor5_plugin_elements_subset\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginElementsSubsetInterface;
+use Drupal\Core\Form\FormStateInterface;
+
+class SneakySuperset extends CKEditor5PluginDefault implements CKEditor5PluginElementsSubsetInterface {
+
+  use CKEditor5PluginConfigurableTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'configured_subset' => [],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getElementsSubset(): array {
+    return $this->configuration['configured_subset'];
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_test/ckeditor5_plugin_elements_test.ckeditor5.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_test/ckeditor5_plugin_elements_test.ckeditor5.yml
new file mode 100644
index 0000000000000000000000000000000000000000..37a8c85c107c2337fba1e9f7e0870f7433640f17
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_test/ckeditor5_plugin_elements_test.ckeditor5.yml
@@ -0,0 +1,33 @@
+# cspell:ignore everyblock justblockquote
+ckeditor5_plugin_elements_test_blockquoteCombo:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — block quote combo
+    elements:
+      - <blockquote data-justblockquote>
+      - <$block data-everyblock>
+
+ckeditor5_plugin_elements_test_headingsWithOtherAttributes:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — headings with other attributes
+    elements:
+      - <h1 data-just-h1>
+      - <h2 class="additional-allowed-class">
+      - <h3 data-just-h3 data-just-h3-limited="i-am-the-only-allowed-value">
+      - <h5 data-just-h5-limited="first-allowed-value second-allowed-value">
+
+ckeditor5_plugin_elements_test_headingsUseClassAnyValue:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — headings with any class
+    elements:
+      - <h1 class>
+      - <h2 class>
+      - <h3 class>
+      - <h4 class>
+      - <h5 class>
+      - <h6 class>
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_test/ckeditor5_plugin_elements_test.info.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_test/ckeditor5_plugin_elements_test.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..aba0fa1edca4ab5e9e1a2b8ec9dbbf9739fe8090
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_test/ckeditor5_plugin_elements_test.info.yml
@@ -0,0 +1,7 @@
+name: CKEditor 5 Plugin Elements Test
+type: module
+description: "Provides test plugins for CKEditor 5 to test allowed elements parsing."
+package: Testing
+core_version_requirement: ^9
+dependencies:
+  - ckeditor5:ckeditor5
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.ckeditor5.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.ckeditor5.yml
new file mode 100644
index 0000000000000000000000000000000000000000..52217fc674478462e48e61ad75e52f9254f0913d
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.ckeditor5.yml
@@ -0,0 +1,16 @@
+# cspell:ignore layercake
+ckeditor5_test_layercake:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — Layercake
+    library: ckeditor5_test/layercake
+    toolbar_items:
+      simpleBox:
+        label: Simple Box
+      twoCol:
+        label: Two Col layout
+    elements:
+      - <h1 class>
+      - <div class>
+      - <section class>
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.info.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2e14f048d6d7b58c86a012ab5e205b0193ea7d57
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.info.yml
@@ -0,0 +1,8 @@
+name: CKEditor 5 Test
+type: module
+description: "Provides test layout and component plugins for CKEditor 5."
+package: Testing
+core_version_requirement: ^9
+dependencies:
+  - drupal:editor
+  - ckeditor5:ckeditor5
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.libraries.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.libraries.yml
new file mode 100644
index 0000000000000000000000000000000000000000..af9e5496788c6efbc78cb688ef06b85e84949434
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.libraries.yml
@@ -0,0 +1,10 @@
+# cspell:ignore layercake
+layercake:
+  version: VERSION
+  # In real-world (non-test) scenarios, this would load the CKEditor 5 plugin's built JS.
+  js: {}
+  css:
+    theme:
+      css/layout.css: {}
+  dependencies:
+    - core/ckeditor5
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.routing.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.routing.yml
new file mode 100644
index 0000000000000000000000000000000000000000..50d7848984c2683e987d502e67624bdbb2085fd0
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.routing.yml
@@ -0,0 +1,6 @@
+ckeditor5_test.off_canvas:
+  path: '/ckeditor5_test/off_canvas'
+  defaults:
+    _controller: '\Drupal\ckeditor5_test\Controller\CKEditor5OffCanvasTestController::testOffCanvas'
+  requirements:
+    _access: 'TRUE'
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/css/layout.css b/core/modules/ckeditor5/tests/modules/ckeditor5_test/css/layout.css
new file mode 100644
index 0000000000000000000000000000000000000000..91a76da70b0ca3a7fa7825bc2f6e6e90a115be0a
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/css/layout.css
@@ -0,0 +1,14 @@
+.layout--two-col {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+}
+
+.simple-box {
+  padding: 0.5rem;
+  background: #ccc;
+}
+
+.simple-box-title,
+.simple-box-description {
+  background: #fff;
+}
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/src/Controller/CKEditor5OffCanvasTestController.php b/core/modules/ckeditor5/tests/modules/ckeditor5_test/src/Controller/CKEditor5OffCanvasTestController.php
new file mode 100644
index 0000000000000000000000000000000000000000..49951f3b3618b70810ef133691e46118cd878fe5
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/src/Controller/CKEditor5OffCanvasTestController.php
@@ -0,0 +1,35 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5_test\Controller;
+
+use Drupal\Core\Url;
+
+/**
+ * Provides controller for testing CKEditor in off-canvas dialogs.
+ */
+class CKEditor5OffCanvasTestController {
+
+  /**
+   * Returns a link that can open a node add form in an off-canvas dialog.
+   *
+   * @return array
+   *   A render array.
+   */
+  public function testOffCanvas() {
+    $build['link'] = [
+      '#type' => 'link',
+      '#title' => 'Add Node',
+      '#url' => Url::fromRoute('node.add', ['node_type' => 'page']),
+      '#attributes' => [
+        'class' => ['use-ajax'],
+        'data-dialog-type' => 'dialog',
+        'data-dialog-renderer' => 'off_canvas',
+      ],
+    ];
+    $build['#attached']['library'][] = 'core/drupal.dialog.off_canvas';
+    return $build;
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Functional/ImageUploadAccessTest.php b/core/modules/ckeditor5/tests/src/Functional/ImageUploadAccessTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b6c99ebc132450e497ee0f7d7b4d0b3645fc7dc9
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Functional/ImageUploadAccessTest.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\Functional;
+
+/**
+ * Test image upload access.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class ImageUploadAccessTest extends ImageUploadTest {
+
+  /**
+   * Test access to the CKEditor 5 image upload controller.
+   */
+  public function testCkeditor5ImageUploadRoute() {
+    $this->createBasicFormat();
+    $url = $this->getUploadUrl();
+    $test_image = file_get_contents(current($this->getTestFiles('image'))->uri);
+
+    // With no text editor, expect a 404.
+    $response = $this->uploadRequest($url, $test_image, 'test.jpg');
+    $this->assertSame(404, $response->getStatusCode());
+
+    $editor = $this->createEditorWithUpload([
+      'status' => FALSE,
+      'scheme' => 'public',
+      'directory' => 'inline-images',
+      'max_size' => '',
+      'max_dimensions' => [
+        'width' => 0,
+        'height' => 0,
+      ],
+    ]);
+
+    // Ensure that images cannot be uploaded when image upload is disabled.
+    $response = $this->uploadRequest($url, $test_image, 'test.jpg');
+    $this->assertSame(403, $response->getStatusCode());
+
+    $editor->setImageUploadSettings(['status' => TRUE] + $editor->getImageUploadSettings())
+      ->save();
+    $response = $this->uploadRequest($url, $test_image, 'test.jpg');
+    $this->assertSame(201, $response->getStatusCode());
+
+    // Ensure that users without permissions to the text format cannot upload
+    // images.
+    $this->drupalLogout();
+    $response = $this->uploadRequest($url, $test_image, 'test.jpg');
+    $this->assertSame(403, $response->getStatusCode());
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Functional/ImageUploadTest.php b/core/modules/ckeditor5/tests/src/Functional/ImageUploadTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..bfd749851408cef4f72251b165ffb3e8ba2d7985
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Functional/ImageUploadTest.php
@@ -0,0 +1,256 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\Functional;
+
+use Drupal\Core\Url;
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\Tests\BrowserTestBase;
+use Drupal\Tests\ckeditor5\Traits\SynchronizeCsrfTokenSeedTrait;
+use Drupal\Tests\jsonapi\Functional\JsonApiRequestTestTrait;
+use Drupal\Tests\TestFileCreationTrait;
+use Drupal\user\RoleInterface;
+use GuzzleHttp\RequestOptions;
+
+/**
+ * Test image upload.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class ImageUploadTest extends BrowserTestBase {
+
+  use JsonApiRequestTestTrait;
+  use TestFileCreationTrait;
+  use SynchronizeCsrfTokenSeedTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'editor',
+    'filter',
+    'ckeditor5',
+  ];
+
+  /**
+   * A user without any particular permissions to be used in testing.
+   *
+   * @var \Drupal\user\Entity\User
+   */
+  protected $user;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    $this->user = $this->drupalCreateUser();
+    $this->drupalLogin($this->user);
+  }
+
+  /**
+   * Tests using the file upload route with a disallowed extension.
+   */
+  public function testUploadFileExtension() {
+    $this->createBasicFormat();
+    $this->createEditorWithUpload([
+      'status' => TRUE,
+      'scheme' => 'public',
+      'directory' => 'inline-images',
+      'max_size' => '',
+      'max_dimensions' => [
+        'width' => 0,
+        'height' => 0,
+      ],
+    ]);
+
+    $url = $this->getUploadUrl();
+    $image_file = file_get_contents(current($this->getTestFiles('image'))->uri);
+    $non_image_file = file_get_contents(current($this->getTestFiles('php'))->uri);
+    $response = $this->uploadRequest($url, $non_image_file, 'test.php');
+    $this->assertSame(422, $response->getStatusCode());
+
+    $response = $this->uploadRequest($url, $image_file, 'test.jpg');
+    $this->assertSame(201, $response->getStatusCode());
+  }
+
+  /**
+   * Tests using the file upload route with a file size larger than allowed.
+   */
+  public function testFileUploadLargerFileSize() {
+    $this->createBasicFormat();
+    $this->createEditorWithUpload([
+      'status' => TRUE,
+      'scheme' => 'public',
+      'directory' => 'inline-images',
+      'max_size' => 30000,
+      'max_dimensions' => [
+        'width' => 0,
+        'height' => 0,
+      ],
+    ]);
+
+    $url = $this->getUploadUrl();
+    $images = $this->getTestFiles('image');
+    $large_image = $this->getTestImageByStat($images, 'size', function ($size) {
+      return $size > 30000;
+    });
+    $small_image = $this->getTestImageByStat($images, 'size', function ($size) {
+      return $size < 30000;
+    });
+
+    $response = $this->uploadRequest($url, file_get_contents($large_image->uri), 'large.jpg');
+    $this->assertSame(422, $response->getStatusCode());
+
+    $response = $this->uploadRequest($url, file_get_contents($small_image->uri), 'small.jpg');
+    $this->assertSame(201, $response->getStatusCode());
+  }
+
+  /**
+   * Test that lock is removed after a failed validation.
+   *
+   * @see https://www.drupal.org/project/drupal/issues/3184974
+   */
+  public function testLockAfterFailedValidation() {
+    $this->createBasicFormat();
+    $this->createEditorWithUpload([
+      'status' => TRUE,
+      'scheme' => 'public',
+      'directory' => 'inline-images',
+      'max_size' => 30000,
+      'max_dimensions' => [
+        'width' => 0,
+        'height' => 0,
+      ],
+    ]);
+
+    $url = $this->getUploadUrl();
+    $images = $this->getTestFiles('image');
+    $large_image = $this->getTestImageByStat($images, 'size', function ($size) {
+      return $size > 30000;
+    });
+    $small_image = $this->getTestImageByStat($images, 'size', function ($size) {
+      return $size < 30000;
+    });
+    $response = $this->uploadRequest($url, file_get_contents($large_image->uri), 'same.jpg');
+    $this->assertSame(422, $response->getStatusCode());
+
+    $response = $this->uploadRequest($url, file_get_contents($small_image->uri), 'same.jpg');
+    $this->assertSame(201, $response->getStatusCode());
+  }
+
+  /**
+   * Make upload request to a controller.
+   *
+   * @param \Drupal\Core\Url $url
+   *   The URL for the request.
+   * @param string $file_contents
+   *   File contents.
+   * @param string $file_name
+   *   Name of the file.
+   *
+   * @return \Psr\Http\Message\ResponseInterface
+   *   The response.
+   */
+  protected function uploadRequest(Url $url, string $file_contents, string $file_name) {
+    $request_options[RequestOptions::HEADERS] = [
+      'Accept' => 'application/json',
+    ];
+    $request_options[RequestOptions::MULTIPART] = [
+      [
+        'name' => 'upload',
+        'filename' => $file_name,
+        'contents' => $file_contents,
+      ],
+    ];
+
+    return $this->request('POST', $url, $request_options);
+  }
+
+  /**
+   * Provides the image upload url.
+   *
+   * @return \Drupal\Core\Url
+   *   The upload image url for the basic_html format.
+   */
+  protected function getUploadUrl() {
+    $token = $this->container->get('csrf_token')->get('ckeditor5/upload-image/basic_html');
+    return Url::fromRoute('ckeditor5.upload_image', ['editor' => 'basic_html'], ['query' => ['token' => $token]]);
+  }
+
+  /**
+   * Create a basic_html text format for the editor to reference.
+   *
+   * @throws \Drupal\Core\Entity\EntityStorageException
+   */
+  protected function createBasicFormat() {
+    $basic_html_format = FilterFormat::create([
+      'format' => 'basic_html',
+      'name' => 'Basic HTML',
+      'weight' => 1,
+      'filters' => [
+        'filter_html_escape' => ['status' => 1],
+      ],
+      'roles' => [RoleInterface::AUTHENTICATED_ID],
+    ]);
+    $basic_html_format->save();
+  }
+
+  /**
+   * Create an editor entity with image_upload config.
+   *
+   * @param array $upload_config
+   *   The editor image_upload config.
+   *
+   * @return \Drupal\Core\Entity\EntityBase|\Drupal\Core\Entity\EntityInterface
+   *   The text editor entity.
+   *
+   * @throws \Drupal\Core\Entity\EntityStorageException
+   */
+  protected function createEditorWithUpload(array $upload_config) {
+    $editor = Editor::create([
+      'editor' => 'ckeditor5',
+      'format' => 'basic_html',
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'uploadImage',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => $upload_config,
+    ]);
+    $editor->save();
+
+    return $editor;
+  }
+
+  /**
+   * Return the first image matching $condition.
+   *
+   * @param array $images
+   *   Images created with getTestFiles().
+   * @param string $stat
+   *   A key in the array returned from stat().
+   * @param callable $condition
+   *   A function to compare a value of the image file.
+   *
+   * @return object|bool
+   *   Objects with 'uri', 'filename', and 'name' properties.
+   */
+  protected function getTestImageByStat(array $images, string $stat, callable $condition) {
+    return current(array_filter($images, function ($image) use ($condition, $stat) {
+      $stats = stat($image->uri);
+      return $condition($stats[$stat]);
+    }));
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Functional/MediaImageTest.php b/core/modules/ckeditor5/tests/src/Functional/MediaImageTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d66937cfa0a5c4146af27c0c782c6d39b62ee302
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Functional/MediaImageTest.php
@@ -0,0 +1,188 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\Functional;
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\editor\Entity\Editor;
+use Drupal\file\Entity\File;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\media\Entity\Media;
+use Drupal\Tests\BrowserTestBase;
+use Drupal\Tests\ckeditor5\Traits\SynchronizeCsrfTokenSeedTrait;
+use Drupal\Tests\media\Traits\MediaTypeCreationTrait;
+use Drupal\Tests\TestFileCreationTrait;
+use Drupal\user\RoleInterface;
+use Symfony\Component\Validator\ConstraintViolation;
+
+/**
+ * Tests that image media types are determined correctly.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class MediaImageTest extends BrowserTestBase {
+
+  use TestFileCreationTrait;
+  use MediaTypeCreationTrait;
+  use SynchronizeCsrfTokenSeedTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'system',
+    'user',
+    'filter',
+    'editor',
+    'ckeditor5',
+    'media',
+  ];
+
+  /**
+   * The sample image media entity to use for testing.
+   *
+   * @var \Drupal\media\MediaInterface
+   */
+  protected $mediaImage;
+
+  /**
+   * The sample file media entity to use for testing.
+   *
+   * @var \Drupal\media\MediaInterface
+   */
+  protected $mediaFile;
+
+  /**
+   * The editor instance to use for testing.
+   *
+   * @var \Drupal\editor\Entity\Editor
+   */
+  protected $editor;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    $filtered_html_format = FilterFormat::create([
+      'format' => 'filtered_html',
+      'name' => 'Filtered HTML',
+      'weight' => 0,
+      'filters' => [
+        'filter_html' => [
+          'id' => 'filter_html',
+          'status' => TRUE,
+          'weight' => -10,
+          'settings' => [
+            'allowed_html' => "<p> <br> <drupal-media data-entity-type data-entity-uuid alt>",
+            'filter_html_help' => TRUE,
+            'filter_html_nofollow' => TRUE,
+          ],
+        ],
+        'media_embed' => ['status' => TRUE],
+      ],
+      'roles' => [RoleInterface::AUTHENTICATED_ID],
+    ]);
+    $filtered_html_format->save();
+    $this->editor = Editor::create([
+      'format' => 'filtered_html',
+      'editor' => 'ckeditor5',
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+      ],
+    ]);
+    $this->editor->save();
+    $this->assertSame([], array_map(
+      function (ConstraintViolation $v) {
+        return (string) $v->getMessage();
+      },
+      iterator_to_array(CKEditor5::validatePair($this->editor, $filtered_html_format))
+    ));
+
+    // Create a sample media entity to be embedded.
+    $this->createMediaType('image', ['id' => 'image']);
+    File::create([
+      'uri' => $this->getTestFiles('image')[0]->uri,
+    ])->save();
+    $this->mediaImage = Media::create([
+      'bundle' => 'image',
+      'name' => 'Screaming hairy armadillo',
+      'field_media_image' => [
+        [
+          'target_id' => 1,
+          'alt' => 'default alt',
+          'title' => 'default title',
+        ],
+      ],
+    ]);
+    $this->mediaImage->save();
+
+    $this->createMediaType('file', ['id' => 'file']);
+    File::create([
+      'uri' => $this->getTestFiles('text')[0]->uri,
+    ])->save();
+    $this->mediaFile = Media::create([
+      'bundle' => 'file',
+      'name' => 'Information about screaming hairy armadillo',
+      'field_media_file' => [
+        [
+          'target_id' => 2,
+        ],
+      ],
+    ]);
+    $this->mediaFile->save();
+
+    $this->adminUser = $this->drupalCreateUser([
+      'use text format filtered_html',
+    ]);
+    $this->drupalLogin($this->adminUser);
+  }
+
+  /**
+   * Tests that media entity with image field is recognized.
+   */
+  public function testIsMediaImage() {
+    $path = '/ckeditor5/filtered_html/is-media-image';
+    $token = $this->container->get('csrf_token')->get(ltrim($path, '/'));
+    $uuid = $this->mediaImage->uuid();
+
+    $this->drupalGet($path, ['query' => ['token' => $token]]);
+    $this->assertSession()->statusCodeEquals(400);
+
+    $this->drupalGet($path, ['query' => ['uuid' => $uuid, 'token' => $token]]);
+    $this->assertSession()->statusCodeEquals(200);
+    $this->assertSame(json_encode(TRUE), $this->getSession()->getPage()->getContent());
+
+    $this->drupalGet($path, ['query' => ['uuid' => $this->mediaFile->uuid(), 'token' => $token]]);
+    $this->assertSession()->statusCodeEquals(200);
+    $this->assertSame(json_encode(FALSE), $this->getSession()->getPage()->getContent());
+
+    // Ensure that unpublished media returns 403.
+    $this->mediaImage->setUnpublished()->save();
+    $this->drupalGet($path, ['query' => ['uuid' => $uuid, 'token' => $token]]);
+    $this->assertSession()->statusCodeEquals(403);
+
+    // Ensure that users that don't have access to the filter format receive
+    // either 404 or 403.
+    $this->drupalLogout();
+    $token = $this->container->get('csrf_token')->get(ltrim($path, '/'));
+    $this->drupalGet($path, ['token' => $token]);
+    $this->assertSession()->statusCodeEquals(400);
+
+    $this->drupalGet($path, ['query' => ['uuid' => $uuid, 'token' => $token]]);
+    $this->assertSession()->statusCodeEquals(403);
+
+    $this->mediaImage->setPublished()->save();
+    $this->drupalGet($path, ['query' => ['uuid' => $uuid, 'token' => $token]]);
+    $this->assertSession()->statusCodeEquals(403);
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/AdminUiTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/AdminUiTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d2c01635e6b91af1d93856fb9d78a8dcb463ae44
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/AdminUiTest.php
@@ -0,0 +1,173 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+/**
+ * Tests for CKEditor 5 in the admin UI.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class AdminUiTest extends CKEditor5TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'media_library',
+    'ckeditor',
+  ];
+
+  /**
+   * Confirm settings only trigger AJAX when select value is CKEditor 5.
+   */
+  public function testSettingsOnlyFireAjaxWithCkeditor5() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+    $this->addNewTextFormat($page, $assert_session);
+    $this->addNewTextFormat($page, $assert_session, 'ckeditor');
+
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor5');
+    $number_ajax_instances_before = $this->getSession()->evaluateScript('Drupal.ajax.instances.length');
+
+    // Enable media embed to trigger an AJAX rebuild.
+    $this->assertTrue($page->hasUncheckedField('filters[media_embed][status]'));
+    $page->checkField('filters[media_embed][status]');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ajax-progress-throbber'));
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->responseContains('Media types selectable in the Media Library');
+    $assert_session->assertWaitOnAjaxRequest();
+    $number_ajax_instances_after = $this->getSession()->evaluateScript('Drupal.ajax.instances.length');
+
+    // After the rebuild, there should be more AJAX instances.
+    $this->assertGreaterThan($number_ajax_instances_before, $number_ajax_instances_after);
+
+    // Perform the same steps as above with CKEditor, and confirm AJAX callbacks
+    // are not triggered on settings changes.
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor');
+    $number_ajax_instances_before = $this->getSession()->evaluateScript('Drupal.ajax.instances.length');
+
+    // Enable media embed to confirm a format not using CKEditor 5 will not
+    // trigger an AJAX rebuild.
+    $this->assertTrue($page->hasUncheckedField('filters[media_embed][status]'));
+    $page->checkField('filters[media_embed][status]');
+    $this->assertEmpty($assert_session->waitForElement('css', '.ajax-progress-throbber'));
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->responseContains('Media types selectable in the Media Library');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $number_ajax_instances_after = $this->getSession()->evaluateScript('Drupal.ajax.instances.length');
+    $this->assertSame($number_ajax_instances_before, $number_ajax_instances_after);
+
+    // Confirm that AJAX updates happen when attempting to switch to CKEditor 5,
+    // even if prevented from doing so by validation.
+    $this->drupalGet('admin/config/content/formats/add');
+    $page->fillField('name', 'trigger validator');
+    $assert_session->waitForText('Machine name');
+    $page->checkField('roles[authenticated]');
+
+    // Enable a filter that is incompatible with CKEditor 5, so validation is
+    // triggered when attempting to switch.
+    $number_ajax_instances_before = $this->getSession()->evaluateScript('Drupal.ajax.instances.length');
+    $this->assertTrue($page->hasUncheckedField('filters[filter_autop][status]'));
+    $page->checkField('filters[filter_autop][status]');
+    $this->assertEmpty($assert_session->waitForElement('css', '.ajax-progress-throbber'));
+    $assert_session->assertWaitOnAjaxRequest();
+    $number_ajax_instances_after = $this->getSession()->evaluateScript('Drupal.ajax.instances.length');
+    $this->assertSame($number_ajax_instances_before, $number_ajax_instances_after);
+
+    $page->selectFieldOption('editor[editor]', 'ckeditor5');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // The presence of this validation error message confirms the AJAX callback
+    // was invoked.
+    $assert_session->pageTextContains('CKEditor 5 only works with HTML-based text formats');
+
+    // Disable the incompatible filter. This should trigger another AJAX rebuild
+    // which will include the removal of the validation error as the issue has
+    // been corrected.
+    $this->assertTrue($page->hasCheckedField('filters[filter_autop][status]'));
+    $page->uncheckField('filters[filter_autop][status]');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ajax-progress-throbber'));
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextNotContains('CKEditor 5 only works with HTML-based text formats');
+  }
+
+  /**
+   * CKEditor5's filter UI modifications should not break it for other editors.
+   */
+  public function testUnavailableFiltersHiddenWhenSwitching() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+    $this->createNewTextFormat($page, $assert_session, 'ckeditor');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextNotContains('Filter settings');
+
+    // Switching to CKEditor 5 should keep the filter settings hidden.
+    $page->selectFieldOption('editor[editor]', 'ckeditor5');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextNotContains('Filter settings');
+  }
+
+  /**
+   * Test that filter settings are only visible when the filter is enabled.
+   */
+  public function testFilterCheckboxesToggleSettings() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $media_tab = $page->find('css', '[href^="#edit-filters-media-embed-settings"]');
+    $this->assertFalse($media_tab->isVisible(), 'Media filter settings should not be present because media filter is not enabled');
+
+    $this->assertTrue($page->hasUncheckedField('filters[media_embed][status]'));
+    $page->checkField('filters[media_embed][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $media_tab = $assert_session->waitForElementVisible('css', '[href^="#edit-filters-media-embed-settings"]');
+    $this->assertTrue($media_tab->isVisible(), 'Media settings should appear when media filter enabled');
+
+    $page->uncheckField('filters[media_embed][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $media_tab = $page->find('css', '[href^="#edit-filters-media-embed-settings"]');
+    $this->assertFalse($media_tab->isVisible(), 'Media settings should be removed when media filter disabled');
+  }
+
+  /**
+   * Ensure CKEditor 5 admin UI's real-time validation errors do not accumulate.
+   */
+  public function testMessagesDoNotAccumulate(): void {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->addNewTextFormat($page, $assert_session);
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor5');
+
+    $find_validation_error_messages = function () use ($page): array {
+      return $page->findAll('css', '[role=alert]:contains("CKEditor 5 only works with HTML-based text formats.")');
+    };
+
+    // No validation errors when we start.
+    $this->assertCount(0, $find_validation_error_messages());
+
+    // Enable a filter which is not compatible with CKEditor 5, to trigger a
+    // validation error.
+    $page->checkField('Convert URLs into links');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertCount(1, $find_validation_error_messages());
+
+    // Disable it: validation messages should be gone.
+    $page->uncheckField('Convert URLs into links');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Re-enable it: validation messages should be back.
+    $page->checkField('Convert URLs into links');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertCount(1, $find_validation_error_messages());
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5AllowedTagsTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5AllowedTagsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5c06e07a853d8cbeaa02dcb252e6caba61b80d00
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5AllowedTagsTest.php
@@ -0,0 +1,521 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Symfony\Component\Yaml\Yaml;
+
+// cspell:ignore esque imageUpload nofilter noeditor sourceediting Editing's
+
+/**
+ * Tests for CKEditor5.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class CKEditor5AllowedTagsTest extends CKEditor5TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'node',
+    'ckeditor',
+    'ckeditor5',
+    'media',
+    'media_library',
+  ];
+
+  /**
+   * The default CKEditor 5 allowed elements.
+   *
+   * @var string
+   */
+  protected $allowedElements = '<br> <p> <h2> <h3> <h4> <h5> <h6> <strong> <em>';
+
+  /**
+   * The element that must be allowed when media embed is enabled.
+   *
+   * @var string
+   */
+  protected $mediaElement = '<drupal-media data-entity-type data-entity-uuid alt>';
+
+  /**
+   * The default allowed elements when updating a non-CKEditor 5 editor.
+   *
+   * @var string
+   */
+  protected $defaultElementsWhenUpdatingNotCkeditor5 = '<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id> <img src alt data-entity-type data-entity-uuid>';
+
+  /**
+   * Test enabling CKEditor 5 in a way that triggers validation.
+   */
+  public function testEnablingToVersion5Validation() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session, 'ckeditor');
+    $page->selectFieldOption('editor[editor]', 'ckeditor');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->checkField('filters[filter_html][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->selectFieldOption('editor[editor]', 'ckeditor5');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextContains('CKEditor 5 needs at least the <p> and <br> tags to be allowed to be able to function. They are not allowed by the "Limit allowed HTML tags and correct faulty HTML" (filter_html) filter.');
+
+    // Add the tags that must be included in the html filter for CKEditor 5
+    // defaults.
+    $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $allowed_html_field->setValue('<p> <br>');
+
+    // Confirm there are no longer any warnings.
+    $assert_session->waitForElementRemoved('css', '[data-drupal-messages] [role="alert"]');
+
+    $page->pressButton('update-ckeditor5-allowed-tags');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->saveNewTextFormat($page, $assert_session);
+  }
+
+  /**
+   * Tests that when image uploads are enabled in CKEditor 4, they remain in 5.
+   */
+  public function testImageUploadsRemainEnabled(): void {
+    FilterFormat::create([
+      'format' => 'cke4_image_uploads',
+      'name' => 'CKEditor 4, image uploads',
+    ])->save();
+    Editor::create([
+      'format' => 'cke4_image_uploads',
+      'editor' => 'ckeditor',
+      'settings' => [
+        'toolbar' => [
+          'rows' => [
+            0 => [
+              [
+                'name' => 'Media',
+                'items' => [
+                  'DrupalImage',
+                ],
+              ],
+            ],
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => TRUE,
+        'scheme' => 'public',
+        'directory' => 'inline-images',
+        'max_size' => '',
+        'max_dimensions' => [
+          'width' => 0,
+          'height' => 0,
+        ],
+      ],
+    ])->save();
+
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    // Assert that image uploads are enabled initially.
+    $this->drupalGet('admin/config/content/formats/manage/cke4_image_uploads');
+    $this->assertTrue($page->hasCheckedField('Enable image uploads'));
+
+    // Switch the text format to CKEditor 5.
+    $page->selectFieldOption('editor[editor]', 'ckeditor5');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Assert that image uploads are still enabled.
+    $this->assertTrue($page->hasCheckedField('Enable image uploads'));
+  }
+
+  /**
+   * Confirm that switching to CKEditor 5 from another editor updates tags.
+   */
+  public function testSwitchToVersion5() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session, 'ckeditor');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Enable the HTML filter.
+    $this->assertTrue($page->hasUncheckedField('filters[filter_html][status]'));
+    $page->checkField('filters[filter_html][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Confirm the allowed HTML tags are the defaults for non-Ckeditor5 editors.
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $this->defaultElementsWhenUpdatingNotCkeditor5);
+
+    $this->saveNewTextFormat($page, $assert_session);
+    $assert_session->pageTextContains('Added text format ckeditor');
+
+    // Return to the config form to confirm that switching text editors on
+    // existing formats will properly switch allowed tags.
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $this->defaultElementsWhenUpdatingNotCkeditor5);
+
+    $page->selectFieldOption('editor[editor]', 'ckeditor5');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $this->assertTrue($page->find('css', '[name="editor[editor]"]')->hasClass('error'));
+    $this->assertNotEmpty($assert_session->waitForElement('css', '[data-ckeditor5-allowed-tags-info]'));
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $this->defaultElementsWhenUpdatingNotCkeditor5);
+
+    $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $allowed_html_field->setValue('<p> <br>');
+
+    $page->pressButton('update-ckeditor5-allowed-tags');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertFalse($page->find('css', '[name="editor[editor]"]')->hasClass('error'));
+    $page->pressButton('Save configuration');
+
+    $assert_session->pageTextContains('The Image upload toolbar item requires image uploads to be enabled.');
+    $page->clickLink('Image Upload');
+    $assert_session->waitForText('Enable image uploads');
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_imageUpload][status]'));
+    $page->checkField('editor[settings][plugins][ckeditor5_imageUpload][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+
+    $assert_session->pageTextContains('The text format ckeditor has been updated');
+  }
+
+  /**
+   * Tests the language config form.
+   */
+  public function testLanguageConfigForm() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // The language plugin config form should not be present.
+    $assert_session->elementNotExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-language"]');
+
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-textPartLanguage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-textPartLanguage', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // The language plugin config form should now be present.
+    $assert_session->elementExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-language"]');
+  }
+
+  /**
+   * Tests that the img tag is added after enabling image uploads.
+   */
+  public function testImgAddedViaUploadPlugin() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $this->assertTrue($allowed_html_field->hasAttribute('readonly'));
+
+    // Allowed tags are currently the default, with no <img>.
+    $this->assertEquals($this->allowedElements, $allowed_html_field->getValue());
+
+    // The image upload settings form should not be present.
+    $assert_session->elementNotExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-imageupload"]');
+
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-uploadImage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-uploadImage', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // The image upload settings form should now be present.
+    $assert_session->elementExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-imageupload"]');
+
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-active .ckeditor5-toolbar-item-uploadImage'));
+
+    // The image upload plugin is enabled, but <img> not yet allowed.
+    $this->assertEquals($this->allowedElements, $allowed_html_field->getValue());
+
+    $page->clickLink('Image Upload');
+    $assert_session->waitForText('Enable image uploads');
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_imageUpload][status]'));
+    $page->checkField('editor[settings][plugins][ckeditor5_imageUpload][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Enabling image uploads adds <img> with several attributes to allowed
+    // tags.
+    $this->assertEquals($this->allowedElements . ' <img src alt data-entity-uuid data-entity-type height width>', $allowed_html_field->getValue());
+
+    // Also enabling the caption filter will add the data-caption attribute to
+    // <img>.
+    $this->assertTrue($page->hasUncheckedField('filters[filter_caption][status]'));
+    $page->checkField('filters[filter_caption][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertEquals($this->allowedElements . ' <img src alt data-entity-uuid data-entity-type height width data-caption>', $allowed_html_field->getValue());
+
+    // Also enabling the alignment filter will add the data-align attribute to
+    // <img>.
+    $this->assertTrue($page->hasUncheckedField('filters[filter_align][status]'));
+    $page->checkField('filters[filter_align][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertEquals($this->allowedElements . ' <img src alt data-entity-uuid data-entity-type height width data-caption data-align>', $allowed_html_field->getValue());
+
+    // Disable image upload.
+    $page->clickLink('Image Upload');
+    $assert_session->waitForText('Enable image uploads');
+    $this->assertTrue($page->hasCheckedField('editor[settings][plugins][ckeditor5_imageUpload][status]'));
+    $page->uncheckField('editor[settings][plugins][ckeditor5_imageUpload][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Confirm <img> is no longer an allowed tag, once image upload disabled.
+    $this->assertEquals($this->allowedElements, $allowed_html_field->getValue());
+  }
+
+  /**
+   * Test filter_html allowed tags.
+   */
+  public function testAllowedTags() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Confirm the "allowed tags" field is  read only, and the value
+    // matches the tags required by CKEditor.
+    // Allowed HTML field is readonly and its wrapper has a form-disabled class.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.js-form-item-filters-filter-html-settings-allowed-html.form-disabled'));
+    $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $this->assertTrue($allowed_html_field->hasAttribute('readonly'));
+    $this->assertSame($this->allowedElements, $allowed_html_field->getValue());
+    $this->saveNewTextFormat($page, $assert_session);
+
+    $assert_session->pageTextContains('Added text format ckeditor5');
+    $assert_session->pageTextContains('Text formats and editors');
+
+    // Confirm the filter config was updated with the correct allowed tags.
+    $this->assertSame($this->allowedElements, FilterFormat::load('ckeditor5')->filters('filter_html')->getConfiguration()['settings']['allowed_html']);
+
+    $page->find('css', '[data-drupal-selector="edit-formats-ckeditor5"]')->clickLink('Configure');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Add the block quote plugin to the CKEditor 5 toolbar.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-blockQuote'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-blockQuote', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $allowed_with_blockquote = $this->allowedElements . ' <blockquote>';
+    $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $allowed_with_blockquote);
+
+    $page->pressButton('Save configuration');
+    $assert_session->pageTextContains('The text format ckeditor5 has been updated.');
+
+    // Flush caches so the updated config can be checked.
+    drupal_flush_all_caches();
+
+    // Confirm that the tags required by the newly-added plugins were correctly
+    // saved.
+    $this->assertSame($allowed_with_blockquote, FilterFormat::load('ckeditor5')->filters('filter_html')->getConfiguration()['settings']['allowed_html']);
+
+    $page->find('css', '[data-drupal-selector="edit-formats-ckeditor5"]')->clickLink('Configure');
+
+    // And for good measure, confirm the correct tags are in the form field when
+    // returning to the form.
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $allowed_with_blockquote);
+
+    // Add the source editing plugin to the CKEditor 5 toolbar.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-sourceEditing'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-sourceEditing', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Updating Source Editing's editable tags should automatically update
+    // filter_html to include those additional tags.
+    $assert_session->waitForText('Source editing');
+    $page->find('css', '[href^="#edit-editor-settings-plugins-ckeditor5-sourceediting"]')->click();
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->waitForText('Manually editable HTML tags');
+    $source_edit_tags_field = $assert_session->fieldExists('editor[settings][plugins][ckeditor5_sourceEditing][allowed_tags]');
+    $source_edit_tags_field->setValue('<aside>');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', '<br> <p> <h2> <h3> <h4> <h5> <h6> <aside> <strong> <em> <blockquote>');
+    $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $this->assertTrue($allowed_html_field->hasAttribute('readonly'));
+
+    // Adding tags to Source Editing's editable tags that are already supported
+    // by enabled CKEditor 5 plugins must trigger a validation error, and that
+    // error must be associated with the correct form item.
+    $source_edit_tags_field->setValue('<aside><strong>');
+    $assert_session->waitForText('The following tag(s) are already supported by enabled plugins and should not be added to the Source Editing "Manually editable HTML tags" field: Bold (<strong>)');
+    $this->assertTrue($page->find('css', '[href^="#edit-editor-settings-plugins-ckeditor5-sourceediting"]')->getParent()->hasClass('is-selected'));
+    $this->assertSame('true', $page->findField('editor[settings][plugins][ckeditor5_sourceEditing][allowed_tags]')->getAttribute('aria-invalid'));
+    $this->assertTrue($allowed_html_field->hasAttribute('readonly'));
+
+    // The same validation error appears when saving the form regardless of the
+    // immediate AJAX validation error above.
+    $page->pressButton('Save configuration');
+    $assert_session->pageTextContains('The following tag(s) are already supported by enabled plugins and should not be added to the Source Editing "Manually editable HTML tags" field: Bold (<strong>)');
+    $this->assertTrue($page->find('css', '[href^="#edit-editor-settings-plugins-ckeditor5-sourceediting"]')->getParent()->hasClass('is-selected'));
+    $this->assertSame('true', $page->findField('editor[settings][plugins][ckeditor5_sourceEditing][allowed_tags]')->getAttribute('aria-invalid'));
+    $assert_session->pageTextNotContains('The text format ckeditor5 has been updated');
+
+    // Wait for the "Source editing" vertical tab to appear, remove the already
+    // supported tags and re-save. Now the text format should save successfully.
+    $assert_session->waitForText('Source editing');
+    $page->find('css', '[href^="#edit-editor-settings-plugins-ckeditor5-sourceediting"]')->click();
+    $assert_session->pageTextContains('Manually editable HTML tags');
+    $source_edit_tags_field = $assert_session->fieldExists('editor[settings][plugins][ckeditor5_sourceEditing][allowed_tags]');
+    $source_edit_tags_field->setValue('<aside>');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+    $assert_session->pageTextContains('The text format ckeditor5 has been updated');
+    $assert_session->pageTextNotContains('The following tag(s) are already supported by enabled plugins and should not be added to the Source Editing "Manually editable HTML tags" field: Bold (<strong>)');
+
+    // Ensure that CKEditor can be initialized with Source Editing.
+    // @see https://www.drupal.org/i/3231427
+    $this->drupalGet('node/add');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+  }
+
+  /**
+   * Test that <drupal-media> is added to allowed tags when media embed enabled.
+   */
+  public function testMediaElementAllowedTags() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+
+    // Allowed HTML field is readonly and its wrapper has a form-disabled class.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.js-form-item-filters-filter-html-settings-allowed-html.form-disabled'));
+    $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $this->assertTrue($allowed_html_field->hasAttribute('readonly'));
+
+    // Allowed tags are currently the default, with no <drupal-media>.
+    $this->assertEquals($this->allowedElements, $allowed_html_field->getValue());
+
+    // Enable media embed.
+    $this->assertTrue($page->hasUncheckedField('filters[media_embed][status]'));
+    $page->checkField('filters[media_embed][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->responseContains('Media types selectable in the Media Library');
+
+    $allowed_with_media = $this->allowedElements . ' ' . $this->mediaElement;
+    $assert_session->responseContains('Media types selectable in the Media Library');
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $allowed_with_media);
+    $this->saveNewTextFormat($page, $assert_session);
+    $assert_session->pageTextContains('Added text format ckeditor5.');
+
+    // Confirm <drupal-media> was added to allowed tags on save, as a result of
+    // enabling the media embed filter.
+    $this->assertSame($allowed_with_media, FilterFormat::load('ckeditor5')->filters('filter_html')->getConfiguration()['settings']['allowed_html']);
+
+    $page->find('css', '[data-drupal-selector="edit-formats-ckeditor5"]')->clickLink('Configure');
+
+    // Confirm that <drupal-media> is now included in the "Allowed tags" form
+    // field.
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $allowed_with_media);
+
+    // Disable media embed.
+    $this->assertTrue($page->hasCheckedField('filters[media_embed][status]'));
+    $page->uncheckField('filters[media_embed][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Confirm allowed tags no longer has <drupal-media>.
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $this->allowedElements);
+  }
+
+  /**
+   * Tests the presence of the IE warning when CKEditor 5 is selected.
+   */
+  public function testInternetExplorerWarning() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+    $warning_text = 'CKEditor 5 is not compatible with Internet Explorer 11. Fields using CKEditor 5 will still be editable but without the benefits of CKEditor.';
+    $this->createNewTextFormat($page, $assert_session);
+    $assert_session->waitForText($warning_text);
+    $page->selectFieldOption('editor[editor]', 'None');
+    $this->getSession()->getDriver()->executeScript("document.querySelector('#drupal-live-announce').innerHTML = ''");
+    $assert_session->assertNoElementAfterWait('css', '.messages--warning');
+    $assert_session->pageTextNotContains($warning_text);
+  }
+
+  /**
+   * Tests full HTML text format.
+   */
+  public function testFullHtml() {
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.full_html.yml')
+    )->save();
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.basic_html.yml')
+    )->save();
+
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    // Add a node with text rendered via the Plain Text format.
+    $this->drupalGet('node/add');
+    $page->fillField('title[0][value]', 'My test content');
+    $page->fillField('body[0][value]', '<p><a style="color:#ff0000;" foo="bar" hreflang="en" href="https://example.com"><abbr title="National Aeronautics and Space Administration">NASA</abbr> is an acronym.</a></p>');
+    $page->pressButton('Save');
+
+    // Configure Full HTML text format to use CKEditor 5.
+    $this->drupalGet('admin/config/content/formats/manage/full_html');
+    $page->checkField('roles[authenticated]');
+    $page->selectFieldOption('editor[editor]', 'ckeditor5');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+    $this->assertTrue($assert_session->waitForText('The text format Full HTML has been updated.'));
+
+    // Change the node's text format to Full HTML.
+    $this->drupalGet('node/1/edit');
+    $page->selectFieldOption('body[0][format]', 'full_html');
+    $this->assertNotEmpty($assert_session->waitForText('Change text format?'));
+    $page->pressButton('Continue');
+
+    // Ensure the editor is loaded and ensure that arbitrary markup is retained.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+    $page->pressButton('Save');
+
+    // But note that the `style` attribute was stripped by
+    // \Drupal\editor\EditorXssFilter\Standard.
+    $assert_session->responseContains('<p><a href="https://example.com" hreflang="en" foo="bar"><abbr title="National Aeronautics and Space Administration">NASA</abbr> is an acronym.</a></p>');
+
+    // Ensure attributes are retained after enabling link plugin.
+    $this->drupalGet('admin/config/content/formats/manage/full_html');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-link'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-link', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+
+    $this->drupalGet('node/1/edit');
+    $page->pressButton('Save');
+
+    $assert_session->responseContains('<p><a href="https://example.com" hreflang="en" foo="bar"><abbr title="National Aeronautics and Space Administration">NASA</abbr> is an acronym.</a></p>');
+
+    // Configure Basic HTML text format to use CKE5 and enable the link plugin.
+    $this->drupalGet('admin/config/content/formats/manage/basic_html');
+    $page->checkField('roles[authenticated]');
+    $page->selectFieldOption('editor[editor]', 'ckeditor5');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-link'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-link', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+    $this->assertTrue($assert_session->waitForText('The text format Basic HTML has been updated.'));
+
+    // Change the node's text format to Basic HTML.
+    $this->drupalGet('node/1/edit');
+    $page->selectFieldOption('body[0][format]', 'basic_html');
+    $this->assertNotEmpty($assert_session->waitForText('Change text format?'));
+    $page->pressButton('Continue');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save');
+
+    // The `style` and foo` attributes should have been removed, as should the
+    // `<abbr>` tag.
+    $assert_session->responseContains('<p><a href="https://example.com" hreflang="en">NASA is an acronym.</a></p>');
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5CKEditor4Compatibility.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5CKEditor4Compatibility.php
new file mode 100644
index 0000000000000000000000000000000000000000..b6e4b42f6743896a824265b245c9f7df1f24a14c
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5CKEditor4Compatibility.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\Core\Entity\Entity\EntityFormDisplay;
+use Drupal\editor\Entity\Editor;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\filter\Entity\FilterFormat;
+use Symfony\Component\Validator\ConstraintViolation;
+
+/**
+ * Ensures that CKEditor 5 can be used on the same page with CKEditor 4.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class CKEditor5CKEditor4Compatibility extends CKEditor5TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'ckeditor',
+    'ckeditor5_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    $current_user_roles = $this->loggedInUser->getRoles(TRUE);
+
+    // Create text format, text editor and text fields for CKEditor 5 and 4.
+    foreach ([5 => 'ckeditor5', 4 => 'ckeditor'] as $version => $text_editor_plugin_id) {
+      $format_id = sprintf('test_format_for_ckeditor%d', $version);
+      $field_name = sprintf('field_text_ckeditor%d', $version);
+
+      FilterFormat::create([
+        'format' => $format_id,
+        'name' => sprintf('CKEditor %d editor', $version),
+        'roles' => $current_user_roles,
+        'filters' => [
+          'filter_html' => [
+            'status' => TRUE,
+            'settings' => [
+              'allowed_html' => '<p> <br> <h2> <h3> <h4> <h5> <h6> <strong> <em>',
+            ],
+          ],
+        ],
+      ])->save();
+      Editor::create([
+        'editor' => $text_editor_plugin_id,
+        'format' => $format_id,
+        'settings' => $version === 4 ? [] : [
+          'toolbar' => [
+            'items' => ['heading', 'bold', 'italic'],
+          ],
+          'plugins' => [
+            'ckeditor5_heading' => [
+              'enabled_headings' => [
+                'heading2',
+                'heading3',
+                'heading4',
+                'heading5',
+                'heading6',
+              ],
+            ],
+          ],
+        ],
+        'image_upload' => [
+          'status' => FALSE,
+        ],
+      ])->save();
+      if ($version === 5) {
+        $this->assertSame([], array_map(
+          function (ConstraintViolation $v) {
+            return (string) $v->getMessage();
+          },
+          iterator_to_array(CKEditor5::validatePair(
+            Editor::load($format_id),
+            FilterFormat::load($format_id)
+          ))
+        ));
+      }
+      $field_storage = FieldStorageConfig::create([
+        'field_name' => $field_name,
+        'entity_type' => 'node',
+        'type' => 'text_long',
+      ]);
+      $field_storage->save();
+      FieldConfig::create([
+        'field_storage' => $field_storage,
+        'entity_type' => 'node',
+        'bundle' => 'page',
+      ])->save();
+
+      // Add the new field to the default form display.
+      EntityFormDisplay::load('node.page.default')
+        ->setComponent($field_name, ['type' => 'text_textarea'])
+        ->save();
+    }
+  }
+
+  /**
+   * Ensures that CKEditor 5 and CKEditor 4 can be used on the same page.
+   */
+  public function testCkeCompatibility() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->drupalGet('node/add/page');
+    $page->selectFieldOption('field_text_ckeditor4[0][format]', 'test_format_for_ckeditor4');
+    $page->selectFieldOption('field_text_ckeditor5[0][format]', 'test_format_for_ckeditor5');
+
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.cke_wysiwyg_frame'));
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5OffCanvasTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5OffCanvasTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b8e2f102ec45c54df4fd7e46b0ef61ccee0d0a89
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5OffCanvasTest.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+/**
+ * Tests for CKEditor5 to ensure correct styling in off-canvas.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class CKEditor5OffCanvasTest extends CKEditor5TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'node',
+    'ckeditor5',
+    'ckeditor5_test',
+  ];
+
+  /**
+   * Tests if CKEditor is properly styled inside an off-canvas dialog.
+   */
+  public function testOffCanvasStyles() {
+    $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
+
+    $this->addNewTextFormat($page, $assert_session);
+
+    $this->drupalGet('/ckeditor5_test/off_canvas');
+
+    // The "Add Node" link triggers an off-canvas dialog with an add node form
+    // that includes CKEditor.
+    $page->clickLink('Add Node');
+    $assert_session->waitForElementVisible('css', '#drupal-off-canvas');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $styles = $assert_session->elementExists('css', 'style#ckeditor5-off-canvas-reset');
+    $this->stringContains('#drupal-off-canvas [data-drupal-ck-style-fence]', $styles->getText());
+
+    $assert_session->elementExists('css', '.ck');
+
+    $ckeditor_toolbar_bg_color = $this->getSession()->evaluateScript('window.getComputedStyle(document.querySelector(\'.ck.ck-toolbar\')).backgroundColor');
+    $this->assertEquals('rgb(250, 250, 250)', $ckeditor_toolbar_bg_color, 'Toolbar background-color should be unaffected by off-canvas');
+    // Editable area should be visible.
+    $assert_session->elementExists('css', '.ck .ck-content');
+    $ckeditor_editable_bg_color = $this->getSession()->evaluateScript('window.getComputedStyle(document.querySelector(\'.ck.ck-content\')).backgroundColor');
+    $this->assertEquals('rgb(255, 255, 255)', $ckeditor_editable_bg_color, 'Content background-color should be unaffected by off-canvas');
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5Test.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5Test.php
new file mode 100644
index 0000000000000000000000000000000000000000..deb37c9455fb596ec4b67718b1664749fafa1ff0
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5Test.php
@@ -0,0 +1,472 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\Core\Language\LanguageManager;
+use Drupal\editor\Entity\Editor;
+use Drupal\file\Entity\File;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\node\Entity\Node;
+use Drupal\Tests\TestFileCreationTrait;
+use Drupal\user\RoleInterface;
+use Symfony\Component\Validator\ConstraintViolation;
+
+// cspell:ignore esque upcasted
+
+/**
+ * Tests for CKEditor5.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class CKEditor5Test extends CKEditor5TestBase {
+
+  use TestFileCreationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'media_library',
+  ];
+
+  /**
+   * Tests configuring CKEditor5 for existing content.
+   */
+  public function testExistingContent() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    // Add a node with text rendered via the Plain Text format.
+    $this->drupalGet('node/add');
+    $page->fillField('title[0][value]', 'My test content');
+    $page->fillField('body[0][value]', '<p>This is test content</p>');
+    $page->pressButton('Save');
+    $assert_session->responseNotContains('<p>This is test content</p>');
+    $assert_session->responseContains('&lt;p&gt;This is test content&lt;/p&gt;');
+
+    $this->addNewTextFormat($page, $assert_session);
+
+    // Change the node to use the new text format.
+    $this->drupalGet('node/1/edit');
+
+    // Confirm that the JavaScript that generates IE11 warnings loads.
+    $assert_session->elementExists('css', 'script[src*="ckeditor5/js/ie11.user.warnings.js"]');
+
+    $page->selectFieldOption('body[0][format]', 'ckeditor5');
+    $this->assertNotEmpty($assert_session->waitForText('Change text format?'));
+    $page->pressButton('Continue');
+    // Ensure the editor is loaded.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+    $page->pressButton('Save');
+
+    // Assert that the HTML is rendered correctly.
+    $assert_session->responseContains('<p>This is test content</p>');
+    $assert_session->responseNotContains('&lt;p&gt;This is test content&lt;/p&gt;');
+  }
+
+  /**
+   * Ensures that attribute values are encoded.
+   */
+  public function testAttributeEncoding() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    FilterFormat::create([
+      'format' => 'ckeditor5',
+      'name' => 'CKEditor 5 with image upload',
+      'roles' => [RoleInterface::AUTHENTICATED_ID],
+    ])->save();
+    Editor::create([
+      'format' => 'ckeditor5',
+      'editor' => 'ckeditor5',
+      'settings' => [
+        'toolbar' => [
+          'items' => ['uploadImage'],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => TRUE,
+        'scheme' => 'public',
+        'directory' => 'inline-images',
+        'max_size' => '',
+      ],
+    ])->save();
+    $this->assertSame([], array_map(
+      function (ConstraintViolation $v) {
+        return (string) $v->getMessage();
+      },
+      iterator_to_array(CKEditor5::validatePair(
+        Editor::load('ckeditor5'),
+        FilterFormat::load('ckeditor5')
+      ))
+    ));
+
+    $this->drupalGet('node/add');
+    $page->fillField('title[0][value]', 'My test content');
+    $this->assertNotEmpty($image_upload_field = $page->find('css', '.ck-file-dialog-button input[type="file"]'));
+    $image = $this->getTestFiles('image')[0];
+    $image_upload_field->attachFile($this->container->get('file_system')->realpath($image->uri));
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $this->click('.ck-widget.image');
+    $balloon_panel = $page->find('css', '.ck-balloon-panel');
+    $balloon_buttons = $balloon_panel->findAll('css', '[aria-label="Image toolbar"] button');
+    $this->assertSame('Change image text alternative', $balloon_buttons[0]->find('css', '.ck-button__label')->getHtml());
+    $balloon_buttons[0]->click();
+    $assert_session->waitForElementVisible('css', '.ck-balloon-panel .ck-text-alternative-form');
+    $alt_override_input = $page->find('css', '.ck-balloon-panel .ck-text-alternative-form input[type=text]');
+    $this->assertSame('', $alt_override_input->getValue());
+    $alt_override_input->setValue('</em> Kittens & llamas are cute');
+    $balloon_panel->pressButton('Save');
+    $page->pressButton('Save');
+
+    $uploaded_image = File::load(1);
+    $image_uuid = $uploaded_image->uuid();
+    $image_url = $this->container->get('file_url_generator')->generateString($uploaded_image->getFileUri());
+    $this->drupalGet('node/1');
+    $assert_session->elementExists('xpath', sprintf('//img[@alt="</em> Kittens & llamas are cute" and @data-entity-uuid="%s" and @data-entity-type="file"]', $image_uuid));
+
+    // Drupal CKEditor 5 integrations overrides the CKEditor 5 HTML writer to
+    // escape ampersand characters (&) and the angle brackets (< and >). This is
+    // required because \Drupal\Component\Utility\Xss::filter fails to parse
+    // element attributes with unescaped entities in value.
+    // @see https://www.drupal.org/project/drupal/issues/3227831
+    $this->assertEquals(sprintf('<img data-entity-uuid="%s" data-entity-type="file" src="%s" alt="&lt;/em&gt; Kittens &amp; llamas are cute">', $image_uuid, $image_url), Node::load(1)->get('body')->value);
+  }
+
+  /**
+   * Test headings configuration.
+   */
+  public function testHeadingsPlugin() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->addNewTextFormat($page, $assert_session);
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor5');
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', '<br> <p> <h2> <h3> <h4> <h5> <h6> <strong> <em>');
+
+    $this->drupalGet('node/add');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-heading-dropdown button'));
+
+    $page->find('css', '.ck-heading-dropdown button')->click();
+
+    // Get all the headings available in dropdown.
+    $headings_dropdown = $page->findAll('css', '.ck-heading-dropdown li .ck-button__label');
+
+    // Create array of available headings.
+    $available_headings = [];
+    foreach ($headings_dropdown as $item) {
+      $available_headings[] = $item->getText();
+    }
+
+    $this->assertSame([
+      'Paragraph',
+      'Heading 2',
+      'Heading 3',
+      'Heading 4',
+      'Heading 5',
+      'Heading 6',
+    ], $available_headings);
+
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor5');
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading1]'));
+    $page->checkField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading1]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertTrue($page->hasCheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading1]'));
+    $this->assertTrue($page->hasCheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading2]'));
+    $page->uncheckField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading2]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading2]'));
+    $this->assertTrue($page->hasCheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading4]'));
+    $page->uncheckField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading4]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading4]'));
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', '<br> <p> <h1> <h3> <h5> <h6> <strong> <em>');
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading4]'));
+
+    $page->pressButton('Save configuration');
+
+    $this->drupalGet('node/add');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-heading-dropdown button'));
+
+    $page->find('css', '.ck-heading-dropdown button')->click();
+
+    // Get all the headings available in dropdown.
+    $headings_dropdown = $page->findAll('css', '.ck-heading-dropdown li .ck-button__label');
+
+    // Create array of available headings.
+    $available_headings = [];
+    foreach ($headings_dropdown as $item) {
+      $available_headings[] = $item->getText();
+    }
+
+    $this->assertSame([
+      'Paragraph',
+      'Heading 1',
+      'Heading 3',
+      'Heading 5',
+      'Heading 6',
+    ], $available_headings);
+  }
+
+  /**
+   * Test for plugin Language of parts.
+   */
+  public function testLanguageOfPartsPlugin() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    // Press arrow down key to add the button to the active toolbar.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-textPartLanguage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-textPartLanguage', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Test for "United Nations' official languages" option.
+    $languages = LanguageManager::getUnitedNationsLanguageList();
+    $this->languageOfPartsPluginTestHelper($page, $assert_session, $languages, "un");
+
+    // Test for "All 95 languages" option.
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor5');
+    $languages = LanguageManager::getStandardLanguageList();
+    $this->languageOfPartsPluginTestHelper($page, $assert_session, $languages, "all");
+  }
+
+  /**
+   * Validate the available languages on the basis of selected language option.
+   */
+  public function languageOfPartsPluginTestHelper($page, $assert_session, $predefined_languages, $option) {
+    $this->assertNotEmpty($assert_session->waitForElement('css', 'a[href^="#edit-editor-settings-plugins-ckeditor5-language"]'));
+
+    // Set correct value.
+    $vertical_tab_link = $page->find('xpath', "//ul[contains(@class, 'vertical-tabs__menu')]/li/a[starts-with(@href, '#edit-editor-settings-plugins-ckeditor5-language')]");
+    $vertical_tab_link->click();
+    $page->selectFieldOption('editor[settings][plugins][ckeditor5_language][language_list]', $option);
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+
+    // Validate plugin on node add page.
+    $this->drupalGet('node/add');
+    $this->assertNotEmpty($assert_session->waitForText('Choose language'));
+
+    // Click on the dropdown button.
+    $page->find('css', '.ck-text-fragment-language-dropdown button')->click();
+
+    // Get all the languages available in dropdown.
+    $current_languages = $page->findAll('css', '.ck-text-fragment-language-dropdown li .ck-button__label');
+
+    // Remove "Remove language" element from current languages.
+    array_shift($current_languages);
+
+    // Create array of full language name.
+    $languages = [];
+    foreach ($current_languages as $item) {
+      $languages[] = $item->getText();
+    }
+    // Return the values from a single column.
+    $predefined_languages = array_column($predefined_languages, 0);
+
+    // Sort on full language name.
+    asort($predefined_languages);
+
+    $this->assertSame(array_values($predefined_languages), $languages);
+  }
+
+  /**
+   * Confirms active tab status is intact after AJAX refresh.
+   */
+  public function testActiveTabsMaintained() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Ensure the HTML filter tab is visible.
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'a[href^="#edit-filters-filter-html-settings"]'));
+
+    // Enable media embed to make a second filter config tab visible.
+    $this->assertTrue($page->hasUncheckedField('filters[media_embed][status]'));
+    $page->checkField('filters[media_embed][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->responseContains('Media types selectable in the Media Library');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Enable upload image to add one plugin config form.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-uploadImage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-uploadImage', 'ArrowDown');
+    // cSpell:disable-next-line
+    $this->assertNotEmpty($assert_session->waitForElement('css', 'a[href^="#edit-editor-settings-plugins-ckeditor5-imageupload"]'));
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-active .ckeditor5-toolbar-item-uploadImage'));
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $page->clickLink('Image Upload');
+    $assert_session->waitForText('Enable image uploads');
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_imageUpload][status]'));
+    $page->checkField('editor[settings][plugins][ckeditor5_imageUpload][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Enable language to add a second plugin config form.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-textPartLanguage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-textPartLanguage', 'ArrowDown');
+    $this->assertNotEmpty($assert_session->waitForElement('css', 'a[href^="#edit-editor-settings-plugins-ckeditor5-language"]'));
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-active .ckeditor5-toolbar-item-textPartLanguage'));
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Save configuration');
+    $assert_session->pageTextContains('Added text format ckeditor5');
+
+    // Leave and return to the config form, both sets of tabs should then have
+    // the first tab active by default.
+    $this->drupalGet('admin/config/content/formats/');
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor5');
+
+    $assert_session->waitForElement('css', '.vertical-tabs__menu-item.is-selected');
+
+    $plugin_settings_vertical_tabs = $page->findAll('css', '#plugin-settings-wrapper .vertical-tabs__menu-item');
+    $filter_settings = $page->find('xpath', '//*[contains(@class, "js-form-type-vertical-tabs")]/label[contains(text(), "Filter settings")]/..');
+    $filter_settings_vertical_tabs = $filter_settings->findAll('css', '.vertical-tabs__menu-item');
+
+    $this->assertTrue($plugin_settings_vertical_tabs[0]->hasClass('is-selected'), "Expected plugin tab 1 selected on initial build");
+    $this->assertFalse($plugin_settings_vertical_tabs[1]->hasClass('is-selected'), "Expected plugin tab 2 not selected on initial build");
+
+    $this->assertFalse($filter_settings_vertical_tabs[0]->hasClass('is-selected'), "Expected filter tab 1 not selected on initial build");
+    $this->assertTrue($filter_settings_vertical_tabs[2]->hasClass('is-selected'), "Expected (visible) filter tab 2 selected on initial build");
+
+    $plugin_settings_vertical_tabs[1]->click();
+    $filter_settings_vertical_tabs[0]->click();
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $this->assertFalse($plugin_settings_vertical_tabs[0]->hasClass('is-selected'), "Expected plugin tab 1 deselected after click");
+    $this->assertTrue($plugin_settings_vertical_tabs[1]->hasClass('is-selected'), "Expected plugin tab 2 selected after click");
+
+    $this->assertTrue($filter_settings_vertical_tabs[0]->hasClass('is-selected'), "Expected filter tab 1 selected after click");
+    $this->assertFalse($filter_settings_vertical_tabs[2]->hasClass('is-selected'), "Expected (visible) filter tab 2 deselected after click");
+
+    // Add a plugin just to trigger AJAX refresh.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-blockQuote'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-blockQuote', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $this->assertFalse($plugin_settings_vertical_tabs[0]->hasClass('is-selected'), "Expected plugin tab 1 deselected after AJAX refresh");
+    $this->assertTrue($plugin_settings_vertical_tabs[1]->hasClass('is-selected'), "Expected plugin tab 2 selected after AJAX refresh");
+
+    $this->assertTrue($filter_settings_vertical_tabs[0]->hasClass('is-selected'), "Expected filter tab 1 selected after AJAX refresh");
+    $this->assertFalse($filter_settings_vertical_tabs[1]->hasClass('is-selected'), "Expected filter tab 2 deselected after AJAX refresh");
+  }
+
+  /**
+   * Ensures that CKEditor 5 integrates with file reference filter.
+   */
+  public function testEditorFileReferenceIntegration() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-uploadImage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-uploadImage', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->clickLink('Image Upload');
+    $page->checkField('editor[settings][plugins][ckeditor5_imageUpload][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->checkField('filters[editor_file_reference][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->saveNewTextFormat($page, $assert_session);
+
+    $this->drupalGet('node/add');
+    $page->fillField('title[0][value]', 'My test content');
+    $this->assertNotEmpty($image_upload_field = $page->find('css', '.ck-file-dialog-button input[type="file"]'));
+    $image = $this->getTestFiles('image')[0];
+    $image_upload_field->attachFile($this->container->get('file_system')->realpath($image->uri));
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save');
+
+    $uploaded_image = File::load(1);
+    $image_url = $this->container->get('file_url_generator')->generateString($uploaded_image->getFileUri());
+    $image_uuid = $uploaded_image->uuid();
+    $assert_session->elementExists('xpath', sprintf('//img[@src="%s" and @loading="lazy" and @width and @height and @data-entity-uuid="%s" and @data-entity-type="file"]', $image_url, $image_uuid));
+
+    // Ensure that width, height, and length attributes are not stored in the
+    // database.
+    $this->assertEquals(sprintf('<img data-entity-uuid="%s" data-entity-type="file" src="%s">', $image_uuid, $image_url), Node::load(1)->get('body')->value);
+
+    // Ensure that data-entity-uuid and data-entity-type attributes are upcasted
+    // correctly to CKEditor model.
+    $this->drupalGet('node/1/edit');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+    $page->pressButton('Save');
+
+    $assert_session->elementExists('xpath', sprintf('//img[@src="%s" and @loading="lazy" and @width and @height and @data-entity-uuid="%s" and @data-entity-type="file"]', $image_url, $image_uuid));
+  }
+
+  /**
+   * Ensures that CKEditor italic model is converted to em.
+   */
+  public function testEmphasis() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    // Add a node with text rendered via the Plain Text format.
+    $this->drupalGet('node/add');
+    $page->fillField('title[0][value]', 'My test content');
+    $page->fillField('body[0][value]', '<p>This is a <em>test!</em></p>');
+    $page->pressButton('Save');
+
+    $this->createNewTextFormat($page, $assert_session);
+    $this->saveNewTextFormat($page, $assert_session);
+
+    $this->drupalGet('node/1/edit');
+    $page->selectFieldOption('body[0][format]', 'ckeditor5');
+    $this->assertNotEmpty($assert_session->waitForText('Change text format?'));
+    $page->pressButton('Continue');
+
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+    $page->pressButton('Save');
+
+    $assert_session->responseContains('<p>This is a <em>test!</em></p>');
+  }
+
+  /**
+   * Ensures that images can have caption set.
+   */
+  public function testImageCaption() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    // Add a node with text rendered via the Plain Text format.
+    $this->drupalGet('node/add');
+    $page->fillField('title[0][value]', 'My test content');
+    // Add image with data-caption. The foo attribute is added to be removed
+    // later by CKEditor to make sure CKEditor was able to downcast data.
+    $page->fillField('body[0][value]', '<img src="/sites/default/files/alpaca.jpg" data-caption="Alpacas &lt;em&gt;are&lt;/em&gt; cute" foo="bar">');
+    $page->pressButton('Save');
+
+    $this->createNewTextFormat($page, $assert_session);
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-uploadImage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-uploadImage', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->clickLink('Image Upload');
+    $assert_session->waitForText('Enable image uploads');
+    $page->checkField('editor[settings][plugins][ckeditor5_imageUpload][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->checkField('filters[filter_caption][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->saveNewTextFormat($page, $assert_session);
+
+    $this->drupalGet('node/1/edit');
+    $page->selectFieldOption('body[0][format]', 'ckeditor5');
+    $this->assertNotEmpty($assert_session->waitForText('Change text format?'));
+    $page->pressButton('Continue');
+
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+    $page->pressButton('Save');
+
+    $this->assertEquals('<img src="/sites/default/files/alpaca.jpg" data-caption="Alpacas &lt;em&gt;are&lt;/em&gt; cute">', Node::load(1)->get('body')->value);
+    $assert_session->elementExists('xpath', '//figure/img[@src="/sites/default/files/alpaca.jpg" and not(@data-caption)]');
+    $assert_session->responseContains('<figcaption>Alpacas <em>are</em> cute</figcaption>');
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5TestBase.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5TestBase.php
new file mode 100644
index 0000000000000000000000000000000000000000..052ba5e0d1d1da327f72547355a26e4c59e3f008
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5TestBase.php
@@ -0,0 +1,140 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Behat\Mink\Element\TraversableElement;
+use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
+
+// cspell:ignore esque
+
+/**
+ * Base class for testing CKEditor 5.
+ *
+ * @ingroup testing
+ * @internal
+ */
+abstract class CKEditor5TestBase extends WebDriverTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'node',
+    'ckeditor5',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    $this->drupalCreateContentType(['type' => 'page']);
+
+    $this->drupalLogin($this->drupalCreateUser([
+      'administer filters',
+      'create page content',
+      'edit own page content',
+    ]));
+  }
+
+  /**
+   * Add and save a new text format using CKEditor 5.
+   */
+  public function addNewTextFormat($page, $assert_session, $name = 'ckeditor5') {
+    $this->createNewTextFormat($page, $assert_session, $name);
+    $this->saveNewTextFormat($page, $assert_session);
+  }
+
+  /**
+   * Create a new text format using CKEditor 5.
+   */
+  public function createNewTextFormat($page, $assert_session, $name = 'ckeditor5') {
+    $this->drupalGet('admin/config/content/formats/add');
+    $page->fillField('name', $name);
+    $assert_session->waitForText('Machine name');
+    $this->assertNotEmpty($assert_session->waitForText($name));
+    $page->checkField('roles[authenticated]');
+
+    if ($name === 'ckeditor5') {
+      // Enable the HTML filter, at least one HTML restricting filter is needed
+      // before CKEditor 5 can be enabled.
+      $this->assertTrue($page->hasUncheckedField('filters[filter_html][status]'));
+      $page->checkField('filters[filter_html][status]');
+      $assert_session->assertWaitOnAjaxRequest();
+
+      // Add the tags that must be included in the html filter for CKEditor 5.
+      $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+      $allowed_html_field->setValue('<p> <br>');
+    }
+    $page->selectFieldOption('editor[editor]', $name);
+  }
+
+  /**
+   * Save the new text format.
+   */
+  public function saveNewTextFormat($page, $assert_session) {
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+    $this->assertTrue($assert_session->waitForText('Added text format'), "Confirm new text format saved");
+  }
+
+  /**
+   * Trigger a keyup event on the selected element.
+   *
+   * @param string $selector
+   *   The css selector for the element.
+   * @param string $key
+   *   The keyCode.
+   */
+  protected function triggerKeyUp(string $selector, string $key) {
+
+    $script = <<<JS
+(function (selector, key) {
+  const btn = document.querySelector(selector);
+    btn.dispatchEvent(new KeyboardEvent('keydown', { key }));
+    btn.dispatchEvent(new KeyboardEvent('keyup', { key }));
+})('{$selector}', '{$key}')
+
+JS;
+
+    $options = [
+      'script' => $script,
+      'args' => [],
+    ];
+
+    $this->getSession()->getDriver()->getWebDriverSession()->execute($options);
+  }
+
+  /**
+   * Decorates ::fieldValueEquals() to force DrupalCI to provide useful errors.
+   *
+   * @param string $field
+   *   Field id|name|label|value.
+   * @param string $value
+   *   Field value.
+   * @param \Behat\Mink\Element\TraversableElement $container
+   *   Document to check against.
+   *
+   * @throws \Behat\Mink\Exception\ExpectationException
+   *
+   * @see \Behat\Mink\WebAssert::fieldValueEquals()
+   */
+  protected function assertHtmlEsqueFieldValueEquals($field, $value, TraversableElement $container = NULL) {
+    $assert_session = $this->assertSession();
+
+    $node = $assert_session->fieldExists($field, $container);
+    $actual = $node->getValue();
+    $regex = '/^' . preg_quote($value, '/') . '$/ui';
+
+    $message = sprintf('The field "%s" value is "%s", but "%s" expected.', $field, htmlspecialchars($actual), htmlspecialchars($value));
+
+    $assert_session->assert((bool) preg_match($regex, $actual), $message);
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/ImageTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/ImageTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..97a3209250ff90c9feafb95f7dcc238f496ba9f3
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/ImageTest.php
@@ -0,0 +1,313 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\editor\Entity\Editor;
+use Drupal\file\Entity\File;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
+use Drupal\Tests\TestFileCreationTrait;
+use Drupal\Tests\ckeditor5\Traits\CKEditor5TestTrait;
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Symfony\Component\Validator\ConstraintViolation;
+
+/**
+ * @coversDefaultClass \Drupal\ckeditor5\Plugin\CKEditor5Plugin\ImageUpload
+ * @group ckeditor5
+ * @internal
+ */
+class ImageTest extends WebDriverTestBase {
+
+  use CKEditor5TestTrait;
+  use TestFileCreationTrait;
+
+  /**
+   * The user to use during testing.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $adminUser;
+
+  /**
+   * The sample image File entity to embed.
+   *
+   * @var \Drupal\file\FileInterface
+   */
+  protected $file;
+
+  /**
+   * A host entity with a body field to embed images in.
+   *
+   * @var \Drupal\node\NodeInterface
+   */
+  protected $host;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'ckeditor5',
+    'node',
+    'text',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'classy';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    FilterFormat::create([
+      'format' => 'test_format',
+      'name' => 'Test format',
+      'filters' => [
+        'filter_html' => [
+          'status' => TRUE,
+          'settings' => [
+            'allowed_html' => '<p> <br> <a href> <img src alt data-entity-uuid data-entity-type height width data-caption data-align>',
+          ],
+        ],
+        'filter_align' => ['status' => TRUE],
+        'filter_caption' => ['status' => TRUE],
+      ],
+    ])->save();
+    Editor::create([
+      'editor' => 'ckeditor5',
+      'format' => 'test_format',
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'uploadImage',
+            'sourceEditing',
+            'link',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [],
+          ],
+        ],
+      ],
+      'image_upload' => [
+        'status' => TRUE,
+        'scheme' => 'public',
+        'directory' => 'inline-images',
+        'max_size' => '1M',
+        'max_dimensions' => ['width' => 100, 'height' => 100],
+      ],
+    ])->save();
+    $this->assertSame([], array_map(
+      function (ConstraintViolation $v) {
+        return (string) $v->getMessage();
+      },
+      iterator_to_array(CKEditor5::validatePair(
+        Editor::load('test_format'),
+        FilterFormat::load('test_format')
+      ))
+    ));
+    $this->adminUser = $this->drupalCreateUser([
+      'use text format test_format',
+      'bypass node access',
+    ]);
+
+    // Create a sample host entity to embed images in.
+    $this->file = File::create([
+      'uri' => $this->getTestFiles('image')[0]->uri,
+    ]);
+    $this->file->save();
+    $this->drupalCreateContentType(['type' => 'blog']);
+    $this->host = $this->createNode([
+      'type' => 'blog',
+      'title' => 'Animals with strange names',
+      'body' => [
+        'value' => '<p>The pirate is irate.</p>',
+        'format' => 'test_format',
+      ],
+    ]);
+    $this->host->save();
+
+    $this->drupalLogin($this->adminUser);
+  }
+
+  /**
+   * Tests linkability of the image CKEditor widget.
+   *
+   * Due to the complex overrides that `drupalImage.DrupalImage` is making, this
+   * is explicitly testing the "editingDowncast" and "dataDowncast" results.
+   * These are CKEditor 5 concepts.
+   *
+   * @see https://ckeditor.com/docs/ckeditor5/latest/framework/guides/architecture/editing-engine.html#conversion
+   *
+   * @dataProvider providerLinkability
+   */
+  public function testLinkability(string $image_type, bool $unrestricted) {
+    assert($image_type === 'inline' || $image_type === 'block');
+
+    // Disable filter_html.
+    if ($unrestricted) {
+      FilterFormat::load('test_format')
+        ->setFilterConfig('filter_html', ['status' => FALSE])
+        ->save();
+    }
+
+    // Make the test content have either a block image or an inline image.
+    $img_tag = '<img alt="drupalimage test image" data-entity-type="file" data-entity-uuid="' . $this->file->uuid() . '" src="' . $this->file->createFileUrl() . '" />';
+    $this->host->body->value .= $image_type === 'block'
+      ? $img_tag
+      : "<p>$img_tag</p>";
+    $this->host->save();
+    // Adjust the expectations accordingly.
+    $expected_widget_class = $image_type === 'block' ? 'image' : 'image-inline';
+
+    $page = $this->getSession()->getPage();
+
+    $this->drupalGet($this->host->toUrl('edit-form'));
+    $this->waitForEditor();
+    $assert_session = $this->assertSession();
+
+    // Initial state: the image CKEditor Widget is not selected.
+    $drupalimage = $assert_session->waitForElementVisible('css', ".ck-content .ck-widget.$expected_widget_class");
+    $this->assertNotEmpty($drupalimage);
+    $this->assertFalse($drupalimage->hasClass('.ck-widget_selected'));
+
+    // Assert the "editingDowncast" HTML before making changes.
+    $assert_session->elementExists('css', '.ck-content .ck-widget.' . $expected_widget_class . ' > img[src*="image-test.png"][alt="drupalimage test image"]');
+
+    // Assert the "dataDowncast" HTML before making changes.
+    $xpath = new \DOMXPath($this->getEditorDataAsDom());
+    $this->assertNotEmpty($xpath->query('//img[@alt="drupalimage test image"]'));
+    $this->assertEmpty($xpath->query('//a'));
+
+    // Assert the link button is present and not pressed.
+    $link_button = $this->getEditorButton('Link');
+    $this->assertSame('false', $link_button->getAttribute('aria-pressed'));
+
+    // Tests linking images.
+    $drupalimage->click();
+    $this->assertTrue($drupalimage->hasClass('ck-widget_selected'));
+    $this->assertEditorButtonEnabled('Link');
+    // Assert structure of image toolbar balloon.
+    $this->assertVisibleBalloon('.ck-toolbar[aria-label="Image toolbar"]');
+    $link_image_button = $this->getBalloonButton('Link image');
+    // Click the "Link image" button.
+    $this->assertSame('false', $link_image_button->getAttribute('aria-pressed'));
+    $link_image_button->press();
+    // Assert structure of link form balloon.
+    $balloon = $this->assertVisibleBalloon('.ck-link-form');
+    $url_input = $balloon->find('css', '.ck-labeled-field-view__input-wrapper .ck-input-text');
+    // Fill in link form balloon's <input> and hit "Save".
+    $url_input->setValue('http://www.drupal.org/association');
+    $balloon->pressButton('Save');
+
+    // Assert the "editingDowncast" HTML after making changes. First assert the
+    // link exists, then assert the expected DOM structure in detail.
+    $assert_session->elementExists('css', '.ck-content a[href*="//www.drupal.org/association"]');
+    // For inline images, the link is wrapping the widget; for block images the
+    // link lives inside the widget. (This is how it is implemented upstream, it
+    // could be implemented differently, we just want to ensure we do not break
+    // it. Drupal only cares about having its own "dataDowncast", the
+    // "editingDowncast" is considered an implementation detail.)
+    $assert_session->elementExists('css', $image_type === 'inline'
+      ? '.ck-content a[href*="//www.drupal.org/association"] .ck-widget.' . $expected_widget_class . ' > img[src*="image-test.png"][alt="drupalimage test image"]'
+      : '.ck-content .ck-widget.' . $expected_widget_class . ' a[href*="//www.drupal.org/association"] > img[src*="image-test.png"][alt="drupalimage test image"]'
+    );
+
+    // Assert the "dataDowncast" HTML after making changes.
+    $xpath = new \DOMXPath($this->getEditorDataAsDom());
+    $this->assertCount(1, $xpath->query('//a[@href="http://www.drupal.org/association"]/img[@alt="drupalimage test image"]'));
+    $this->assertEmpty($xpath->query('//a[@href="http://www.drupal.org/association" and @class="trusted"]'));
+
+    // Add `class="trusted"` to the link.
+    $xpath = new \DOMXPath($this->getEditorDataAsDom());
+    $this->assertEmpty($xpath->query('//a[@href="http://www.drupal.org/association" and @class="trusted"]'));
+    $this->pressEditorButton('Source');
+    $source_text_area = $assert_session->waitForElement('css', '.ck-source-editing-area textarea');
+    $this->assertNotEmpty($source_text_area);
+    $new_value = str_replace('<a ', '<a class="trusted" ', $source_text_area->getValue());
+    $source_text_area->setValue('<p>temp</p>');
+    $source_text_area->setValue($new_value);
+    $this->pressEditorButton('Source');
+
+    // When unrestricted, additional attributes on links should be retained.
+    $xpath = new \DOMXPath($this->getEditorDataAsDom());
+    $this->assertCount($unrestricted ? 1 : 0, $xpath->query('//a[@href="http://www.drupal.org/association" and @class="trusted"]'));
+
+    // Save the entity whose text field is being edited.
+    $page->pressButton('Save');
+
+    // Assert the HTML the end user sees.
+    $assert_session->elementExists('css', $unrestricted
+      ? 'a[href="http://www.drupal.org/association"].trusted img[src*="image-test.png"]'
+      : 'a[href="http://www.drupal.org/association"] img[src*="image-test.png"]');
+
+    // Go back to edit the now *linked* <drupal-media>. Everything from this
+    // point onwards is effectively testing "upcasting" and proving there is no
+    // data loss.
+    $this->drupalGet($this->host->toUrl('edit-form'));
+    $this->waitForEditor();
+
+    // Assert the "dataDowncast" HTML before making changes.
+    $xpath = new \DOMXPath($this->getEditorDataAsDom());
+    $this->assertNotEmpty($xpath->query('//img[@alt="drupalimage test image"]'));
+    $this->assertNotEmpty($xpath->query('//a[@href="http://www.drupal.org/association"]'));
+    $this->assertNotEmpty($xpath->query('//a[@href="http://www.drupal.org/association"]/img[@alt="drupalimage test image"]'));
+    $this->assertCount($unrestricted ? 1 : 0, $xpath->query('//a[@href="http://www.drupal.org/association" and @class="trusted"]'));
+
+    // Tests unlinking images.
+    $drupalimage->click();
+    $this->assertEditorButtonEnabled('Link');
+    $this->assertSame('true', $this->getEditorButton('Link')->getAttribute('aria-pressed'));
+    // Assert structure of image toolbar balloon.
+    $this->assertVisibleBalloon('.ck-toolbar[aria-label="Image toolbar"]');
+    $link_image_button = $this->getBalloonButton('Link image');
+    $this->assertSame('true', $link_image_button->getAttribute('aria-pressed'));
+    $link_image_button->click();
+    // Assert structure of link actions balloon.
+    $this->getBalloonButton('Edit link');
+    $unlink_image_button = $this->getBalloonButton('Unlink');
+    // Click the "Unlink" button.
+    $unlink_image_button->click();
+    $this->assertSame('false', $this->getEditorButton('Link')->getAttribute('aria-pressed'));
+
+    // Assert the "editingDowncast" HTML after making changes. Assert the
+    // widget exists but not the link, or *any* link for that matter. Then
+    // assert the expected DOM structure in detail.
+    $assert_session->elementExists('css', '.ck-content .ck-widget.' . $expected_widget_class);
+    // @todo Remove the different assertion for the "inline, unrestricted" case when https://www.drupal.org/project/ckeditor5/issues/3247634 is fixed.
+    if ($image_type === 'inline' && $unrestricted) {
+      $assert_session->elementNotExists('css', '.ck-content a[href]');
+      $assert_session->elementExists('css', '.ck-content a.trusted');
+    }
+    else {
+      $assert_session->elementNotExists('css', '.ck-content a');
+    }
+    $assert_session->elementExists('css', '.ck-content .ck-widget.' . $expected_widget_class . ' > img[src*="image-test.png"][alt="drupalimage test image"]');
+
+    // Assert the "dataDowncast" HTML after making changes.
+    $xpath = new \DOMXPath($this->getEditorDataAsDom());
+    $this->assertCount(0, $xpath->query('//a[@href="http://www.drupal.org/association"]/img[@alt="drupalimage test image"]'));
+    $this->assertCount(1, $xpath->query('//img[@alt="drupalimage test image"]'));
+    // @todo Remove the different assertion for the "inline, unrestricted" case when https://www.drupal.org/project/ckeditor5/issues/3247634 is fixed.
+    if ($image_type === 'inline' && $unrestricted) {
+      $this->assertCount(1, $xpath->query('//a'));
+    }
+    else {
+      $this->assertCount(0, $xpath->query('//a'));
+    }
+  }
+
+  public function providerLinkability(): array {
+    return [
+      'BLOCK image, restricted' => ['block', FALSE],
+      'BLOCK image, unrestricted' => ['block', TRUE],
+      'INLINE image, restricted' => ['inline', FALSE],
+      'INLINE image, unrestricted' => ['inline', TRUE],
+    ];
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/LanguageTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/LanguageTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..88d3d0fee00bfbb352a497b19eb3e5bfd66ad193
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/LanguageTest.php
@@ -0,0 +1,74 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\language\Entity\ConfigurableLanguage;
+
+// cspell:ignore คำพูดบล็อก
+
+/**
+ * Tests for CKEditor 5 UI translations.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class LanguageTest extends CKEditor5TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'language',
+    'locale',
+  ];
+
+  /**
+   * Integration test to ensure that CKEditor 5 UI translations are loaded.
+   *
+   * @param string $langcode
+   *   The language code.
+   * @param string $blockquote_translation
+   *   The expected translation for blockquote toolbar button.
+   *
+   * @dataProvider provider
+   */
+  public function test(string $langcode, string $blockquote_translation): void {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-blockQuote'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-blockQuote', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->saveNewTextFormat($page, $assert_session);
+
+    ConfigurableLanguage::createFromLangcode($langcode)->save();
+    $this->config('system.site')->set('default_langcode', $langcode)->save();
+
+    $this->drupalGet('node/add');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+    // Ensure that blockquote button is translated.
+    $assert_session->elementExists('xpath', "//span[text()='$blockquote_translation']");
+  }
+
+  /**
+   * Data provider for ensuring CKEditor 5 UI translations are loaded.
+   *
+   * @return \string[][]
+   */
+  public function provider(): array {
+    return [
+      'Language code both in Drupal and CKEditor' => [
+        'langcode' => 'th',
+        'blockquote_translation' => 'คำพูดบล็อก',
+      ],
+      'Language code transformed from browser mappings' => [
+        'langcode' => 'zh-hans',
+        'blockquote_translation' => '块引用',
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/MediaLibraryTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/MediaLibraryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..70b97129f436e6998e01620741c59105b9d39026
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/MediaLibraryTest.php
@@ -0,0 +1,253 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\Component\Utility\Html;
+use Drupal\editor\Entity\Editor;
+use Drupal\file\Entity\File;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
+use Drupal\media\Entity\Media;
+use Drupal\Tests\media\Traits\MediaTypeCreationTrait;
+use Drupal\Tests\TestFileCreationTrait;
+use Drupal\Tests\ckeditor5\Traits\CKEditor5TestTrait;
+use Symfony\Component\Validator\ConstraintViolation;
+
+/**
+ * @coversDefaultClass \Drupal\ckeditor5\Plugin\CKEditor5Plugin\MediaLibrary
+ * @group ckeditor5
+ * @internal
+ */
+class MediaLibraryTest extends WebDriverTestBase {
+
+  use MediaTypeCreationTrait;
+  use TestFileCreationTrait;
+  use CKEditor5TestTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'classy';
+
+  /**
+   * The user to use during testing.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $user;
+
+  /**
+   * The media item to embed.
+   *
+   * @var \Drupal\media\MediaInterface
+   */
+  protected $media;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'ckeditor5',
+    'media_library',
+    'node',
+    'media',
+    'text',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    FilterFormat::create([
+      'format' => 'test_format',
+      'name' => 'Test format',
+      'filters' => [
+        'media_embed' => ['status' => TRUE],
+      ],
+    ])->save();
+    Editor::create([
+      'editor' => 'ckeditor5',
+      'format' => 'test_format',
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'drupalMedia',
+            'sourceEditing',
+            'undo',
+            'redo',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [],
+          ],
+        ],
+      ],
+    ])->save();
+    $this->assertSame([], array_map(
+      function (ConstraintViolation $v) {
+        return (string) $v->getMessage();
+      },
+      iterator_to_array(CKEditor5::validatePair(
+        Editor::load('test_format'),
+        FilterFormat::load('test_format')
+      ))
+    ));
+
+    $this->drupalCreateContentType(['type' => 'blog']);
+
+    // Note that media_install() grants 'view media' to all users by default.
+    $this->user = $this->drupalCreateUser([
+      'use text format test_format',
+      'access media overview',
+      'create blog content',
+    ]);
+
+    // Create a media type that starts with the letter a, to test tab order.
+    $this->createMediaType('image', ['id' => 'arrakis', 'label' => 'Arrakis']);
+
+    // Create a sample media entity to be embedded.
+    $this->createMediaType('image', ['id' => 'image', 'label' => 'Image']);
+    File::create([
+      'uri' => $this->getTestFiles('image')[0]->uri,
+    ])->save();
+    $this->media = Media::create([
+      'bundle' => 'image',
+      'name' => 'Fear is the mind-killer',
+      'field_media_image' => [
+        [
+          'target_id' => 1,
+          'alt' => 'default alt',
+          'title' => 'default title',
+        ],
+      ],
+    ]);
+    $this->media->save();
+
+    $arrakis_media = Media::create([
+      'bundle' => 'arrakis',
+      'name' => 'Le baron Vladimir Harkonnen',
+      'field_media_image' => [
+        [
+          'target_id' => 1,
+          'alt' => 'Il complote pour détruire le duc Leto',
+          'title' => 'Il complote pour détruire le duc Leto',
+        ],
+      ],
+    ]);
+    $arrakis_media->save();
+
+    $this->drupalLogin($this->user);
+  }
+
+  /**
+   * Tests using drupalMedia button to embed media into CKEditor 5.
+   */
+  public function testButton() {
+    $this->drupalGet('/node/add/blog');
+    $this->waitForEditor();
+    $this->pressEditorButton('Insert Drupal Media');
+    $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
+    $this->assertNotEmpty($assert_session->waitForId('drupal-modal'));
+
+    // Ensure that the tab order is correct.
+    $tabs = $page->findAll('css', '.media-library-menu__link');
+    $expected_tab_order = [
+      'Show Image media (selected)',
+      'Show Arrakis media',
+    ];
+    foreach ($tabs as $key => $tab) {
+      $this->assertSame($expected_tab_order[$key], $tab->getText());
+    }
+
+    $assert_session->pageTextContains('0 of 1 item selected');
+    $assert_session->elementExists('css', '.js-media-library-item')->click();
+    $assert_session->pageTextContains('1 of 1 item selected');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '.ck-content .ck-widget.drupal-media .media', 1000));
+    $this->pressEditorButton('Source');
+    $value = $assert_session->elementExists('css', '.ck-source-editing-area textarea')->getValue();
+    $dom = Html::load($value);
+    $xpath = new \DOMXPath($dom);
+    $drupal_media = $xpath->query('//drupal-media')[0];
+    $expected_attributes = [
+      'data-entity-type' => 'media',
+      'data-entity-uuid' => $this->media->uuid(),
+      'data-align' => 'center',
+    ];
+    foreach ($expected_attributes as $name => $expected) {
+      $this->assertSame($expected, $drupal_media->getAttribute($name));
+    }
+    $this->pressEditorButton('Source');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '.ck-content .ck-widget.drupal-media .media', 1000));
+    $this->assertEditorButtonEnabled('Undo');
+    $this->pressEditorButton('Undo');
+    $this->assertEmpty($assert_session->waitForElementVisible('css', '.ck-content .ck-widget.drupal-media .media', 1000));
+    $this->assertEditorButtonDisabled('Undo');
+    $this->pressEditorButton('Redo');
+    $this->assertEditorButtonEnabled('Undo');
+  }
+
+  /**
+   * Tests the allowed media types setting on the MediaEmbed filter.
+   */
+  public function testAllowedMediaTypes() {
+    $test_cases = [
+      'all_media_types' => [],
+      'only_image' => ['image' => 'image'],
+      'only_arrakis' => ['arrakis' => 'arrakis'],
+      'both_items_checked' => [
+        'image' => 'image',
+        'arrakis' => 'arrakis',
+      ],
+    ];
+
+    foreach ($test_cases as $allowed_media_types) {
+      // Update the filter format to set the allowed media types.
+      FilterFormat::load('test_format')
+        ->setFilterConfig('media_embed', [
+          'status' => TRUE,
+          'settings' => [
+            'default_view_mode' => 'view_mode_1',
+            'allowed_media_types' => $allowed_media_types,
+            'allowed_view_modes' => [
+              'view_mode_1' => 'view_mode_1',
+              'view_mode_2' => 'view_mode_2',
+            ],
+          ],
+        ])->save();
+
+      // Now test opening the media library from the CKEditor plugin, and
+      // verify the expected behavior.
+      $this->drupalGet('/node/add/blog');
+      $this->waitForEditor();
+      $this->pressEditorButton('Insert Drupal Media');
+
+      $assert_session = $this->assertSession();
+      $this->assertNotEmpty($assert_session->waitForId('media-library-wrapper'));
+
+      if (empty($allowed_media_types) || count($allowed_media_types) === 2) {
+        $assert_session->elementExists('css', 'li.media-library-menu-image');
+        $assert_session->elementExists('css', 'li.media-library-menu-arrakis');
+        $assert_session->elementTextContains('css', '.media-library-item__name', 'Fear is the mind-killer');
+      }
+      elseif (count($allowed_media_types) === 1 && !empty($allowed_media_types['image'])) {
+        // No tabs should appear if there's only one media type available.
+        $assert_session->elementNotExists('css', 'li.media-library-menu-image');
+        $assert_session->elementNotExists('css', 'li.media-library-menu-arrakis');
+        $assert_session->elementTextContains('css', '.media-library-item__name', 'Fear is the mind-killer');
+      }
+      elseif (count($allowed_media_types) === 1 && !empty($allowed_media_types['arrakis'])) {
+        // No tabs should appear if there's only one media type available.
+        $assert_session->elementNotExists('css', 'li.media-library-menu-image');
+        $assert_session->elementNotExists('css', 'li.media-library-menu-arrakis');
+        $assert_session->elementTextContains('css', '.media-library-item__name', 'Le baron Vladimir Harkonnen');
+      }
+    }
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/MediaTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/MediaTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0d3f6fe7542aefd825f0deb1642d6106c71f9842
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/MediaTest.php
@@ -0,0 +1,704 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\editor\Entity\Editor;
+use Drupal\file\Entity\File;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
+use Drupal\media\Entity\Media;
+use Drupal\Tests\media\Traits\MediaTypeCreationTrait;
+use Drupal\Tests\TestFileCreationTrait;
+use Drupal\Tests\ckeditor5\Traits\CKEditor5TestTrait;
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Symfony\Component\Validator\ConstraintViolation;
+
+/**
+ * @coversDefaultClass \Drupal\ckeditor5\Plugin\CKEditor5Plugin\Media
+ * @group ckeditor5
+ * @internal
+ */
+class MediaTest extends WebDriverTestBase {
+
+  use CKEditor5TestTrait;
+  use MediaTypeCreationTrait;
+  use TestFileCreationTrait;
+
+  /**
+   * The user to use during testing.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $adminUser;
+
+  /**
+   * The sample Media entity to embed.
+   *
+   * @var \Drupal\media\MediaInterface
+   */
+  protected $media;
+
+  /**
+   * A host entity with a body field to embed media in.
+   *
+   * @var \Drupal\node\NodeInterface
+   */
+  protected $host;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'ckeditor5',
+    'media',
+    'node',
+    'text',
+    'media_test_embed',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'classy';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    FilterFormat::create([
+      'format' => 'test_format',
+      'name' => 'Test format',
+      'filters' => [
+        'filter_html' => [
+          'status' => TRUE,
+          'settings' => [
+            'allowed_html' => '<p> <br> <a href> <drupal-media data-entity-type data-entity-uuid alt>',
+          ],
+        ],
+        'filter_align' => ['status' => TRUE],
+        'filter_caption' => ['status' => TRUE],
+        'media_embed' => ['status' => TRUE],
+      ],
+    ])->save();
+    Editor::create([
+      'editor' => 'ckeditor5',
+      'format' => 'test_format',
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'sourceEditing',
+            'link',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [],
+          ],
+        ],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+    ])->save();
+    $this->assertSame([], array_map(
+      function (ConstraintViolation $v) {
+        return (string) $v->getMessage();
+      },
+      iterator_to_array(CKEditor5::validatePair(
+        Editor::load('test_format'),
+        FilterFormat::load('test_format')
+      ))
+    ));
+
+    // Note that media_install() grants 'view media' to all users by default.
+    $this->adminUser = $this->drupalCreateUser([
+      'use text format test_format',
+      'bypass node access',
+    ]);
+
+    // Create a sample media entity to be embedded.
+    $this->createMediaType('image', ['id' => 'image']);
+    File::create([
+      'uri' => $this->getTestFiles('image')[0]->uri,
+    ])->save();
+    $this->media = Media::create([
+      'bundle' => 'image',
+      'name' => 'Screaming hairy armadillo',
+      'field_media_image' => [
+        [
+          'target_id' => 1,
+          'alt' => 'default alt',
+          'title' => 'default title',
+        ],
+      ],
+    ]);
+    $this->media->save();
+
+    // Create a sample host entity to embed media in.
+    $this->drupalCreateContentType(['type' => 'blog']);
+    $this->host = $this->createNode([
+      'type' => 'blog',
+      'title' => 'Animals with strange names',
+      'body' => [
+        'value' => '<drupal-media data-caption="baz" data-entity-type="media" data-entity-uuid="' . $this->media->uuid() . '"></drupal-media>',
+        'format' => 'test_format',
+      ],
+    ]);
+    $this->host->save();
+
+    $this->drupalLogin($this->adminUser);
+  }
+
+  /**
+   * Tests that only <drupal-media> tags are processed.
+   *
+   * @see \Drupal\Tests\media\Kernel\MediaEmbedFilterTest::testOnlyDrupalMediaTagProcessed()
+   */
+  public function testOnlyDrupalMediaTagProcessed() {
+    $original_value = $this->host->body->value;
+    $this->host->body->value = str_replace('drupal-media', 'p', $original_value);
+    $this->host->save();
+
+    // Assert that `<p data-* …>` is not upcast into a CKEditor Widget.
+    $this->drupalGet($this->host->toUrl('edit-form'));
+    $this->waitForEditor();
+    $assert_session = $this->assertSession();
+    $this->assertEmpty($assert_session->waitForElementVisible('css', 'img[src*="image-test.png"]', 1000));
+    $assert_session->elementNotExists('css', '.ck-widget.drupal-media');
+
+    $this->host->body->value = $original_value;
+    $this->host->save();
+
+    // Assert that `<drupal-media data-* …>` is upcast into a CKEditor Widget.
+    $this->getSession()->reload();
+    $this->waitForEditor();
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'img[src*="image-test.png"]'));
+    $assert_session->elementExists('css', '.ck-widget.drupal-media');
+  }
+
+  /**
+   * Tests that failed media embed preview requests inform the end user.
+   */
+  public function testErrorMessages() {
+    // Assert that a request to the `media.filter.preview` route that does not
+    // result in a 200 response (due to server error or network error) is
+    // handled in the JavaScript by displaying the expected error message.
+    // @see core/modules/media/js/media_embed_ckeditor.theme.js
+    // @see js/ckeditor5_plugins/drupalMedia/src/drupalmediaediting.js
+    $this->container->get('state')->set('test_media_filter_controller_throw_error', TRUE);
+    $this->drupalGet($this->host->toUrl('edit-form'));
+    $this->waitForEditor();
+    $assert_session = $this->assertSession();
+    $assert_session->waitForElementVisible('css', '.ck-widget.drupal-media');
+    $this->assertEmpty($assert_session->waitForElementVisible('css', 'img[src*="image-test.png"]', 1000));
+    $assert_session->elementNotExists('css', '.ck-widget.drupal-media .media');
+    $this->assertNotEmpty($assert_session->waitForText('An error occurred while trying to preview the media. Please save your work and reload this page.'));
+    // Now assert that the error doesn't appear when the override to force an
+    // error is removed.
+    $this->container->get('state')->set('test_media_filter_controller_throw_error', FALSE);
+    $this->getSession()->reload();
+    $this->waitForEditor();
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'img[src*="image-test.png"]'));
+
+    // There's a second kind of error message that comes from the back end
+    // that happens when the media uuid can't be converted to a media preview.
+    // In this case, the error will appear in a the themeable
+    // media-embed-error.html template.  We have a hook altering the css
+    // classes to test the twig template is working properly and picking up our
+    // extra class.
+    // @see \Drupal\media\Plugin\Filter\MediaEmbed::renderMissingMediaIndicator()
+    // @see core/modules/media/templates/media-embed-error.html.twig
+    // @see media_test_embed_preprocess_media_embed_error()
+    $original_value = $this->host->body->value;
+    $this->host->body->value = str_replace($this->media->uuid(), 'invalid_uuid', $original_value);
+    $this->host->save();
+    $this->drupalGet($this->host->toUrl('edit-form'));
+    $this->waitForEditor();
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-widget.drupal-media .this-error-message-is-themeable'));
+
+    // Test when using the classy theme, an additional class is added in
+    // classy/templates/content/media-embed-error.html.twig.
+    $this->assertTrue($this->container->get('theme_installer')->install(['classy']));
+    $this->config('system.theme')
+      ->set('default', 'classy')
+      ->save();
+    $this->drupalGet($this->host->toUrl('edit-form'));
+    $this->waitForEditor();
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-widget.drupal-media .this-error-message-is-themeable.media-embed-error--missing-source'));
+    // @todo Uncomment this in https://www.drupal.org/project/ckeditor5/issues/3194084.
+    // @codingStandardsIgnoreLine
+    //$assert_session->responseContains('classy/css/components/media-embed-error.css');
+
+    // Test that restoring a valid UUID results in the media embed preview
+    // displaying.
+    $this->host->body->value = $original_value;
+    $this->host->save();
+    $this->drupalGet($this->host->toUrl('edit-form'));
+    $this->waitForEditor();
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'img[src*="image-test.png"]'));
+    $assert_session->elementNotExists('css', '.ck-widget.drupal-media .this-error-message-is-themeable');
+  }
+
+  /**
+   * The CKEditor Widget must load a preview generated using the default theme.
+   */
+  public function testPreviewUsesDefaultThemeAndIsClientCacheable() {
+    // Make the node edit form use the admin theme, like on most Drupal sites.
+    $this->config('node.settings')
+      ->set('use_admin_theme', TRUE)
+      ->save();
+
+    // Allow the test user to view the admin theme.
+    $this->adminUser->addRole($this->drupalCreateRole(['view the administration theme']));
+    $this->adminUser->save();
+
+    // Configure a different default and admin theme, like on most Drupal sites.
+    $this->config('system.theme')
+      ->set('default', 'stable')
+      ->set('admin', 'classy')
+      ->save();
+
+    // Assert that when looking at an embedded entity in the CKEditor Widget,
+    // the preview is generated using the default theme, not the admin theme.
+    // @see media_test_embed_entity_view_alter()
+    $this->drupalGet($this->host->toUrl('edit-form'));
+    $this->waitForEditor();
+    $assert_session = $this->assertSession();
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'img[src*="image-test.png"]'));
+    $element = $assert_session->elementExists('css', '[data-media-embed-test-active-theme]');
+    $this->assertSame('stable', $element->getAttribute('data-media-embed-test-active-theme'));
+    // Assert that the first preview request transferred >500 B over the wire.
+    // Then toggle source mode on and off. This causes the CKEditor widget to be
+    // destroyed and then reconstructed. Assert that during this reconstruction,
+    // a second request is sent. This second request should have transferred 0
+    // bytes: the browser should have cached the response, thus resulting in a
+    // much better user experience.
+    $this->assertGreaterThan(500, $this->getLastPreviewRequestTransferSize());
+    $this->pressEditorButton('Source');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-source-editing-area'));
+    // CKEditor 5 is very smart: if no changes were made in the Source Editing
+    // Area, it will not rerender the contents. In this test, we
+    // want to verify that Media preview responses are cached on the client side
+    // so it is essential that rerendering occurs. To achieve this, we append a
+    // single space.
+    $source_text_area = $this->getSession()->getPage()->find('css', '[name="body[0][value]"] + .ck-editor textarea');
+    $source_text_area->setValue($source_text_area->getValue() . ' ');
+    $this->pressEditorButton('Source');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'img[src*="image-test.png"]'));
+    $this->assertSame(0, $this->getLastPreviewRequestTransferSize());
+  }
+
+  /**
+   * Tests caption editing in the CKEditor widget.
+   */
+  public function testEditableCaption() {
+    // @todo Port in https://www.drupal.org/project/ckeditor5/issues/3246385
+    $this->markTestSkipped('Blocked on https://www.drupal.org/project/ckeditor5/issues/3246385.');
+  }
+
+  /**
+   * Tests the EditorMediaDialog's form elements' #access logic.
+   */
+  public function testDialogAccess() {
+    // @todo Port in https://www.drupal.org/project/ckeditor5/issues/3245720
+    $this->markTestSkipped('Blocked on https://www.drupal.org/project/ckeditor5/issues/3245720.');
+  }
+
+  /**
+   * Tests the CKEditor 5 media plugin can override image media's alt attribute.
+   */
+  public function testAlt() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+    $this->drupalGet($this->host->toUrl('edit-form'));
+    $this->waitForEditor();
+    // Wait for the media preview to load.
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '.ck-widget.drupal-media img'));
+    // Test that by default no alt attribute is present on the drupal-media
+    // element.
+    $this->assertSourceAttributeSame('alt', NULL);
+    // Test that the preview shows the alt value from the media field's
+    // alt text.
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '.ck-widget.drupal-media img[alt*="default alt"]'));
+    // Test that clicking the media widget triggers a CKEditor balloon panel
+    // with a single button to override the alt text.
+    $this->click('.ck-widget.drupal-media');
+    $this->assertVisibleBalloon('[aria-label="Drupal Media toolbar"]');
+    // Click the "Override media image text alternative" button.
+    $this->getBalloonButton('Override media image text alternative')->click();
+    $this->assertVisibleBalloon('.ck-text-alternative-form');
+    // Assert that the value is currently empty.
+    // @todo Consider changing this in https://www.drupal.org/project/ckeditor5/issues/3246365.
+    $alt_override_input = $page->find('css', '.ck-balloon-panel .ck-text-alternative-form input[type=text]');
+    $this->assertSame('', $alt_override_input->getValue());
+
+    // Fill in the alt field and submit.
+    // cSpell:disable-next-line
+    $who_is_zartan = 'Zartan is the leader of the Dreadnoks.';
+    $alt_override_input->setValue($who_is_zartan);
+    $this->getBalloonButton('Save')->click();
+
+    // Assert that the img within the media embed within the CKEditor contains
+    // the overridden alt text set in the dialog.
+    // @todo Uncomment this in https://www.drupal.org/project/ckeditor5/issues/3206522.
+    // @codingStandardsIgnoreLine
+//    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '.ck-widget.drupal-media img[alt*="' . $who_is_zartan . '"]'));
+    // Test `aria-label` attribute appears on the widget wrapper.
+    $assert_session->elementExists('css', '.ck-widget.drupal-media [aria-label="Screaming hairy armadillo"]');
+
+    // Test that the downcast drupal-media element now has the alt attribute
+    // entered in the dialog.
+    $this->assertSourceAttributeSame('alt', $who_is_zartan);
+
+    // The alt field should now display the override instead of the default.
+    $this->getBalloonButton('Override media image text alternative')->click();
+    $this->assertVisibleBalloon('.ck-text-alternative-form');
+    $alt_override_input = $page->find('css', '.ck-balloon-panel .ck-text-alternative-form input[type=text]');
+    $this->assertSame($who_is_zartan, $alt_override_input->getValue());
+
+    // Test the process again with a different alt text to make sure it works
+    // the second time around.
+    $cobra_commander_bio = 'The supreme leader of the terrorist organization Cobra';
+    // Set the alt field to the new alt text.
+    $alt_override_input->setValue($cobra_commander_bio);
+    $this->getBalloonButton('Save')->click();
+    // Assert that the img within the media embed preview
+    // within the CKEditor contains the overridden alt text set in the dialog.
+    // @todo Uncomment this in https://www.drupal.org/project/ckeditor5/issues/3206522.
+    // @codingStandardsIgnoreLine
+//    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'drupal-media img[alt*="' . $cobra_commander_bio . '"]'));
+
+    // Test that the downcast drupal-media element now has the alt attribute
+    // entered in the dialog.
+    $this->assertSourceAttributeSame('alt', $cobra_commander_bio);
+
+    // The default value of the alt field should now display the override
+    // instead of the value on the media image field.
+    $this->getBalloonButton('Override media image text alternative')->click();
+    $this->assertVisibleBalloon('.ck-text-alternative-form');
+    $alt_override_input = $page->find('css', '.ck-balloon-panel .ck-text-alternative-form input[type=text]');
+    $this->assertSame($cobra_commander_bio, $alt_override_input->getValue());
+
+    // Test that setting alt value to two double quotes will signal to the
+    // MediaEmbed filter to unset the attribute on the media image field.
+    // We intentionally add a space space after the two double quotes to test
+    // the string is trimmed to two quotes.
+    $alt_override_input->setValue('"" ');
+    $this->getBalloonButton('Save')->click();
+    // Verify that the two double quote empty alt indicator ('""') set in
+    // the dialog has successfully resulted in a media image field with the
+    // alt attribute present but without a value.
+    // @todo Uncomment this in https://www.drupal.org/project/ckeditor5/issues/3206522.
+    // @codingStandardsIgnoreLine
+//    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'drupal-media img[alt=""]'));
+
+    // Test that the downcast drupal-media element's alt attribute now has the
+    // empty string indicator.
+    $this->assertSourceAttributeSame('alt', '""');
+
+    // Test that setting alt to back to an empty string within the dialog will
+    // restore the default alt value saved in to the media image field of the
+    // media item.
+    $this->getBalloonButton('Override media image text alternative')->click();
+    $this->assertVisibleBalloon('.ck-text-alternative-form');
+    $alt_override_input = $page->find('css', '.ck-balloon-panel .ck-text-alternative-form input[type=text]');
+    $alt_override_input->setValue('');
+    $this->getBalloonButton('Save')->click();
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '.ck-widget.drupal-media img[alt*="default alt"]'));
+
+    // Test that the downcast drupal-media element no longer has an alt
+    // attribute.
+    $this->assertSourceAttributeSame('alt', NULL);
+  }
+
+  /**
+   * Tests the CKEditor 5 media plugin loads the translated alt attribute.
+   */
+  public function testTranslationAlt() {
+    // @todo Port in https://www.drupal.org/project/ckeditor5/issues/3246365
+    $this->markTestSkipped('Blocked on https://www.drupal.org/project/ckeditor5/issues/3246365.');
+  }
+
+  /**
+   * Tests linkability of the media CKEditor widget.
+   *
+   * Due to the very different HTML markup generated for the editing view and
+   * the data view, this is explicitly testing the "editingDowncast" and
+   * "dataDowncast" results. These are CKEditor 5 concepts.
+   *
+   * @see https://ckeditor.com/docs/ckeditor5/latest/framework/guides/architecture/editing-engine.html#conversion
+   *
+   * @dataProvider providerLinkability
+   */
+  public function testLinkability(bool $unrestricted) {
+    // Disable filter_html.
+    if ($unrestricted) {
+      FilterFormat::load('test_format')
+        ->setFilterConfig('filter_html', ['status' => FALSE])
+        ->save();
+    }
+
+    $page = $this->getSession()->getPage();
+
+    $this->drupalGet($this->host->toUrl('edit-form'));
+    $this->waitForEditor();
+    $assert_session = $this->assertSession();
+
+    // Initial state: the Drupal Media CKEditor Widget is not selected.
+    $drupalmedia = $assert_session->waitForElementVisible('css', '.ck-content .ck-widget.drupal-media');
+    $this->assertNotEmpty($drupalmedia);
+    $this->assertFalse($drupalmedia->hasClass('.ck-widget_selected'));
+
+    // Assert the "editingDowncast" HTML before making changes.
+    $assert_session->elementExists('css', '.ck-content .ck-widget.drupal-media > [data-drupal-media-preview]');
+
+    // Assert the "dataDowncast" HTML before making changes.
+    $xpath = new \DOMXPath($this->getEditorDataAsDom());
+    $this->assertNotEmpty($xpath->query('//drupal-media'));
+    $this->assertEmpty($xpath->query('//a'));
+
+    // Assert the link button is present and not pressed.
+    $link_button = $this->getEditorButton('Link');
+    $this->assertSame('false', $link_button->getAttribute('aria-pressed'));
+
+    // Wait for the preview to load.
+    $preview = $assert_session->waitForElement('css', '.ck-content .ck-widget.drupal-media [data-drupal-media-preview="ready"]');
+    $this->assertNotEmpty($preview);
+
+    // Tests linking Drupal media.
+    $drupalmedia->click();
+    $this->assertTrue($drupalmedia->hasClass('ck-widget_selected'));
+    $this->assertEditorButtonEnabled('Link');
+    // Assert structure of image toolbar balloon.
+    $this->assertVisibleBalloon('.ck-toolbar[aria-label="Drupal Media toolbar"]');
+    $link_media_button = $this->getBalloonButton('Link media');
+    // Click the "Link media" button.
+    $this->assertSame('false', $link_media_button->getAttribute('aria-pressed'));
+    $link_media_button->press();
+    // Assert structure of link form balloon.
+    $balloon = $this->assertVisibleBalloon('.ck-link-form');
+    $url_input = $balloon->find('css', '.ck-labeled-field-view__input-wrapper .ck-input-text');
+    // Fill in link form balloon's <input> and hit "Save".
+    $url_input->setValue('http://linking-embedded-media.com');
+    $balloon->pressButton('Save');
+
+    // Assert the "editingDowncast" HTML after making changes. Assert the link
+    // exists, then assert the link exists. Then assert the expected DOM
+    // structure in detail.
+    $assert_session->elementExists('css', '.ck-content a[href="http://linking-embedded-media.com"]');
+    $assert_session->elementExists('css', '.ck-content .drupal-media.ck-widget > a[href="http://linking-embedded-media.com"] > div[aria-label] > article > div > img[src*="image-test.png"]');
+
+    // Assert the "dataDowncast" HTML after making changes.
+    $xpath = new \DOMXPath($this->getEditorDataAsDom());
+    $this->assertNotEmpty($xpath->query('//drupal-media'));
+    $this->assertNotEmpty($xpath->query('//a[@href="http://linking-embedded-media.com"]'));
+    $this->assertNotEmpty($xpath->query('//a[@href="http://linking-embedded-media.com"]/drupal-media'));
+
+    // Add `class="trusted"` to the link.
+    $this->assertEmpty($xpath->query('//a[@href="http://linking-embedded-media.com" and @class="trusted"]'));
+    $this->pressEditorButton('Source');
+    $source_text_area = $assert_session->waitForElement('css', '.ck-source-editing-area textarea');
+    $this->assertNotEmpty($source_text_area);
+    $new_value = str_replace('<a ', '<a class="trusted" ', $source_text_area->getValue());
+    $source_text_area->setValue('<p>temp</p>');
+    $source_text_area->setValue($new_value);
+    $this->pressEditorButton('Source');
+
+    // When unrestricted, additional attributes on links should be retained.
+    $xpath = new \DOMXPath($this->getEditorDataAsDom());
+    $this->assertCount($unrestricted ? 1 : 0, $xpath->query('//a[@href="http://linking-embedded-media.com" and @class="trusted"]'));
+
+    // Save the entity whose text field is being edited.
+    $page->pressButton('Save');
+
+    // Assert the HTML the end user sees.
+
+    $assert_session->elementExists('css', $unrestricted
+      ? 'a[href="http://linking-embedded-media.com"].trusted img[src*="image-test.png"]'
+      : 'a[href="http://linking-embedded-media.com"] img[src*="image-test.png"]');
+
+    // Go back to edit the now *linked* <drupal-media>. Everything from this
+    // point onwards is effectively testing "upcasting" and proving there is no
+    // data loss.
+    $this->drupalGet($this->host->toUrl('edit-form'));
+    $this->waitForEditor();
+
+    // Assert the "dataDowncast" HTML before making changes.
+    $xpath = new \DOMXPath($this->getEditorDataAsDom());
+    $this->assertNotEmpty($xpath->query('//drupal-media'));
+    $this->assertNotEmpty($xpath->query('//a[@href="http://linking-embedded-media.com"]'));
+    $this->assertNotEmpty($xpath->query('//a[@href="http://linking-embedded-media.com"]/drupal-media'));
+
+    // Tests unlinking media.
+    $drupalmedia->click();
+    $this->assertEditorButtonEnabled('Link');
+    $this->assertSame('true', $this->getEditorButton('Link')->getAttribute('aria-pressed'));
+    // Assert structure of Drupal media toolbar balloon.
+    $this->assertVisibleBalloon('.ck-toolbar[aria-label="Drupal Media toolbar"]');
+    $link_media_button = $this->getBalloonButton('Link media');
+    $this->assertSame('true', $link_media_button->getAttribute('aria-pressed'));
+    $link_media_button->click();
+    // Assert structure of link actions balloon.
+    $this->getBalloonButton('Edit link');
+    $unlink_image_button = $this->getBalloonButton('Unlink');
+    // Click the "Unlink" button.
+    $unlink_image_button->click();
+    $this->assertSame('false', $this->getEditorButton('Link')->getAttribute('aria-pressed'));
+
+    // Assert the "editingDowncast" HTML after making changes. Assert the link
+    // exists, then assert no link exists. Then assert the expected DOM
+    // structure in detail.
+    $assert_session->elementNotExists('css', '.ck-content a');
+    $assert_session->elementExists('css', '.ck-content .drupal-media.ck-widget > div[aria-label] > article > div > img[src*="image-test.png"]');
+
+    // Assert the "dataDowncast" HTML after making changes.
+    $xpath = new \DOMXPath($this->getEditorDataAsDom());
+    $this->assertNotEmpty($xpath->query('//drupal-media'));
+    $this->assertEmpty($xpath->query('//a'));
+  }
+
+  public function providerLinkability(): array {
+    return [
+      'restricted' => [FALSE],
+      'unrestricted' => [TRUE],
+    ];
+  }
+
+  /**
+   * Tests preview route access.
+   *
+   * @param bool $media_embed_enabled
+   *   Whether to test with media_embed filter enabled on the text format.
+   * @param bool $can_use_format
+   *   Whether the logged in user is allowed to use the text format.
+   *
+   * @dataProvider previewAccessProvider
+   */
+  public function testEmbedPreviewAccess($media_embed_enabled, $can_use_format) {
+    // Reconfigure the host entity's text format to suit our needs.
+    /** @var \Drupal\filter\FilterFormatInterface $format */
+    $format = FilterFormat::load($this->host->body->format);
+    $format->set('filters', [
+      'filter_align' => ['status' => TRUE],
+      'filter_caption' => ['status' => TRUE],
+      'media_embed' => ['status' => $media_embed_enabled],
+    ]);
+    $format->save();
+
+    $permissions = [
+      'bypass node access',
+    ];
+    if ($can_use_format) {
+      $permissions[] = $format->getPermissionName();
+    }
+    $this->drupalLogin($this->drupalCreateUser($permissions));
+    $this->drupalGet($this->host->toUrl('edit-form'));
+
+    $assert_session = $this->assertSession();
+    if ($can_use_format) {
+      $this->waitForEditor();
+      if ($media_embed_enabled) {
+        // The preview rendering, which in this test will use Classy's
+        // media.html.twig template, will fail without the CSRF token/header.
+        // @see ::testEmbeddedMediaPreviewWithCsrfToken()
+        $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'article.media'));
+      }
+      else {
+        // If the filter isn't enabled, there won't be an error, but the
+        // preview shouldn't be rendered.
+        $assert_session->assertWaitOnAjaxRequest();
+        $assert_session->elementNotExists('css', 'article.media');
+      }
+    }
+    else {
+      $assert_session->pageTextContains('This field has been disabled because you do not have sufficient permissions to edit it.');
+    }
+  }
+
+  /**
+   * Data provider for ::testEmbedPreviewAccess.
+   */
+  public function previewAccessProvider() {
+    return [
+      'media_embed filter enabled' => [
+        TRUE,
+        TRUE,
+      ],
+      'media_embed filter disabled' => [
+        FALSE,
+        TRUE,
+      ],
+      'media_embed filter enabled, user not allowed to use text format' => [
+        TRUE,
+        FALSE,
+      ],
+    ];
+  }
+
+  /**
+   * Tests alignment integration.
+   *
+   * Tests that alignment is reflected onto the CKEditor Widget wrapper, that
+   * the EditorMediaDialog allows altering the alignment and that the changes
+   * are reflected on the widget and downcast drupal-media tag.
+   */
+  public function testAlignment() {
+    // @todo Port in https://www.drupal.org/project/ckeditor5/issues/3246385
+    $this->markTestSkipped('Blocked on https://www.drupal.org/project/ckeditor5/issues/3246385.');
+  }
+
+  /**
+   * Tests the EditorMediaDialog can set the data-view-mode attribute.
+   */
+  public function testViewMode() {
+    // @todo Port in https://www.drupal.org/project/ckeditor5/issues/3245720
+    $this->markTestSkipped('Blocked on https://www.drupal.org/project/ckeditor5/issues/3245720.');
+  }
+
+  /**
+   * Verifies value of an attribute on the downcast <drupal-media> element.
+   *
+   * Assumes CKEditor is in source mode.
+   *
+   * @param string $attribute
+   *   The attribute to check.
+   * @param mixed $value
+   *   Either a string value or if NULL, asserts that <drupal-media> element
+   *   doesn't have the attribute.
+   */
+  protected function assertSourceAttributeSame($attribute, $value) {
+    $dom = $this->getEditorDataAsDom();
+    $drupal_media = (new \DOMXPath($dom))->query('//drupal-media');
+    $this->assertNotEmpty($drupal_media);
+    if ($value === NULL) {
+      $this->assertFalse($drupal_media[0]->hasAttribute($attribute));
+    }
+    else {
+      $this->assertSame($value, $drupal_media[0]->getAttribute($attribute));
+    }
+  }
+
+  /**
+   * Gets the transfer size of the last preview request.
+   *
+   * @return int
+   *   The size of the bytes transferred.
+   */
+  protected function getLastPreviewRequestTransferSize() {
+    $javascript = <<<JS
+(function(){
+  return window.performance
+    .getEntries()
+    .filter(function (entry) {
+      return entry.initiatorType == 'fetch' && entry.name.indexOf('/media/test_format/preview') !== -1;
+    })
+    .pop()
+    .transferSize;
+})()
+JS;
+    return $this->getSession()->evaluateScript($javascript);
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/QuickEditIntegrationTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/QuickEditIntegrationTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..feeffc2051f6f7ab382686e0dc8635ac3b47c816
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/QuickEditIntegrationTest.php
@@ -0,0 +1,288 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
+use Drupal\Tests\quickedit\FunctionalJavascript\QuickEditJavascriptTestBase;
+use Symfony\Component\Validator\ConstraintViolation;
+
+/**
+ * Tests that Quick Edit can load CKEditor 5.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class QuickEditIntegrationTest extends QuickEditJavascriptTestBase {
+
+  use EntityReferenceTestTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'node',
+    'editor',
+    'ckeditor5',
+    'hold_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * A user with permissions to edit Articles and use Quick Edit.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $contentAuthorUser;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    // Create text format, associate CKEditor 5, validate.
+    FilterFormat::create([
+      'format' => 'some_format',
+      'name' => 'Some format',
+      'filters' => [
+        'filter_html' => [
+          'status' => TRUE,
+          'settings' => [
+            'allowed_html' => '<p> <br> <h2> <h3> <h4> <h5> <h6> <strong> <em>',
+          ],
+        ],
+      ],
+    ])->save();
+    Editor::create([
+      'format' => 'some_format',
+      'editor' => 'ckeditor5',
+      'settings' => [
+        'toolbar' => [
+          'items' => ['heading', 'bold', 'italic'],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+        ],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+    ])->save();
+    $this->assertSame([], array_map(
+      function (ConstraintViolation $v) {
+        return (string) $v->getMessage();
+      },
+      iterator_to_array(CKEditor5::validatePair(
+        Editor::load('some_format'),
+        FilterFormat::load('some_format')
+      ))
+    ));
+
+    // Create the Article node type.
+    $this->drupalCreateContentType(['type' => 'article', 'name' => 'Article']);
+
+    // Log in as a content author who can use Quick Edit and edit Articles.
+    $this->contentAuthorUser = $this->drupalCreateUser([
+      'access contextual links',
+      'access toolbar',
+      'access in-place editing',
+      'access content',
+      'create article content',
+      'edit any article content',
+      'use text format some_format',
+    ]);
+    $this->drupalLogin($this->contentAuthorUser);
+  }
+
+  /**
+   * Tests that changes can be discarded.
+   */
+  public function testDiscard() {
+    $page = $this->getSession()->getPage();
+    $node = $this->drupalCreateNode([
+      'type' => 'article',
+      'title' => t('My Test Node'),
+      'body' => [
+        'value' => '<p>Hello world!</p><p>I do not know what to say…</p><p>I wish I were eloquent.</p>',
+        'format' => 'some_format',
+      ],
+    ]);
+
+    $this->drupalGet('node/' . $node->id());
+
+    // Initial state.
+    $this->awaitQuickEditForEntity('node', 1);
+    $this->assertEntityInstanceStates([
+      'node/1[0]' => 'closed',
+    ]);
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'inactive',
+      'node/1/body/en/full' => 'inactive',
+    ]);
+
+    // Start in-place editing of the article node.
+    $this->startQuickEditViaToolbar('node', 1, 0);
+    $this->assertEntityInstanceStates([
+      'node/1[0]' => 'opened',
+    ]);
+    $this->assertQuickEditEntityToolbar((string) $node->label(), NULL);
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/body/en/full' => 'candidate',
+    ]);
+
+    $assert_session = $this->assertSession();
+
+    // Click the body field.
+    hold_test_response(TRUE);
+    $this->click('[data-quickedit-field-id="node/1/body/en/full"]');
+    $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"]');
+    $this->assertQuickEditEntityToolbar((string) $node->label(), 'Body');
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/body/en/full' => 'active',
+    ]);
+    hold_test_response(FALSE);
+
+    $this->assertEntityInstanceFieldMarkup([
+      'node/1/body/en/full' => '.ck-editor__editable_inline',
+    ]);
+    $this->assertSession()
+      ->elementExists('css', '#quickedit-entity-toolbar .quickedit-toolgroup.wysiwyg-main .ck-toolbar[role="toolbar"] .ck-toolbar__items > .ck-button[type="button"]');
+
+    // Click the body field.
+    $this->click('[data-quickedit-field-id="node/1/body/en/full"]');
+    $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"]');
+    $this->typeInPlainTextEditor('[data-quickedit-field-id="node/1/body/en/full"]', ' I am not wanted here');
+    $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"].quickedit-changed');
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/body/en/full' => 'changed',
+    ]);
+
+    $assert_session->pageTextContains('I am not wanted here');
+
+    // Click the 'Cancel' button.
+    $page->find('css', '.action-cancel.quickedit-button')->press();
+    hold_test_response(TRUE);
+
+    // Click the 'Discard Changes' button.
+    $discard_changes_button = $page->findAll('css', '.ui-dialog-buttonset .button')[1];
+    $this->assertEquals('Discard changes', $discard_changes_button->getText());
+    $discard_changes_button->press();
+
+    $assert_session->pageTextNotContains('I am not wanted here');
+    hold_test_response(FALSE);
+  }
+
+  /**
+   * Tests if an article node can be in-place edited with Quick Edit.
+   */
+  public function testArticleNode() {
+    $assert_session = $this->assertSession();
+
+    $node = $this->drupalCreateNode([
+      'type' => 'article',
+      'title' => t('My Test Node'),
+      'body' => [
+        'value' => '<p>Hello world!</p><p>I do not know what to say…</p><p>I wish I were eloquent.</p>',
+        'format' => 'some_format',
+      ],
+    ]);
+
+    $this->drupalGet('node/' . $node->id());
+
+    // Confirm that the JavaScript that generates IE11 warnings loads.
+    $assert_session->elementExists('css', 'script[src*="ckeditor5/js/ie11.user.warnings.js"]');
+
+    // Initial state.
+    $this->awaitQuickEditForEntity('node', 1);
+    $this->assertEntityInstanceStates([
+      'node/1[0]' => 'closed',
+    ]);
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'inactive',
+      'node/1/body/en/full' => 'inactive',
+    ]);
+
+    // Start in-place editing of the article node.
+    $this->startQuickEditViaToolbar('node', 1, 0);
+    $this->assertEntityInstanceStates([
+      'node/1[0]' => 'opened',
+    ]);
+    $this->assertQuickEditEntityToolbar((string) $node->label(), NULL);
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/body/en/full' => 'candidate',
+    ]);
+
+    // Click the body field.
+    hold_test_response(TRUE);
+    $this->click('[data-quickedit-field-id="node/1/body/en/full"]');
+    $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"]');
+    $this->assertQuickEditEntityToolbar((string) $node->label(), 'Body');
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/body/en/full' => 'active',
+    ]);
+    hold_test_response(FALSE);
+
+    $this->assertEntityInstanceFieldMarkup([
+      'node/1/body/en/full' => '.ck-editor__editable_inline',
+    ]);
+    $this->assertSession()
+      ->elementExists('css', '#quickedit-entity-toolbar .quickedit-toolgroup.wysiwyg-main .ck-toolbar[role="toolbar"] .ck-toolbar__items > .ck-button[type="button"]');
+
+    // Click the body field.
+    $this->click('[data-quickedit-field-id="node/1/body/en/full"]');
+    $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"]');
+    $this->typeInPlainTextEditor('[data-quickedit-field-id="node/1/body/en/full"]', ' Added text with CKEditor 5');
+    $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"].quickedit-changed');
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/body/en/full' => 'changed',
+    ]);
+
+    // Click 'Save'.
+    hold_test_response(TRUE);
+    $this->saveQuickEdit();
+    $this->assertEntityInstanceStates([
+      'node/1[0]' => 'committing',
+    ]);
+
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/body/en/full' => 'saving',
+    ]);
+
+    $this->assertEntityInstanceFieldMarkup([
+      'node/1/body/en/full' => '.quickedit-changed',
+    ]);
+    hold_test_response(FALSE);
+
+    $this->assertJsCondition("Drupal.quickedit.collections.entities.get('node/1[0]').get('state') === 'closed'");
+    $this->assertEntityInstanceStates([
+      'node/1[0]' => 'closed',
+    ]);
+
+    // Get the load again and ensure the values are the expected values.
+    $this->drupalGet('node/' . $node->id());
+    $this->assertSession()->pageTextContains('I wish I were eloquent.');
+    $this->assertSession()->pageTextContains('Added text with CKEditor 5');
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/CKEditor4to5UpgradeCompletenessTest.php b/core/modules/ckeditor5/tests/src/Kernel/CKEditor4to5UpgradeCompletenessTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac1d91e165229277b1eb1d040b58f41aba2f5dd1
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/CKEditor4to5UpgradeCompletenessTest.php
@@ -0,0 +1,257 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Drupal\ckeditor\CKEditorPluginConfigurableInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginElementsSubsetInterface;
+use Drupal\Component\Utility\NestedArray;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * @covers \Drupal\ckeditor5\Plugin\CKEditor4To5Upgrade\Core
+ * @group ckeditor5
+ * @internal
+ */
+class CKEditor4to5UpgradeCompletenessTest extends KernelTestBase {
+
+  /**
+   * The "CKEditor 4 plugin" plugin manager.
+   *
+   * @var \Drupal\ckeditor\CKEditorPluginManager
+   */
+  protected $cke4PluginManager;
+
+  /**
+   * The "CKEditor 5 plugin" plugin manager.
+   *
+   * @var \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+   */
+  protected $cke5PluginManager;
+
+  /**
+   * The CKEditor 4 to 5 upgrade plugin manager.
+   *
+   * @var \Drupal\ckeditor5\Plugin\CKEditor4To5UpgradePluginManager
+   */
+  protected $upgradePluginManager;
+
+  /**
+   * Smart default settings utility.
+   *
+   * @var \Drupal\ckeditor5\SmartDefaultSettings
+   */
+  protected $smartDefaultSettings;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'ckeditor',
+    'ckeditor5',
+    // Enabled because of ::testCKEditor5ConfigurableSubsetPlugins().
+    'filter',
+    // Enabled because of \Drupal\media\Plugin\CKEditorPlugin\DrupalMedia.
+    'media',
+    // Enabled because of \Drupal\media_library\Plugin\CKEditorPlugin\DrupalMediaLibrary.
+    'media_library',
+    // Enabled for media_library.
+    'views',
+    // These modules must be installed for ckeditor5_config_schema_info_alter()
+    // to work, which in turn is necessary for the plugin definition validation
+    // logic.
+    // @see \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition::validateDrupalAspects()
+    'filter',
+    'editor',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    // The tested service is private; expose it under a public test-only alias.
+    $this->container->setAlias('sut', 'plugin.manager.ckeditor4to5upgrade.plugin');
+
+    $this->cke4PluginManager = $this->container->get('plugin.manager.ckeditor.plugin');
+    $this->cke5PluginManager = $this->container->get('plugin.manager.ckeditor5.plugin');
+    $this->upgradePluginManager = $this->container->get('sut');
+    $this->smartDefaultSettings = $this->container->get('ckeditor5.smart_default_settings');
+  }
+
+  /**
+   * Tests that all CKEditor 4 buttons in core have an upgrade path.
+   */
+  public function testButtons(): void {
+    $cke4_buttons = array_keys(NestedArray::mergeDeepArray($this->cke4PluginManager->getButtons()));
+
+    foreach ($cke4_buttons as $button) {
+      $equivalent = $this->upgradePluginManager->mapCKEditor4ToolbarButtonToCKEditor5ToolbarItem($button);
+      $this->assertTrue($equivalent === NULL || is_string($equivalent));
+      // The returned equivalent CKEditor 5 toolbar item must exist.
+      if (is_string($equivalent)) {
+        $this->assertArrayHasKey($equivalent, $this->cke5PluginManager->getToolbarItems());
+      }
+    }
+  }
+
+  /**
+   * Tests that the test-only CKEditor 4 module does not have an upgrade path.
+   */
+  public function testButtonsWithTestOnlyModule(): void {
+    $this->enableModules(['ckeditor_test']);
+    $this->cke4PluginManager = $this->container->get('plugin.manager.ckeditor.plugin');
+
+    $this->expectException(\OutOfBoundsException::class);
+    $this->expectExceptionMessage('No upgrade path found for the "LlamaCSS" button.');
+
+    $this->testButtons();
+  }
+
+  /**
+   * Tests that all configurable CKEditor 4 plugins in core have an upgrade path.
+   */
+  public function testSettings(): void {
+    $cke4_configurable_plugins = [];
+    foreach ($this->cke4PluginManager->getDefinitions() as $plugin_id => $definition) {
+      // Special case: DrupalImage.
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\DrupalImage
+      // @see \Drupal\editor\Entity\Editor::getImageUploadSettings()
+      if ($plugin_id === 'drupalimage') {
+        continue;
+      }
+
+      if (is_subclass_of($definition['class'], CKEditorPluginConfigurableInterface::class)) {
+        $cke4_configurable_plugins[] = $plugin_id;
+      }
+    }
+
+    foreach ($cke4_configurable_plugins as $plugin_id) {
+      $cke5_plugin_settings = $this->upgradePluginManager->mapCKEditor4SettingsToCKEditor5Configuration($plugin_id, []);
+      $this->assertTrue($cke5_plugin_settings === NULL || is_array($cke5_plugin_settings));
+      // The returned equivalent CKEditor 5 plugin must exist.
+      if (is_array($cke5_plugin_settings)) {
+        $cke5_plugin_id = array_keys($cke5_plugin_settings)[0];
+        $this->assertArrayHasKey($cke5_plugin_id, $this->cke5PluginManager->getDefinitions());
+      }
+    }
+  }
+
+  /**
+   * Tests that the test-only CKEditor 4 module does not have an upgrade path.
+   */
+  public function testSettingsWithTestOnlyModule(): void {
+    $this->enableModules(['ckeditor_test']);
+    $this->cke4PluginManager = $this->container->get('plugin.manager.ckeditor.plugin');
+
+    $this->expectException(\OutOfBoundsException::class);
+    $this->expectExceptionMessage('No upgrade path found for the "llama_contextual_and_button" plugin settings.');
+
+    $this->testSettings();
+  }
+
+  /**
+   * Tests that all elements subset plugins in core have an upgrade path.
+   */
+  public function testCKEditor5ConfigurableSubsetPlugins(): void {
+    $cke5_elements_subset_plugins = [];
+    foreach ($this->cke5PluginManager->getDefinitions() as $plugin_id => $definition) {
+      // Special case: SourceEditing.
+      // @see \Drupal\ckeditor5\SmartDefaultSettings::computeSubsetSettingForEnabledPluginsWithSubsets()
+      if ($plugin_id === 'ckeditor5_sourceEditing') {
+        continue;
+      }
+
+      if (is_a($definition->getClass(), CKEditor5PluginElementsSubsetInterface::class, TRUE)) {
+        $cke5_elements_subset_plugins[] = $plugin_id;
+      }
+    }
+
+    foreach ($cke5_elements_subset_plugins as $plugin_id) {
+      $cke5_plugin_configuration = $this->upgradePluginManager->computeCKEditor5PluginSubsetConfiguration($plugin_id, FilterFormat::create());
+      $this->assertTrue($cke5_plugin_configuration === NULL || is_array($cke5_plugin_configuration));
+    }
+  }
+
+  /**
+   * Tests that only one plugin can provide an upgrade path for a button.
+   */
+  public function testOnlyOneUpgradePluginAllowedPerCKEditor4Button(): void {
+    $this->enableModules(['ckeditor4to5upgrade_plugin_test']);
+    \Drupal::state()->set('ckeditor4to5upgrade_plugin_test', 'duplicate_button');
+
+    $this->expectException(\OutOfBoundsException::class);
+    $this->expectExceptionMessage('The "DrupalImage" CKEditor 4 button is already being upgraded by the "core" CKEditor4To5Upgrade plugin, the "foo" plugin is as well. This conflict needs to be resolved.');
+
+    $this->upgradePluginManager->mapCKEditor4ToolbarButtonToCKEditor5ToolbarItem('foo');
+  }
+
+  /**
+   * Tests detecting a lying upgrade plugin cke4_button annotation.
+   */
+  public function testLyingUpgradePluginForCKEditor4Button(): void {
+    $this->enableModules(['ckeditor4to5upgrade_plugin_test']);
+    \Drupal::state()->set('ckeditor4to5upgrade_plugin_test', 'lying_button');
+
+    $this->expectException(\LogicException::class);
+    $this->expectExceptionMessage('The "foo" CKEditor4To5Upgrade plugin claims to provide an upgrade path for the "foo" CKEditor 4 button but does not.');
+
+    $this->upgradePluginManager->mapCKEditor4ToolbarButtonToCKEditor5ToolbarItem('foo');
+  }
+
+  /**
+   * Tests that only one plugin can provide an upgrade path for plugin settings.
+   */
+  public function testOnlyOneUpgradePluginAllowedPerCKEditor4PluginSettings(): void {
+    $this->enableModules(['ckeditor4to5upgrade_plugin_test']);
+    \Drupal::state()->set('ckeditor4to5upgrade_plugin_test', 'duplicate_plugin_settings');
+
+    $this->expectException(\OutOfBoundsException::class);
+    $this->expectExceptionMessage('The "stylescombo" CKEditor 4 plugin\'s settings are already being upgraded by the "core" CKEditor4To5Upgrade plugin, the "foo" plugin is as well. This conflict needs to be resolved.');
+
+    $this->upgradePluginManager->mapCKEditor4ToolbarButtonToCKEditor5ToolbarItem('foo');
+  }
+
+  /**
+   * Tests detecting a lying upgrade plugin cke4_plugin_settings annotation.
+   */
+  public function testLyingUpgradePluginForCKEditor4PluginSettings(): void {
+    $this->enableModules(['ckeditor4to5upgrade_plugin_test']);
+    \Drupal::state()->set('ckeditor4to5upgrade_plugin_test', 'lying_plugin_settings');
+
+    $this->expectException(\LogicException::class);
+    $this->expectExceptionMessage('The "foo" CKEditor4To5Upgrade plugin claims to provide an upgrade path for the "foo" CKEditor 4 plugin settings but does not.');
+
+    $this->upgradePluginManager->mapCKEditor4SettingsToCKEditor5Configuration('foo', []);
+  }
+
+  /**
+   * Tests that only one plugin can provide an upgrade path for a subset plugin.
+   */
+  public function testOnlyOneUpgradePluginAllowedPerCKEditor5ConfigurableSubsetPlugin(): void {
+    $this->enableModules(['ckeditor4to5upgrade_plugin_test']);
+    \Drupal::state()->set('ckeditor4to5upgrade_plugin_test', 'duplicate_subset');
+
+    $this->expectException(\OutOfBoundsException::class);
+    $this->expectExceptionMessage('The "ckeditor5_heading" CKEditor 5 plugin\'s elements subset configuration is already being computed by the "core" CKEditor4To5Upgrade plugin, the "foo" plugin is as well. This conflict needs to be resolved.');
+
+    $this->upgradePluginManager->computeCKEditor5PluginSubsetConfiguration('foo', FilterFormat::create());
+  }
+
+  /**
+   * Tests detecting lying cke5_plugin_elements_subset_configuration annotation.
+   */
+  public function testLyingUpgradePluginForCKEditor5ConfigurableSubsetPlugin(): void {
+    $this->enableModules(['ckeditor4to5upgrade_plugin_test']);
+    \Drupal::state()->set('ckeditor4to5upgrade_plugin_test', 'lying_subset');
+
+    $this->expectException(\LogicException::class);
+    $this->expectExceptionMessage('The "foo" CKEditor4To5Upgrade plugin claims to provide an upgrade path for the "foo" CKEditor 4 plugin settings but does not.');
+
+    $this->upgradePluginManager->computeCKEditor5PluginSubsetConfiguration('foo', FilterFormat::create());
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/CKEditor5PluginManagerTest.php b/core/modules/ckeditor5/tests/src/Kernel/CKEditor5PluginManagerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..151cc4336aca60863b5adbe9f2f63673ee1e5213
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/CKEditor5PluginManagerTest.php
@@ -0,0 +1,1117 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Composer\Autoload\ClassLoader;
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\ckeditor5\Plugin\CKEditor5Plugin\Heading;
+use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\editor\Entity\Editor;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\Tests\SchemaCheckTestTrait;
+use org\bovigo\vfs\vfsStream;
+use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
+use Symfony\Component\Yaml\Yaml;
+
+// cspell:ignore layercake everyblock justblockquote
+
+/**
+ * Tests different ways of enabling CKEditor 5 plugins.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class CKEditor5PluginManagerTest extends KernelTestBase {
+
+  use SchemaCheckTestTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'system',
+    'user',
+    'filter',
+    'editor',
+    'ckeditor5',
+    'media',
+  ];
+
+  /**
+   * The manager for "CKEditor 5 plugin" plugins.
+   *
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $manager;
+
+  /**
+   * The typed config manager.
+   *
+   * @var \Drupal\Core\Config\TypedConfigManagerInterface
+   */
+  protected $typedConfig;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.basic_html.yml')
+    )->save();
+    Editor::create([
+      'format' => 'basic_html',
+      'editor' => 'ckeditor5',
+    ])->save();
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.full_html.yml')
+    )->save();
+    Editor::create([
+      'format' => 'full_html',
+      'editor' => 'ckeditor5',
+    ])->save();
+    $this->manager = $this->container->get('plugin.manager.ckeditor5.plugin');
+    $this->typedConfig = $this->container->get('config.typed');
+  }
+
+  /**
+   * @covers \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition::__construct()
+   * @dataProvider providerTestInvalidPluginDefinitions
+   */
+  public function testInvalidPluginDefinitions(string $yaml, ?string $expected_message, array $additional_files = []): void {
+    if ($expected_message) {
+      $this->expectException(InvalidPluginDefinitionException::class);
+      $this->expectExceptionMessage($expected_message);
+    }
+
+    $site_directory = ltrim(parse_url($this->siteDirectory)['path'], '/');
+    vfsStream::create([
+      'modules' => [
+        'ckeditor5_invalid_plugin' => [
+          'ckeditor5_invalid_plugin.info.yml' => <<<YAML
+name: CKEditor 5 Invalid Plugin Definition Test
+type: module
+core_version_requirement: ^9
+YAML,
+          'ckeditor5_invalid_plugin.ckeditor5.yml' => $yaml,
+        ] + $additional_files,
+      ],
+    ], $this->vfsRoot->getChild($site_directory));
+
+    if (!empty($additional_files)) {
+      $additional_class_loader = new ClassLoader();
+      $additional_class_loader->addPsr4("Drupal\\ckeditor5_invalid_plugin\\Plugin\\CKEditor5Plugin\\", vfsStream::url("root/$site_directory/modules/ckeditor5_invalid_plugin/src/Plugin/CKEditor5Plugin"));
+      $additional_class_loader->register(TRUE);
+    }
+
+    $config_sync = \Drupal::service('config.storage');
+    $config_data = $this->config('core.extension')->get();
+    $config_data['module']['ckeditor5_invalid_plugin'] = 1;
+    $config_sync->write('core.extension', $config_data);
+
+    // Construct a new container for testing a plugin definition in isolation,
+    // without needing a separate module directory structure for it, and instead
+    // allowing it to be provided entirely by a PHPUnit data provider. Inherit
+    // all definitions from the successfully installed Drupal site for this
+    // kernel test, but do not use $this->container. This is a hybrid of kernel
+    // and unit test, to get the best of both worlds: test a unit, but ensure
+    // the service definitions are in sync.
+    $root = vfsStream::url("root/$site_directory");
+    $container = new ContainerBuilder(new FrozenParameterBag([
+      'app.root' => $root,
+      'container.modules' => [
+        'ckeditor5_invalid_plugin' => [
+          'type' => 'module',
+          'pathname' => 'modules/ckeditor5_invalid_plugin/ckeditor5_invalid_plugin.info.yml',
+          'filename' => NULL,
+        ] + $this->container->getParameter('container.modules'),
+      ],
+    ] + $this->container->getParameterBag()->all()));
+    $container->setDefinitions($this->container->getDefinitions());
+
+    // The exception to the above elegance: re-resolve the '%app_root%' param.
+    // @see \Symfony\Component\DependencyInjection\Compiler\ResolveParameterPlaceHoldersPass
+    // @see \Drupal\Core\DrupalKernel::guessApplicationRoot()
+    $container->getDefinition('module_handler')->setArgument(0, '%app.root%');
+
+    // To discover per-test case config schema YAML files, work around the
+    // static file cache in \Drupal\Core\Extension\ExtensionDiscovery. There is
+    // no work-around that allows using both the files on disk and some in vfs.
+    // To make matters worse, decorating a service within the test only is not
+    // an option either, because \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition
+    // is a pure value object, so it uses the global container. Therefore the
+    // only work-around possible is to manipulate the config schema definition
+    // cache.
+    // @todo Remove this in https://www.drupal.org/project/drupal/issues/2961541.
+    if (isset($additional_files['config']['schema']['ckeditor5_invalid_plugin.schema.yml'])) {
+      $cache = \Drupal::service('cache.discovery')->get('typed_config_definitions');
+      $typed_config_definitions = $cache->data;
+      $typed_config_definitions += Yaml::parse($additional_files['config']['schema']['ckeditor5_invalid_plugin.schema.yml']);
+      \Drupal::service('config.typed')->clearCachedDefinitions();
+      \Drupal::service('cache.discovery')->set('typed_config_definitions', $typed_config_definitions, $cache->expire, $cache->tags);
+    }
+
+    $container->get('plugin.manager.ckeditor5.plugin')->getDefinitions();
+  }
+
+  /**
+   * Data provider.
+   *
+   * @return \Generator
+   *   Test scenarios.
+   */
+  public function providerTestInvalidPluginDefinitions(): \Generator {
+    yield 'invalid plugin ID with everything else okay' => [
+      <<<YAML
+foo_bar:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST
+    elements: false
+YAML,
+      'The "foo_bar" CKEditor 5 plugin definition must have a plugin ID that starts with "ckeditor5_invalid_plugin_".',
+    ];
+
+    // Now let's show the progressive exceptions that should steer the plugin
+    // developer in the right direction.
+
+    yield 'only plugin ID, nothing else' => [
+      <<<YAML
+foo_bar: {}
+YAML,
+      'The "foo_bar" CKEditor 5 plugin definition must have a plugin ID that starts with "ckeditor5_invalid_plugin_".',
+    ];
+
+    yield 'fixed plugin ID' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar: {}
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "ckeditor5" key.',
+    ];
+
+    yield 'added ckeditor5' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5: {}
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "ckeditor5.plugins" key.',
+    ];
+
+    yield 'added ckeditor5.plugins' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "drupal" key.',
+    ];
+
+    yield 'added drupal' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal: {}
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "drupal.label" key.',
+    ];
+
+    yield 'added drupal.label' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: {}
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition has a "drupal.label" value that is not a string nor a TranslatableMarkup instance.',
+    ];
+
+    yield 'fixed drupal.label' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "drupal.elements" key.',
+    ];
+
+    yield 'added drupal.elements' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+    elements: {}
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition has a "drupal.elements" value that is neither a list of HTML tags/attributes nor false.',
+    ];
+
+    yield 'wrongly fixed drupal.elements: no valid tags' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+    elements:
+      - foo
+      - bar
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition has a value at "drupal.elements.0" that is not an HTML tag with optional attributes: "foo". Expected structure: "<tag allowedAttribute="allowedValue1 allowedValue2">".',
+    ];
+
+    yield 'wrongly fixed drupal.elements: multiple tags per entry' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+    elements:
+      - <foo> <bar>
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition has a value at "drupal.elements.0": multiple tags listed, should be one: "<foo> <bar>".',
+    ];
+
+    yield 'fixed drupal.elements' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+    elements:
+      - <foo>
+      - <bar>
+YAML,
+      NULL,
+    ];
+
+    yield 'alternative fix for drupal.elements' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+    elements: false
+YAML,
+      NULL,
+    ];
+
+    yield 'added invalid optional metadata: drupal.admin_library' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+    elements:
+      - <foo>
+      - <bar>
+    admin_library: ckeditor5/foo_bar
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition has a "drupal.admin_library" key whose asset library "ckeditor5/foo_bar" does not exist.',
+    ];
+
+    yield 'fixed drupal.admin_library' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+    elements:
+      - <foo>
+      - <bar>
+    admin_library: ckeditor5/admin.basic
+YAML,
+      NULL,
+    ];
+
+    // Add a plugin class; observe what additional requirements need to be met.
+    yield 'added plugin class' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    class: Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin\FooBar
+    label: "Foo bar"
+    elements:
+      - <foo>
+      - <bar>
+    admin_library: ckeditor5/admin.basic
+YAML,
+      'The CKEditor 5 "ckeditor5_invalid_plugin_foo_bar" provides a plugin class: "Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin\FooBar", but it does not exist.',
+    ];
+
+    yield 'defined minimal (but not yet valid) plugin class' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    class: Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin\FooBar
+    label: "Foo bar"
+    elements:
+      - <foo>
+      - <bar>
+    admin_library: ckeditor5/admin.basic
+YAML,
+      'CKEditor 5 plugins must implement \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface. "ckeditor5_invalid_plugin_foo_bar" does not.',
+      [
+        'src' => [
+          'Plugin' => [
+            'CKEditor5Plugin' => [
+              'FooBar.php' => <<<'PHP'
+<?php
+namespace Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin;
+class FooBar {}
+PHP,
+            ],
+          ],
+        ],
+      ],
+    ];
+
+    yield 'defined minimal and valid plugin class' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    class: Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin\FooBar
+    label: "Foo bar"
+    elements:
+      - <foo>
+      - <bar>
+    admin_library: ckeditor5/admin.basic
+YAML,
+      NULL,
+      [
+        'src' => [
+          'Plugin' => [
+            'CKEditor5Plugin' => [
+              'FooBar.php' => <<<'PHP'
+<?php
+namespace Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+class FooBar extends CKEditor5PluginDefault {}
+PHP,
+            ],
+          ],
+        ],
+      ],
+    ];
+
+    // Make the plugin configurable; observe what additional requirements need
+    // to be met.
+    yield 'defined minimal and valid plugin class made configurable but not really anything configurable' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    class: Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin\FooBar
+    label: "Foo bar"
+    elements:
+      - <foo>
+      - <bar>
+    admin_library: ckeditor5/admin.basic
+YAML,
+      NULL,
+      [
+        'src' => [
+          'Plugin' => [
+            'CKEditor5Plugin' => [
+              'FooBar.php' => <<<'PHP'
+<?php
+namespace Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\Core\Form\FormStateInterface;
+class FooBar extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface {
+  use CKEditor5PluginConfigurableTrait;
+  public function defaultConfiguration() { return []; }
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) { return []; }
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {}
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {}
+}
+PHP,
+            ],
+          ],
+        ],
+      ],
+    ];
+
+    yield 'defined minimal and valid plugin class made configurable: invalid if config schema is missing' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    class: Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin\FooBar
+    label: "Foo bar"
+    elements:
+      - <foo>
+      - <bar>
+    admin_library: ckeditor5/admin.basic
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition is configurable, has non-empty default configuration but has no config schema. Config schema is required for validation.',
+      [
+        'src' => [
+          'Plugin' => [
+            'CKEditor5Plugin' => [
+              'FooBar.php' => <<<'PHP'
+<?php
+namespace Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\Core\Form\FormStateInterface;
+class FooBar extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface {
+  use CKEditor5PluginConfigurableTrait;
+  public function defaultConfiguration() { return ['foo' => FALSE]; }
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) { return []; }
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {}
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {}
+}
+PHP,
+            ],
+          ],
+        ],
+      ],
+    ];
+
+    yield 'defined minimal and valid plugin class made configurable: valid if config schema is present' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    class: Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin\FooBar
+    label: "Foo bar"
+    elements:
+      - <foo>
+      - <bar>
+    admin_library: ckeditor5/admin.basic
+YAML,
+      NULL,
+      [
+        'config' => [
+          'schema' => [
+            'ckeditor5_invalid_plugin.schema.yml' => <<<YAML
+ckeditor5.plugin.ckeditor5_invalid_plugin_foo_bar:
+  type: mapping
+  label: 'Foo Bar'
+  mapping:
+    foo:
+      type: boolean
+      label: 'Foo'
+YAML,
+          ],
+        ],
+        'src' => [
+          'Plugin' => [
+            'CKEditor5Plugin' => [
+              'FooBar.php' => <<<'PHP'
+<?php
+namespace Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\Core\Form\FormStateInterface;
+class FooBar extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface {
+  use CKEditor5PluginConfigurableTrait;
+  public function defaultConfiguration() { return ['foo' => FALSE]; }
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) { return []; }
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {}
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {}
+}
+PHP,
+            ],
+          ],
+        ],
+      ],
+    ];
+
+    yield 'defined minimal and valid plugin class made configurable: invalid if config schema is present but incomplete' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    class: Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin\FooBar
+    label: "Foo bar"
+    elements:
+      - <foo>
+      - <bar>
+    admin_library: ckeditor5/admin.basic
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition is configurable, but its default configuration does not match its config schema. The following errors were found: [foo] The configuration property foo.bar doesn\'t exist, [baz] missing schema.',
+      [
+        'config' => [
+          'schema' => [
+            'ckeditor5_invalid_plugin.schema.yml' => <<<YAML
+ckeditor5.plugin.ckeditor5_invalid_plugin_foo_bar:
+  type: mapping
+  label: 'Foo Bar'
+  mapping:
+    foo:
+      type: boolean
+      label: 'Foo'
+YAML,
+          ],
+        ],
+        'src' => [
+          'Plugin' => [
+            'CKEditor5Plugin' => [
+              'FooBar.php' => <<<'PHP'
+<?php
+namespace Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\Core\Form\FormStateInterface;
+class FooBar extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface {
+  use CKEditor5PluginConfigurableTrait;
+  public function defaultConfiguration() { return ['foo' => ['bar' => TRUE], 'baz' => FALSE]; }
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) { return []; }
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {}
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {}
+}
+PHP,
+            ],
+          ],
+        ],
+      ],
+    ];
+
+    yield 'defined minimal and valid plugin class made configurable: valid if config schema is present and complete' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    class: Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin\FooBar
+    label: "Foo bar"
+    elements:
+      - <foo>
+      - <bar>
+    admin_library: ckeditor5/admin.basic
+YAML,
+      NULL,
+      [
+        'config' => [
+          'schema' => [
+            'ckeditor5_invalid_plugin.schema.yml' => <<<YAML
+ckeditor5.plugin.ckeditor5_invalid_plugin_foo_bar:
+  type: mapping
+  label: 'Foo Bar'
+  mapping:
+    foo:
+      type: boolean
+      label: 'Foo'
+    bar:
+      type: boolean
+      label: 'Bar'
+YAML,
+          ],
+        ],
+        'src' => [
+          'Plugin' => [
+            'CKEditor5Plugin' => [
+              'FooBar.php' => <<<'PHP'
+<?php
+namespace Drupal\ckeditor5_invalid_plugin\Plugin\CKEditor5Plugin;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\Core\Form\FormStateInterface;
+class FooBar extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface {
+  use CKEditor5PluginConfigurableTrait;
+  public function defaultConfiguration() { return ['foo' => FALSE, 'bar' => FALSE]; }
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) { return []; }
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {}
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {}
+}
+PHP,
+            ],
+          ],
+        ],
+      ],
+    ];
+  }
+
+  /**
+   * Tests detection of invalid CKEditor5PluginElementsSubsetInterface class.
+   */
+  public function testProvidedElementsInvalidElementSubset(): void {
+    $this->enableModules(['ckeditor5_plugin_elements_subset']);
+
+    // Configure the sneaky superset plugin to have a random tag as the subset.
+    $sneaky_plugin_id = 'ckeditor5_plugin_elements_subset_sneakySuperset';
+    $random_tag = "<{$this->randomMachineName()}>";
+    $text_editor = Editor::create([
+      'format' => 'dummy',
+      'editor' => 'ckeditor5',
+      'settings' => [
+        'plugins' => [
+          $sneaky_plugin_id => ['configured_subset' => [$random_tag]],
+        ],
+      ],
+      'image_upload' => [],
+    ]);
+
+    // No exception when getting all provided elements.
+    $this->assertGreaterThan(0, count($this->manager->getProvidedElements()));
+
+    // No exception when getting the sneaky plugin's provided elements.
+    $this->assertGreaterThan(0, count($this->manager->getProvidedElements([$sneaky_plugin_id])));
+
+    // Exception when getting the sneaky plugin's provided elements *and* a text
+    // editor config entity is passed: only then can a subset be generated based
+    // on configuration.
+    $this->expectException(\LogicException::class);
+    $this->expectExceptionMessage("The \"ckeditor5_plugin_elements_subset_sneakySuperset\" CKEditor 5 plugin implements ::getElementsSubset() and did not return a subset, the following tags are absent from the plugin definition: \"$random_tag\".");
+    $this->manager->getProvidedElements([$sneaky_plugin_id], $text_editor);
+  }
+
+  /**
+   * Tests the enabling of plugins.
+   */
+  public function testEnabledPlugins() {
+    $editor = Editor::load('basic_html');
+
+    // Case 1: no extra CKEditor 5 plugins.
+    $definitions = array_keys($this->manager->getEnabledDefinitions($editor));
+    $default_plugins = [
+      'ckeditor5_bold',
+      'ckeditor5_emphasis',
+      'ckeditor5_essentials',
+      'ckeditor5_heading',
+      'ckeditor5_paragraph',
+      'ckeditor5_pasteFromOffice',
+    ];
+    $this->assertSame($default_plugins, $definitions, 'No CKEditor 5 plugins found besides the built-in ones.');
+    $default_libraries = [
+      'ckeditor5/drupal.ckeditor5',
+      'ckeditor5/drupal.ckeditor5.emphasis',
+      'ckeditor5/drupal.ckeditor5.internal',
+      'core/ckeditor5.basic',
+      'core/ckeditor5.internal',
+      'core/ckeditor5.pasteFromOffice',
+    ];
+    $this->assertSame($default_libraries, $this->manager->getEnabledLibraries($editor));
+
+    // Enable the CKEditor 5 Test module, which has the layercake plugin and
+    // clear the editor manager's static cache so that it is picked up.
+    $this->enableModules(['ckeditor5_test']);
+    $this->manager = $this->container->get('plugin.manager.ckeditor5.plugin');
+    $this->manager->clearCachedDefinitions();
+
+    // Case 2: The CKEditor 5 layercake plugin is available and library should
+    // NOT be loaded if its toolbar items are not enabled.
+    $this->assertSame($default_plugins, array_keys($this->manager->getEnabledDefinitions($editor)));
+    $this->assertSame($default_libraries, $this->manager->getEnabledLibraries($editor));
+
+    // Case 3: The CKEditor 5 layercake plugin is available and library should
+    // be loaded without having to enable plugins.
+    $settings = $editor->getSettings();
+    $settings['toolbar']['items'][] = 'simpleBox';
+    $editor->setSettings($settings);
+    $plugin_ids = array_keys($this->manager->getEnabledDefinitions($editor));
+    $default_plugins_with_layercake = array_merge($default_plugins, ['ckeditor5_test_layercake']);
+
+    // Sort on plugin id.
+    asort($default_plugins_with_layercake);
+    $this->assertSame(array_values($default_plugins_with_layercake), $plugin_ids);
+    $default_libraries_with_layercake = array_merge($default_libraries, ['ckeditor5_test/layercake']);
+    sort($default_libraries_with_layercake);
+    $this->assertSame($default_libraries_with_layercake, $this->manager->getEnabledLibraries($editor));
+
+    // Enable media embed filter which the CKEditor 5 media plugin requires.
+    $editor->getFilterFormat()->setFilterConfig('media_embed', ['status' => TRUE])->save();
+
+    // Case 4: The CKEditor 5 media plugin should be enabled and the library
+    // should be available now that the media_embed is enabled.
+    $plugin_ids = array_keys($this->manager->getEnabledDefinitions($editor));
+    $expected_plugins = array_merge($default_plugins, [
+      'ckeditor5_test_layercake',
+      'media_media',
+    ]);
+    sort($expected_plugins);
+    $this->assertSame($expected_plugins, $plugin_ids);
+    $expected_libraries = array_merge($default_libraries, [
+      'ckeditor5/drupal.ckeditor5.media',
+      'ckeditor5_test/layercake',
+    ]);
+    sort($expected_libraries);
+    $this->assertSame($expected_libraries, $this->manager->getEnabledLibraries($editor));
+
+    // Enable the CKEditor 5 Plugin Conditions Test module, which has the
+    // ckeditor5_plugin_conditions_test_plugins_condition plugin which is
+    // conditionally enabled. Clear the editor manager's static cache so that it
+    // is picked up.
+    $this->enableModules(['ckeditor5_plugin_conditions_test']);
+    $this->manager = $this->container->get('plugin.manager.ckeditor5.plugin');
+    $this->manager->clearCachedDefinitions();
+
+    // Case 5: just installing the ckeditor5_plugin_conditions_test module does
+    // not enable its conditionally enabled plugin.
+    $this->assertSame($expected_plugins, $plugin_ids);
+    $this->assertSame($expected_libraries, $this->manager->getEnabledLibraries($editor));
+
+    // Case 6: placing the table plugin's button enables the table plugin, but
+    // also implicitly enables the conditionally enabled plugin.
+    $settings['toolbar']['items'][] = 'insertTable';
+    $editor->setSettings($settings);
+    $plugin_ids = array_keys($this->manager->getEnabledDefinitions($editor));
+    $expected_plugins = array_merge($expected_plugins, ['ckeditor5_table', 'ckeditor5_plugin_conditions_test_plugins_condition']);
+    sort($expected_plugins);
+    $this->assertSame(array_values($expected_plugins), $plugin_ids);
+    $expected_libraries = array_merge($default_libraries, [
+      'ckeditor5/drupal.ckeditor5.media',
+      'ckeditor5_test/layercake',
+      'core/ckeditor5.table',
+    ]);
+    sort($expected_libraries);
+    $this->assertSame($expected_libraries, $this->manager->getEnabledLibraries($editor));
+
+    // Case 7: GHS is only enabled for Full HTML (or any other text format that
+    // has no TYPE_HTML_RESTRICTOR filters).
+    $editor = Editor::load('full_html');
+    $definitions = array_keys($this->manager->getEnabledDefinitions($editor));
+    $default_plugins = [
+      'ckeditor5_bold',
+      'ckeditor5_emphasis',
+      'ckeditor5_essentials',
+      'ckeditor5_heading',
+      'ckeditor5_htmlSupport',
+      'ckeditor5_paragraph',
+      'ckeditor5_pasteFromOffice',
+    ];
+    $this->assertSame($default_plugins, $definitions, 'No CKEditor 5 plugins found besides the built-in ones.');
+    $default_libraries = [
+      'ckeditor5/drupal.ckeditor5',
+      'ckeditor5/drupal.ckeditor5.emphasis',
+      'ckeditor5/drupal.ckeditor5.internal',
+      'core/ckeditor5.basic',
+      'core/ckeditor5.htmlSupport',
+      'core/ckeditor5.internal',
+      'core/ckeditor5.pasteFromOffice',
+    ];
+    $this->assertSame($default_libraries, $this->manager->getEnabledLibraries($editor));
+  }
+
+  /**
+   * Tests the parsing of CKEditor 5 plugin element config.
+   *
+   * @param string[] $plugins
+   *   The plugins to parse the elements list from.
+   * @param array $text_editor_settings
+   *   The text editor settings.
+   * @param array $expected_elements
+   *   An array of expected allowed elements an attributes in the structure
+   *   used by filter_html.
+   * @param string $expected_readable_string
+   *   The expected allowed tags and attributes as a string, typically used
+   *   in the filter_html "Allowed tags" field.
+   *
+   * @covers \Drupal\ckeditor5\Plugin\CKEditor5PluginManager::getProvidedElements
+   * @covers \Drupal\ckeditor5\HTMLRestrictionsUtilities::toReadableElements
+   * @dataProvider providerTestProvidedElements
+   */
+  public function testProvidedElements(array $plugins, array $text_editor_settings, array $expected_elements, string $expected_readable_string) {
+    $this->enableModules(['ckeditor5_plugin_elements_test']);
+
+    $text_editor = Editor::create([
+      'format' => 'dummy',
+      'editor' => 'ckeditor5',
+      'settings' => $text_editor_settings,
+      'image_upload' => [],
+    ]);
+    $this->assertConfigSchema(
+      $this->typedConfig,
+      $text_editor->getConfigDependencyName(),
+      $text_editor->toArray()
+    );
+
+    $provided_elements = $this->manager->getProvidedElements($plugins, $text_editor);
+    $this->assertSame($expected_elements, $provided_elements);
+    $readable_string = implode(' ', HTMLRestrictionsUtilities::toReadableElements($provided_elements));
+    $this->assertSame($expected_readable_string, $readable_string);
+  }
+
+  /**
+   * Provides uses cases enabling different elements and the expected results.
+   */
+  public function providerTestProvidedElements(): array {
+    $text_align_classes = [
+      'text-align-left' => TRUE,
+      'text-align-center' => TRUE,
+      'text-align-right' => TRUE,
+      'text-align-justify' => TRUE,
+    ];
+
+    return [
+      'sourceEditing' => [
+        'plugins' => ['ckeditor5_sourceEditing'],
+        'text_editor_settings' => [],
+        'expected_elements' => [],
+        'expected_readable_string' => '',
+      ],
+      'language' => [
+        'plugins' => ['ckeditor5_language'],
+        'text_editor_settings' => [],
+        'expected_elements' => [
+          'span' => [
+            'lang' => TRUE,
+            'dir' => TRUE,
+          ],
+        ],
+        'expected_readable_string' => '<span lang dir>',
+      ],
+      'alignment and heading' => [
+        'plugins' => [
+          'ckeditor5_alignment',
+          'ckeditor5_heading',
+          'ckeditor5_paragraph',
+        ],
+        'text_editor_settings' => [
+          'plugins' => [
+            'ckeditor5_heading' => Heading::DEFAULT_CONFIGURATION,
+          ],
+        ],
+        'expected_elements' => [
+          'p' => [
+            'class' => $text_align_classes,
+          ],
+          'h2' => [
+            'class' => $text_align_classes,
+          ],
+          'h3' => [
+            'class' => $text_align_classes,
+          ],
+          'h4' => [
+            'class' => $text_align_classes,
+          ],
+          'h5' => [
+            'class' => $text_align_classes,
+          ],
+          'h6' => [
+            'class' => $text_align_classes,
+          ],
+        ],
+        'expected_readable_string' => '<p class="text-align-left text-align-center text-align-right text-align-justify"> <h2 class="text-align-left text-align-center text-align-right text-align-justify"> <h3 class="text-align-left text-align-center text-align-right text-align-justify"> <h4 class="text-align-left text-align-center text-align-right text-align-justify"> <h5 class="text-align-left text-align-center text-align-right text-align-justify"> <h6 class="text-align-left text-align-center text-align-right text-align-justify">',
+      ],
+      'alignment and heading, but all class values allowed for headings' => [
+        'plugins' => [
+          'ckeditor5_alignment',
+          'ckeditor5_heading',
+          'ckeditor5_paragraph',
+          'ckeditor5_plugin_elements_test_headingsUseClassAnyValue',
+        ],
+        'text_editor_settings' => [
+          'plugins' => [
+            'ckeditor5_heading' => Heading::DEFAULT_CONFIGURATION,
+          ],
+        ],
+        'expected_elements' => [
+          'p' => [
+            'class' => $text_align_classes,
+          ],
+          'h2' => [
+            'class' => TRUE,
+          ],
+          'h3' => [
+            'class' => TRUE,
+          ],
+          'h4' => [
+            'class' => TRUE,
+          ],
+          'h5' => [
+            'class' => TRUE,
+          ],
+          'h6' => [
+            'class' => TRUE,
+          ],
+          'h1' => [
+            'class' => TRUE,
+          ],
+        ],
+        'expected_readable_string' => '<p class="text-align-left text-align-center text-align-right text-align-justify"> <h2 class> <h3 class> <h4 class> <h5 class> <h6 class> <h1 class>',
+      ],
+      'blockquote combo' => [
+        'plugins' => [
+          'ckeditor5_plugin_elements_test_blockquoteCombo',
+          'ckeditor5_paragraph',
+        ],
+        'text_editor_settings' => [
+          'plugins' => [
+            'ckeditor5_heading' => Heading::DEFAULT_CONFIGURATION,
+          ],
+        ],
+        'expected_elements' => [
+          'p' => [
+            'data-everyblock' => TRUE,
+          ],
+          'blockquote' => [
+            'data-justblockquote' => TRUE,
+            'data-everyblock' => TRUE,
+          ],
+        ],
+        'expected_readable_string' => '<p data-everyblock> <blockquote data-justblockquote data-everyblock>',
+      ],
+      'headings plus headings with attributes' => [
+        'plugins' => [
+          'ckeditor5_plugin_elements_test_headingsWithOtherAttributes',
+          'ckeditor5_heading',
+        ],
+        'text_editor_settings' => [
+          'plugins' => [
+            'ckeditor5_heading' => Heading::DEFAULT_CONFIGURATION,
+          ],
+        ],
+        'expected_elements' => [
+          'h2' => [
+            'class' => [
+              'additional-allowed-class' => TRUE,
+            ],
+          ],
+          'h3' => [
+            'data-just-h3' => TRUE,
+            'data-just-h3-limited' => [
+              'i-am-the-only-allowed-value' => TRUE,
+            ],
+          ],
+          'h4' => FALSE,
+          'h5' => [
+            'data-just-h5-limited' => [
+              'first-allowed-value' => TRUE,
+              'second-allowed-value' => TRUE,
+            ],
+          ],
+          'h6' => FALSE,
+          'h1' => [
+            'data-just-h1' => TRUE,
+          ],
+        ],
+        'expected_readable_string' => '<h2 class="additional-allowed-class"> <h3 data-just-h3 data-just-h3-limited="i-am-the-only-allowed-value"> <h4> <h5 data-just-h5-limited="first-allowed-value second-allowed-value"> <h6> <h1 data-just-h1>',
+      ],
+      'headings plus headings with attributes and alignment' => [
+        'plugins' => [
+          'ckeditor5_plugin_elements_test_headingsWithOtherAttributes',
+          'ckeditor5_heading',
+          'ckeditor5_alignment',
+        ],
+        'text_editor_settings' => [
+          'plugins' => [
+            'ckeditor5_heading' => Heading::DEFAULT_CONFIGURATION,
+          ],
+        ],
+        'expected_elements' => [
+          'h2' => [
+            'class' => ['additional-allowed-class' => TRUE] + $text_align_classes,
+          ],
+          'h3' => [
+            'data-just-h3' => TRUE,
+            'data-just-h3-limited' => [
+              'i-am-the-only-allowed-value' => TRUE,
+            ],
+            'class' => $text_align_classes,
+          ],
+          'h4' => [
+            'class' => $text_align_classes,
+          ],
+          'h5' => [
+            'data-just-h5-limited' => [
+              'first-allowed-value' => TRUE,
+              'second-allowed-value' => TRUE,
+            ],
+            'class' => $text_align_classes,
+          ],
+          'h6' => [
+            'class' => $text_align_classes,
+          ],
+          'h1' => [
+            'data-just-h1' => TRUE,
+            'class' => $text_align_classes,
+          ],
+        ],
+        'expected_readable_string' => '<h2 class="additional-allowed-class text-align-left text-align-center text-align-right text-align-justify"> <h3 data-just-h3 data-just-h3-limited="i-am-the-only-allowed-value" class="text-align-left text-align-center text-align-right text-align-justify"> <h4 class="text-align-left text-align-center text-align-right text-align-justify"> <h5 data-just-h5-limited="first-allowed-value second-allowed-value" class="text-align-left text-align-center text-align-right text-align-justify"> <h6 class="text-align-left text-align-center text-align-right text-align-justify"> <h1 data-just-h1 class="text-align-left text-align-center text-align-right text-align-justify">',
+      ],
+    ];
+  }
+
+  /**
+   * Tests the logic of findPluginSupportingElement.
+   *
+   * When multiple plugins support a given tag, this method decides which plugin
+   * to return based on which provides the broadest attribute support.
+   *
+   * @covers \Drupal\ckeditor5\Plugin\CKEditor5PluginManager::findPluginSupportingElement
+   *
+   * @dataProvider providerTestPluginSupportingElement
+   */
+  public function testPluginSupportingElement(string $tag, ?string $expected_plugin_id) {
+    $this->enableModules(['ckeditor5_definition_supporting_element']);
+    $plugin_id = $this->manager->findPluginSupportingElement($tag);
+    $this->assertSame($expected_plugin_id, $plugin_id);
+  }
+
+  /**
+   * Provides use cases for findPluginSupportingElement().
+   */
+  public function providerTestPluginSupportingElement() {
+    return [
+      'tag that belongs to a superset' => [
+        'tag' => 'h2',
+        'expected_plugin' => 'ckeditor5_heading',
+      ],
+      'tag only available as tag' => [
+        'tag' => 'nav',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_just_nav',
+      ],
+      'between just tag, full use of class, and constrained use of class, return full use of class' => [
+        'tag' => 'article',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_article_class',
+      ],
+      'between just tag and full use of class, return full use of class' => [
+        'tag' => 'footer',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_footer_class',
+      ],
+      'between just tag and constrained use of class, return constrained use of class' => [
+        'tag' => 'aside',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_aside_class_with_values',
+      ],
+      'between full use of class and constrained use of class, return full use of class' => [
+        'tag' => 'main',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_main_class',
+      ],
+      'between one plugin allows one attribute, second allows two, return the one that allows two' => [
+        'tag' => 'figure',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_figure_two_attrib',
+      ],
+      'between one plugin allows one attribute, second allows two (but appearing in opposite order), still return the one that allows two' => [
+        'tag' => 'dialog',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_dialog_two_attrib',
+      ],
+      'tag that belongs to a plugin with conditions' => [
+        'tag' => 'drupal-media',
+        'expected_plugin' => NULL,
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/CKEditor5ValidationTestTrait.php b/core/modules/ckeditor5/tests/src/Kernel/CKEditor5ValidationTestTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..16c43e5ba0ec5e0d51f846b27be2747b8c908075
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/CKEditor5ValidationTestTrait.php
@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\editor\EditorInterface;
+use Drupal\filter\FilterFormatInterface;
+
+/**
+ * Defines a trait for testing CKEditor 5 validity.
+ */
+trait CKEditor5ValidationTestTrait {
+
+  /**
+   * Decorator for CKEditor5::validatePair() that returns an assertable array.
+   *
+   * @param \Drupal\editor\EditorInterface $text_editor
+   *   The paired text editor to validate.
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The paired text format to validate.
+   * @param bool $all_compatibility_problems
+   *   Only fundamental compatibility violations are returned unless TRUE.
+   *
+   * @return array
+   *   An array with property paths as keys and violation messages as values.
+   *
+   * @see \Drupal\ckeditor5\Plugin\Editor\CKEditor5::validatePair
+   */
+  private function validatePairToViolationsArray(EditorInterface $text_editor, FilterFormatInterface $text_format, bool $all_compatibility_problems): array {
+    $violations = CKEditor5::validatePair($text_editor, $text_format, $all_compatibility_problems);
+    $actual_violations = [];
+    foreach ($violations as $violation) {
+      if (!isset($actual_violations[$violation->getPropertyPath()])) {
+        $actual_violations[$violation->getPropertyPath()] = (string) $violation->getMessage();
+      }
+      else {
+        // Transform value from string to array.
+        if (is_string($actual_violations[$violation->getPropertyPath()])) {
+          $actual_violations[$violation->getPropertyPath()] = (array) $actual_violations[$violation->getPropertyPath()];
+        }
+        // And append.
+        $actual_violations[$violation->getPropertyPath()][] = (string) $violation->getMessage();
+      }
+    }
+    return $actual_violations;
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/ConfigurablePluginTest.php b/core/modules/ckeditor5/tests/src/Kernel/ConfigurablePluginTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a598b165804746a23668481a902437042500498
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/ConfigurablePluginTest.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Tests configurable plugins.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class ConfigurablePluginTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'ckeditor5',
+    // These modules must be installed for ckeditor5_config_schema_info_alter()
+    // to work, which in turn is necessary for the plugin definition validation
+    // logic.
+    // @see \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition::validateDrupalAspects()
+    'filter',
+    'editor',
+  ];
+
+  /**
+   * The manager for "CKEditor 5 plugin" plugins.
+   *
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $manager;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    $this->manager = $this->container->get('plugin.manager.ckeditor5.plugin');
+  }
+
+  /**
+   * Tests default settings for configurable CKEditor 5 plugins.
+   */
+  public function testDefaults() {
+    $all_definitions = $this->manager->getDefinitions();
+    $configurable_definitions = array_filter($all_definitions, function (CKEditor5PluginDefinition $definition): bool {
+      return $definition->isConfigurable();
+    });
+    $default_plugin_settings = [];
+    foreach (array_keys($configurable_definitions) as $plugin_name) {
+      $default_plugin_settings[$plugin_name] = $this->manager->getPlugin($plugin_name, NULL)->defaultConfiguration();
+    }
+
+    $expected_default_plugin_settings = [
+      'ckeditor5_heading' => [
+        'enabled_headings' => [
+          'heading2',
+          'heading3',
+          'heading4',
+          'heading5',
+          'heading6',
+        ],
+      ],
+      'ckeditor5_sourceEditing' => [
+        'allowed_tags' => [],
+      ],
+      'ckeditor5_language' => [
+        'language_list' => 'un',
+      ],
+      'ckeditor5_imageUpload' => [],
+    ];
+    $this->assertSame($expected_default_plugin_settings, $default_plugin_settings);
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/LanguageTest.php b/core/modules/ckeditor5/tests/src/Kernel/LanguageTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c5bfa506ac07019138019883878b027f9c52255b
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/LanguageTest.php
@@ -0,0 +1,122 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\language\Entity\ConfigurableLanguage;
+use Symfony\Component\Yaml\Yaml;
+
+/**
+ * Tests language resolving for CKEditor 5.
+ *
+ * @group ckeditor5
+ * @internal
+ */
+class LanguageTest extends KernelTestBase {
+
+  /**
+   * The CKEditor 5 plugin.
+   *
+   * @var \Drupal\ckeditor5\Plugin\Editor\CKEditor5
+   */
+  protected $ckeditor5;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'system',
+    'user',
+    'ckeditor5',
+    'editor',
+    'filter',
+    'language',
+    'locale',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    $this->ckeditor5 = $this->container->get('plugin.manager.editor')->createInstance('ckeditor5');
+
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.basic_html.yml')
+    )->save();
+    Editor::create([
+      'format' => 'basic_html',
+      'editor' => 'ckeditor5',
+    ])->save();
+
+    $this->installConfig(['language']);
+  }
+
+  /**
+   * Ensure that languages are resolved correctly.
+   *
+   * @param string $drupal_langcode
+   *   The language code in Drupal.
+   * @param string $cke5_langcode
+   *   The language code in CKEditor 5.
+   * @param bool $is_missing_mapping
+   *   Whether this mapping is expected to be missing from language.mappings.
+   *
+   * @dataProvider provider
+   */
+  public function test(string $drupal_langcode, string $cke5_langcode, bool $is_missing_mapping = FALSE): void {
+    $editor = Editor::load('basic_html');
+
+    ConfigurableLanguage::createFromLangcode($drupal_langcode)->save();
+    $this->config('system.site')->set('default_langcode', $drupal_langcode)->save();
+
+    if ($is_missing_mapping) {
+      // CKEditor 5's UI language falls back to English, until the language
+      // mapping is expanded.
+      $settings = $this->ckeditor5->getJSSettings($editor);
+      $this->assertSame('en', $settings['language']['ui']);
+
+      // Expand the language mapping.
+      $config = $this->config('language.mappings');
+      $mapping = $config->get('map');
+      $mapping += [$cke5_langcode => $drupal_langcode];
+      $config->set('map', $mapping)->save();
+    }
+
+    $settings = $this->ckeditor5->getJSSettings($editor);
+    $this->assertSame($cke5_langcode, $settings['language']['ui']);
+  }
+
+  /**
+   * Provides a list of language code pairs.
+   *
+   * @return \string[][]
+   */
+  public function provider(): array {
+    $random_langcode = $this->randomMachineName();
+    return [
+      'Language code transformed from browser mappings' => [
+        'drupal_langcode' => 'pt-pt',
+        'cke_langcode' => 'pt',
+      ],
+      'Language code transformed from browser mappings 2' => [
+        'drupal_langcode' => 'zh-hans',
+        'cke_langcode' => 'zh-cn',
+      ],
+      'Language code both in Drupal and CKEditor' => [
+        'drupal_langcode' => 'fi',
+        'cke_langcode' => 'fi',
+      ],
+      'Language code not in Drupal but in CKEditor 5 requires new language.mappings entry' => [
+        'drupal_langcode' => $random_langcode,
+        'cke_langcode' => 'de-ch',
+        'is_missing_mapping' => TRUE,
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/SmartDefaultSettingsTest.php b/core/modules/ckeditor5/tests/src/Kernel/SmartDefaultSettingsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d03e2c98f9688bc84642f8ddbf1046273617e41e
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/SmartDefaultSettingsTest.php
@@ -0,0 +1,682 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\Component\Utility\NestedArray;
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\Tests\SchemaCheckTestTrait;
+use Symfony\Component\Yaml\Yaml;
+
+/**
+ * @covers \Drupal\ckeditor5\SmartDefaultSettings::computeSmartDefaultSettings()
+ * @group ckeditor5
+ * @internal
+ */
+class SmartDefaultSettingsTest extends KernelTestBase {
+
+  use SchemaCheckTestTrait;
+  use CKEditor5ValidationTestTrait;
+
+  /**
+   * The manager for "CKEditor 5 plugin" plugins.
+   *
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $manager;
+
+  /**
+   * The typed config manager.
+   *
+   * @var \Drupal\Core\Config\TypedConfigManagerInterface
+   */
+  protected $typedConfig;
+
+  /**
+   * Smart default settings utility.
+   *
+   * @var \Drupal\ckeditor5\SmartDefaultSettings
+   */
+  protected $smartDefaultSettings;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'ckeditor',
+    'ckeditor_test',
+    'ckeditor5',
+    'editor',
+    'filter',
+    'user',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    $this->manager = $this->container->get('plugin.manager.ckeditor5.plugin');
+    $this->typedConfig = $this->container->get('config.typed');
+    $this->smartDefaultSettings = $this->container->get('ckeditor5.smart_default_settings');
+
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.full_html.yml')
+    )
+      ->setSyncing(TRUE)
+      ->save();
+    Editor::create(
+      Yaml::parseFile('core/profiles/standard/config/install/editor.editor.full_html.yml')
+    )->save();
+
+    $basic_html_format = Yaml::parseFile('core/profiles/standard/config/install/filter.format.basic_html.yml');
+    FilterFormat::create($basic_html_format)->save();
+    Editor::create(
+      Yaml::parseFile('core/profiles/standard/config/install/editor.editor.basic_html.yml')
+    )->save();
+
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.restricted_html.yml')
+    )->save();
+
+    $allowed_html_parents = ['filters', 'filter_html', 'settings', 'allowed_html'];
+    $current_value = NestedArray::getValue($basic_html_format, $allowed_html_parents);
+    $new_value = str_replace(['<h4 id> ', '<h6 id> '], '', $current_value);
+    $basic_html_format_without_h4_h6 = $basic_html_format;
+    $basic_html_format_without_h4_h6['name'] .= ' (without H4 and H6)';
+    $basic_html_format_without_h4_h6['format'] = 'basic_html_without_h4_h6';
+    NestedArray::setValue($basic_html_format_without_h4_h6, $allowed_html_parents, $new_value);
+    FilterFormat::create($basic_html_format_without_h4_h6)->save();
+    Editor::create(
+      ['format' => 'basic_html_without_h4_h6']
+      +
+      Yaml::parseFile('core/profiles/standard/config/install/editor.editor.basic_html.yml')
+    )->save();
+
+    $filter_plugin_manager = $this->container->get('plugin.manager.filter');
+    FilterFormat::create([
+      'format' => 'filter_only__filter_html',
+      'name' => 'Only the "filter_html" filter and its default settings',
+      'filters' => [
+        'filter_html' => [
+          'status' => 1,
+          'settings' => $filter_plugin_manager->getDefinition('filter_html')['settings'],
+        ],
+      ],
+    ])->save();
+
+    FilterFormat::create([
+      'format' => 'cke4_plugins_with_settings',
+      'name' => 'All CKEditor 4 core plugins with settings',
+    ])->save();
+    Editor::create([
+      'format' => 'cke4_plugins_with_settings',
+      'editor' => 'ckeditor',
+      'settings' => [
+        'toolbar' => [
+          'rows' => [
+            0 => [
+              [
+                'name' => 'Buttons with settings',
+                'items' => [
+                  'Language',
+                  'Styles',
+                ],
+              ],
+              [
+                'name' => 'Button without upgrade path',
+                'items' => [
+                  'Llama',
+                ],
+              ],
+            ],
+          ],
+        ],
+        'plugins' => [
+          'language' => [
+            'language_list' => 'all',
+          ],
+          'stylescombo' => [
+            'styles' => "p.callout|Callout\r\nblockquote.interesting|Interesting quote",
+          ],
+          // Plugin setting without upgrade path.
+          'llama_contextual_and_button' => [
+            'ultra_llama_mode' => TRUE,
+          ],
+        ],
+      ],
+    ])->save();
+
+    FilterFormat::create([
+      'format' => 'cke4_plugins_with_settings_for_disabled_plugins',
+      'name' => 'All CKEditor 4 core plugins with settings for disabled plugins',
+    ])->save();
+    Editor::create([
+      'format' => 'cke4_plugins_with_settings_for_disabled_plugins',
+      'editor' => 'ckeditor',
+      'settings' => [
+        // Empty toolbar.
+        'toolbar' => [
+          'rows' => [
+            0 => [
+              [
+                'name' => 'Only buttons without settings',
+                'items' => [
+                  'Bold',
+                ],
+              ],
+            ],
+          ],
+        ],
+        // Same plugin settings as `cke4_plugins_with_settings`.
+        'plugins' => Editor::load('cke4_plugins_with_settings')->getSettings()['plugins'],
+      ],
+    ])->save();
+
+  }
+
+  /**
+   * Tests the CKEditor 5 default settings conversion.
+   *
+   * @param string $format_id
+   *   The existing text format/editor pair to switch to CKEditor 5.
+   * @param array $filters_to_drop
+   *   An array of filter IDs to drop as the keys and either TRUE (fundamental
+   *   compatibility error from CKEditor 5 expected) or FALSE (if optional to
+   *   drop).
+   * @param array $expected_ckeditor5_settings
+   *   The CKEditor 5 settings to test.
+   * @param string $expected_superset
+   *   The default settings conversion may generate a superset of the original
+   *   HTML restrictions. This lists the additional elements and attributes.
+   * @param array $expected_fundamental_compatibility_violations
+   *   All expected fundamental compatibility violations for the given text
+   *   format.
+   * @param string[] $expected_messages
+   *   The expected messages associated with the computed settings.
+   * @param array|null $expected_post_filter_drop_fundamental_compatibility_violations
+   *   All expected fundamental compatibility violations for the given text
+   *   format, after dropping filters specified in $filters_to_drop.
+   *
+   * @dataProvider provider
+   */
+  public function test(string $format_id, array $filters_to_drop, array $expected_ckeditor5_settings, string $expected_superset, array $expected_fundamental_compatibility_violations, array $expected_messages, ?array $expected_post_filter_drop_fundamental_compatibility_violations = NULL): void {
+    $text_format = FilterFormat::load($format_id);
+    $text_editor = Editor::load($format_id);
+
+    // Check the pre-CKE5 switch validation errors in case of a minimal (empty)
+    // CKEditor 5 text editor config entity, to allow us to detect fundamental
+    // compatibility problems, such as incompatible filters.
+    $minimal_valid_cke5_text_editor = Editor::create([
+      'format' => $format_id,
+      'editor' => 'ckeditor5',
+      'settings' => ['toolbar' => ['items' => []]],
+    ]);
+    $pre_ck5_validation_errors = $this->validatePairToViolationsArray($minimal_valid_cke5_text_editor, $text_format, FALSE);
+    $this->assertSame($expected_fundamental_compatibility_violations, $pre_ck5_validation_errors);
+
+    if (!empty($filters_to_drop)) {
+      foreach ($filters_to_drop as $filter_name => $is_fundamentally_incompatible) {
+        // Assert if it should appear in the pre-CKE5 switch validation errors.
+        $this->assertSame($is_fundamentally_incompatible, mb_strpos(implode("\n\n", $pre_ck5_validation_errors[''] ?? []), $filter_name) !== FALSE);
+        $text_format->setFilterConfig($filter_name, [
+          'status' => FALSE,
+        ]);
+      }
+
+      // If filters were dropped because of a fundamental compatibility problem,
+      // validate the text format + minimal CKEditor 5 text editor config again
+      // after dropping those filters from the text format. This allows us to be
+      // confident that we have caught all fundamental compatibility problems.
+      if (!empty(array_filter($filters_to_drop))) {
+        $post_filter_drop_validation_errors = $this->validatePairToViolationsArray($minimal_valid_cke5_text_editor, $text_format, FALSE);
+        $this->assertSame($expected_post_filter_drop_fundamental_compatibility_violations, $post_filter_drop_validation_errors);
+      }
+    }
+
+    [$updated_text_editor, $messages] = $this->smartDefaultSettings->computeSmartDefaultSettings($text_editor, $text_format);
+
+    // Ensure that the result of ::computeSmartDefaultSettings() always complies
+    // with the config schema.
+    $this->assertConfigSchema(
+      $this->typedConfig,
+      $updated_text_editor->getConfigDependencyName(),
+      $updated_text_editor->toArray()
+    );
+
+    // We should now have the expected data in the Editor config entity.
+    $this->assertSame('ckeditor5', $updated_text_editor->getEditor());
+    $this->assertSame($expected_ckeditor5_settings, $updated_text_editor->getSettings());
+
+    // If this text format already had a text editor, ensure that the settings
+    // do not match the original settings, but the image upload settings should
+    // not have been changed.
+    if ($text_editor !== NULL) {
+      $this->assertNotSame($text_editor->getSettings(), $updated_text_editor->getSettings());
+      $this->assertSame($text_editor->getImageUploadSettings(), $updated_text_editor->getImageUploadSettings());
+    }
+
+    // The resulting Editor config entity should be valid.
+    $typed_config = $this->typedConfig->createFromNameAndData(
+      $updated_text_editor->getConfigDependencyName(),
+      $updated_text_editor->toArray(),
+    );
+    $this->assertCount(0, $typed_config->validate());
+
+    // If the text format has HTML restrictions, ensure that a strict superset
+    // is allowed after switching to CKEditor 5.
+    $html_restrictions = $text_format->getHtmlRestrictions();
+    $allowed_tags = $html_restrictions['allowed'] ?? [];
+    if ($allowed_tags) {
+      unset($allowed_tags['*']);
+      $enabled_plugins = array_keys($this->manager->getEnabledDefinitions($updated_text_editor));
+      $updated_allowed_tags = $this->manager->getProvidedElements($enabled_plugins, $updated_text_editor);
+      $unsupported_tags_attributes = HTMLRestrictionsUtilities::diffAllowedElements($allowed_tags, $updated_allowed_tags);
+      $superset_tags_attributes = HTMLRestrictionsUtilities::diffAllowedElements($updated_allowed_tags, $allowed_tags);
+      $this->assertSame($expected_superset, implode(' ', HTMLRestrictionsUtilities::toReadableElements($superset_tags_attributes)));
+      $this->assertEmpty($unsupported_tags_attributes, "The following tags/attributes are not allowed in the updated text format:" . print_r($unsupported_tags_attributes, TRUE));
+
+      // Update the text format like ckeditor5_form_filter_format_form_alter()
+      // would.
+      $updated_text_format = clone $text_format;
+      $filter_html_config = $text_format->filters('filter_html')->getConfiguration();
+      $filter_html_config['settings']['allowed_html'] = implode(' ', HTMLRestrictionsUtilities::toReadableElements($updated_allowed_tags));
+      $updated_text_format->setFilterConfig('filter_html', $filter_html_config);
+    }
+    else {
+      // No update.
+      $updated_text_format = $text_format;
+    }
+
+    // The resulting pair should be valid.
+    $this->assertSame([], $this->validatePairToViolationsArray($updated_text_editor, $updated_text_format, TRUE));
+
+    foreach ($messages as $key => $message) {
+      $messages[$key] = (string) $message;
+    }
+    $this->assertSame($expected_messages, $messages);
+  }
+
+  /**
+   * Data provider.
+   *
+   * @return \Generator
+   *   Test scenarios.
+   */
+  public function provider() {
+    $basic_html_test_case = [
+      'format_id' => 'basic_html',
+      'filters_to_drop' => [],
+      'expected_ckeditor5_settings' => [
+        'toolbar' => [
+          'items' => [
+            // Items based on toolbar items from prior config.
+            'bold',
+            'italic',
+            '|',
+            'link',
+            '|',
+            'bulletedList',
+            'numberedList',
+            '|',
+            'blockQuote',
+            'uploadImage',
+            '|',
+            'heading',
+            '|',
+            'sourceEditing',
+            // Items added based on "allowed tags" config.
+            '|',
+            // The 'code' button added because <code> is allowed.
+            'code',
+            // The 'textPartLanguage' button added because <span> is allowed.
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [
+              '<cite>',
+              '<dl>',
+              '<dt>',
+              '<dd>',
+              '<a hreflang>',
+              '<blockquote cite>',
+              '<ul type>',
+              '<ol start type>',
+              '<h2 id>',
+              '<h3 id>',
+              '<h4 id>',
+              '<h5 id>',
+              '<h6 id>',
+            ],
+          ],
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+          'ckeditor5_language' => [
+            'language_list' => 'un',
+          ],
+        ],
+      ],
+      'expected_superset' => '<span lang dir>',
+      'expected_fundamental_compatibility_violations' => [],
+      'expected_messages' => [
+        'The following plugins were enabled to support tags that are allowed by this text format: <em class="placeholder">Code (for tags: &lt;code&gt;) Language (for tags: &lt;span&gt;)</em>.',
+        'The following tags were permitted by this format\'s filter configuration, but no plugin was available that supports them. To ensure the tags remain supported by this text format, the following were added to the Source Editing plugin\'s <em>Manually editable HTML tags</em>: &lt;cite&gt; &lt;dl&gt; &lt;dt&gt; &lt;dd&gt;.',
+      ],
+    ];
+
+    yield "basic_html can be switched to CKEditor 5 without problems (3 upgrade messages)" => NestedArray::mergeDeep(
+      $basic_html_test_case,
+      [
+        'expected_messages' => [
+          'This format\'s HTML filters includes plugins that support the following tags, but not some of their attributes. To ensure these attributes remain supported by this text format, the following were added to the Source Editing plugin\'s <em>Manually editable HTML tags</em>: &lt;a hreflang&gt; &lt;blockquote cite&gt; &lt;ul type&gt; &lt;ol start type&gt; &lt;h2 id&gt; &lt;h3 id&gt; &lt;h4 id&gt; &lt;h5 id&gt; &lt;h6 id&gt;.',
+        ],
+      ]
+    );
+
+    yield "basic_html with filter_caption removed => disallows <img data-caption> => supported through sourceEditing (3 upgrade messages)" => NestedArray::mergeDeep(
+      $basic_html_test_case,
+      [
+        'filters_to_drop' => [
+          'filter_caption' => FALSE,
+        ],
+        'expected_ckeditor5_settings' => [
+          'plugins' => [
+            'ckeditor5_sourceEditing' => [
+              'allowed_tags' => [
+                '<img data-caption>',
+              ],
+            ],
+          ],
+        ],
+        'expected_messages' => [
+          'This format\'s HTML filters includes plugins that support the following tags, but not some of their attributes. To ensure these attributes remain supported by this text format, the following were added to the Source Editing plugin\'s <em>Manually editable HTML tags</em>: &lt;a hreflang&gt; &lt;blockquote cite&gt; &lt;ul type&gt; &lt;ol start type&gt; &lt;h2 id&gt; &lt;h3 id&gt; &lt;h4 id&gt; &lt;h5 id&gt; &lt;h6 id&gt; &lt;img data-caption&gt;.',
+        ],
+      ]);
+
+    yield "basic_html with filter_align removed => disallows <img data-align> => supported through sourceEditing (3 upgrade messages) " => NestedArray::mergeDeep(
+      $basic_html_test_case,
+      [
+        'filters_to_drop' => [
+          'filter_align' => FALSE,
+        ],
+        'expected_ckeditor5_settings' => [
+          'plugins' => [
+            'ckeditor5_sourceEditing' => [
+              'allowed_tags' => [
+                '<img data-align>',
+              ],
+            ],
+          ],
+        ],
+        'expected_messages' => [
+          'This format\'s HTML filters includes plugins that support the following tags, but not some of their attributes. To ensure these attributes remain supported by this text format, the following were added to the Source Editing plugin\'s <em>Manually editable HTML tags</em>: &lt;a hreflang&gt; &lt;blockquote cite&gt; &lt;ul type&gt; &lt;ol start type&gt; &lt;h2 id&gt; &lt;h3 id&gt; &lt;h4 id&gt; &lt;h5 id&gt; &lt;h6 id&gt; &lt;img data-align&gt;.',
+        ],
+      ]);
+
+    yield "basic_html_without_h4_h6 can be switched to CKEditor 5 without problems, heading configuration computed automatically" => [
+      'format_id' => 'basic_html_without_h4_h6',
+      'filters_to_drop' => $basic_html_test_case['filters_to_drop'],
+      'expected_ckeditor5_settings' => [
+        'toolbar' => $basic_html_test_case['expected_ckeditor5_settings']['toolbar'],
+        'plugins' => [
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => array_values(array_diff(
+              $basic_html_test_case['expected_ckeditor5_settings']['plugins']['ckeditor5_sourceEditing']['allowed_tags'],
+              ['<h4 id>', '<h6 id>'],
+            )),
+          ],
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading5',
+            ],
+          ],
+          'ckeditor5_language' => $basic_html_test_case['expected_ckeditor5_settings']['plugins']['ckeditor5_language'],
+        ],
+      ],
+      'expected_superset' => $basic_html_test_case['expected_superset'],
+      'expected_fundamental_compatibility_violations' => $basic_html_test_case['expected_fundamental_compatibility_violations'],
+      'expected_messages' => array_merge(
+        $basic_html_test_case['expected_messages'],
+        ['This format\'s HTML filters includes plugins that support the following tags, but not some of their attributes. To ensure these attributes remain supported by this text format, the following were added to the Source Editing plugin\'s <em>Manually editable HTML tags</em>: &lt;a hreflang&gt; &lt;blockquote cite&gt; &lt;ul type&gt; &lt;ol start type&gt; &lt;h2 id&gt; &lt;h3 id&gt; &lt;h5 id&gt;.'],
+      ),
+    ];
+
+    yield "restricted_html can be switched to CKEditor 5 after dropping the two markup-creating filters (3 upgrade messages)" => [
+      'format_id' => 'restricted_html',
+      'filters_to_drop' => [
+        'filter_autop' => TRUE,
+        'filter_url' => TRUE,
+      ],
+      'expected_ckeditor5_settings' => [
+        'toolbar' => [
+          'items' => [
+            // Items originating from CKEditor5::getDefaultSettings().
+            'heading',
+            'bold',
+            'italic',
+            // Items added based on "allowed tags" config.
+            '|',
+            // Because '<a>' is in allowed_html.
+            'link',
+            // Because '<blockquote cite>' is in allowed_html.
+            'blockQuote',
+            // Because '<code>' is in allowed_html.
+            'code',
+            // Because '<ul>' is in allowed_html.
+            'bulletedList',
+            // Because '<ol>' is in allowed_html.
+            'numberedList',
+            // Because additional tags need to be allowed to achieve a superset.
+            'sourceEditing',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [
+              '<cite>',
+              '<dl>',
+              '<dt>',
+              '<dd>',
+              '<a hreflang>',
+              '<blockquote cite>',
+              '<ul type>',
+              '<ol start type>',
+              '<h2 id>',
+              '<h3 id>',
+              '<h4 id>',
+              '<h5 id>',
+              '<h6 id>',
+            ],
+          ],
+        ],
+      ],
+      'expected_superset' => '<br> <p>',
+      'expected_fundamental_compatibility_violations' => [
+        '' => [
+          0 => 'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert URLs into links</em>" (<em class="placeholder">filter_url</em>) filter implies this text format is not HTML anymore.',
+          1 => 'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert line breaks into HTML (i.e. &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;)</em>" (<em class="placeholder">filter_autop</em>) filter implies this text format is not HTML anymore.',
+        ],
+      ],
+      'expected_messages' => [
+        'The following plugins were enabled to support tags that are allowed by this text format: <em class="placeholder">Link (for tags: &lt;a&gt;) Block quote (for tags: &lt;blockquote&gt;) Code (for tags: &lt;code&gt;) List (for tags: &lt;ul&gt;&lt;ol&gt;&lt;li&gt;)</em>.',
+        'The following tags were permitted by this format\'s filter configuration, but no plugin was available that supports them. To ensure the tags remain supported by this text format, the following were added to the Source Editing plugin\'s <em>Manually editable HTML tags</em>: &lt;cite&gt; &lt;dl&gt; &lt;dt&gt; &lt;dd&gt;.',
+        'This format\'s HTML filters includes plugins that support the following tags, but not some of their attributes. To ensure these attributes remain supported by this text format, the following were added to the Source Editing plugin\'s <em>Manually editable HTML tags</em>: &lt;a hreflang&gt; &lt;blockquote cite&gt; &lt;ul type&gt; &lt;ol start type&gt; &lt;h2 id&gt; &lt;h3 id&gt; &lt;h4 id&gt; &lt;h5 id&gt; &lt;h6 id&gt;.',
+      ],
+      'expected_post_filter_drop_fundamental_compatibility_violations' => [
+        '' => 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are not allowed by the "<em class="placeholder">Limit allowed HTML tags and correct faulty HTML</em>" (<em class="placeholder">filter_html</em>) filter.',
+      ],
+    ];
+
+    yield "full_html can be switched to CKEditor 5 (no upgrade messages)" => [
+      'format_id' => 'full_html',
+      'filters_to_drop' => [],
+      'expected_ckeditor5_settings' => [
+        'toolbar' => [
+          'items' => [
+            'bold',
+            'italic',
+            'strikethrough',
+            'superscript',
+            'subscript',
+            'removeFormat',
+            '|',
+            'link',
+            '|',
+            'bulletedList',
+            'numberedList',
+            '|',
+            'blockQuote',
+            'uploadImage',
+            'insertTable',
+            'horizontalLine',
+            '|',
+            'heading',
+            '|',
+            'sourceEditing',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [],
+          ],
+        ],
+      ],
+      'expected_superset' => '',
+      'expected_fundamental_compatibility_violations' => [],
+      'expected_messages' => [],
+    ];
+
+    yield "filter_only__filter_html can be switched to CKEditor 5 without problems (3 upgrade messages)" => [
+      'format_id' => 'filter_only__filter_html',
+      'filters_to_drop' => [],
+      'expected_ckeditor5_settings' => [
+        'toolbar' => [
+          'items' => [
+            // Default toolbar items.
+            'heading',
+            'bold',
+            'italic',
+            '|',
+            // Items added based on filter_html's "allowed tags" config.
+            'link',
+            'blockQuote',
+            'code',
+            'bulletedList',
+            'numberedList',
+            'sourceEditing',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [
+              '<cite>',
+              '<dl>',
+              '<dt>',
+              '<dd>',
+              '<a hreflang>',
+              '<blockquote cite>',
+              '<ul type>',
+              '<ol start type="1 A I">',
+              '<h2 id="jump-*">',
+              '<h3 id>',
+              '<h4 id>',
+              '<h5 id>',
+              '<h6 id>',
+            ],
+          ],
+        ],
+      ],
+      'expected_superset' => '<br> <p>',
+      'expected_fundamental_compatibility_violations' => [
+        '' => 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are not allowed by the "<em class="placeholder">Limit allowed HTML tags and correct faulty HTML</em>" (<em class="placeholder">filter_html</em>) filter.',
+      ],
+      'expected_messages' => [
+        'The following plugins were enabled to support tags that are allowed by this text format: <em class="placeholder">Link (for tags: &lt;a&gt;) Block quote (for tags: &lt;blockquote&gt;) Code (for tags: &lt;code&gt;) List (for tags: &lt;ul&gt;&lt;ol&gt;&lt;li&gt;)</em>.',
+        'The following tags were permitted by this format\'s filter configuration, but no plugin was available that supports them. To ensure the tags remain supported by this text format, the following were added to the Source Editing plugin\'s <em>Manually editable HTML tags</em>: &lt;cite&gt; &lt;dl&gt; &lt;dt&gt; &lt;dd&gt;.',
+        'This format\'s HTML filters includes plugins that support the following tags, but not some of their attributes. To ensure these attributes remain supported by this text format, the following were added to the Source Editing plugin\'s <em>Manually editable HTML tags</em>: &lt;a hreflang&gt; &lt;blockquote cite&gt; &lt;ul type&gt; &lt;ol start type=&quot;1 A I&quot;&gt; &lt;h2 id=&quot;jump-*&quot;&gt; &lt;h3 id&gt; &lt;h4 id&gt; &lt;h5 id&gt; &lt;h6 id&gt;.',
+      ],
+    ];
+
+    yield "cke4_plugins_with_settings can be switched to CKEditor 5 without problems, settings are upgraded too" => [
+      'format_id' => 'cke4_plugins_with_settings',
+      'filters_to_drop' => [],
+      'expected_ckeditor5_settings' => [
+        'toolbar' => [
+          'items' => [
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_language' => [
+            'language_list' => 'all',
+          ],
+        ],
+      ],
+      'expected_superset' => '',
+      'expected_fundamental_compatibility_violations' => [],
+      'expected_messages' => [
+        'The CKEditor 4 button <em class="placeholder">Llama</em> does not have a known upgrade path. If it allowed editing markup, then you can do so now through the Source Editing functionality.',
+        'The <em class="placeholder">llama_contextual_and_button</em> plugin settings do not have a known upgrade path.',
+      ],
+    ];
+
+    yield "cke4_plugins_with_settings_for_disabled_plugins can be switched to CKEditor 5 without problems; irrelevant settings are dropped" => [
+      'format_id' => 'cke4_plugins_with_settings_for_disabled_plugins',
+      'filters_to_drop' => [],
+      'expected_ckeditor5_settings' => [
+        'toolbar' => [
+          'items' => [
+            'bold',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'expected_superset' => '',
+      'expected_fundamental_compatibility_violations' => [],
+      'expected_messages' => [],
+    ];
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/ValidatorsTest.php b/core/modules/ckeditor5/tests/src/Kernel/ValidatorsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..151cfbd9d8c5800e4c9bf01b3339178f27119e3f
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/ValidatorsTest.php
@@ -0,0 +1,775 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Drupal\Component\Utility\Html;
+use Drupal\editor\EditorInterface;
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\filter\FilterFormatInterface;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\Tests\SchemaCheckTestTrait;
+use Symfony\Component\Yaml\Yaml;
+
+/**
+ * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemConstraintValidator
+ * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemDependencyConstraintValidator
+ * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\EnabledConfigurablePluginsConstraintValidator
+ * @covers \Drupal\ckeditor5\Plugin\Editor\CKEditor5::validatePair()
+ * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraintValidator
+ * @group ckeditor5
+ */
+class ValidatorsTest extends KernelTestBase {
+
+  use SchemaCheckTestTrait;
+  use CKEditor5ValidationTestTrait;
+
+  /**
+   * The typed config manager.
+   *
+   * @var \Drupal\Core\Config\TypedConfigManagerInterface
+   */
+  protected $typedConfig;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'ckeditor5',
+    'ckeditor5_plugin_conditions_test',
+    'editor',
+    'filter',
+    'filter_test',
+    'media',
+    'media_library',
+    'views',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    $this->typedConfig = $this->container->get('config.typed');
+  }
+
+  /**
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemConstraintValidator
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemDependencyConstraintValidator
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\EnabledConfigurablePluginsConstraintValidator
+   * @dataProvider provider
+   *
+   * @param array $ckeditor5_settings
+   *   The CKEditor 5 settings to test.
+   * @param array $expected_violations
+   *   All expected violations for the given CKEditor 5 settings, with property
+   *   path as keys and message as values.
+   */
+  public function test(array $ckeditor5_settings, array $expected_violations) {
+    // The data provider is unable to access services, so the test scenario of
+    // testing with CKEditor 5's default settings is partially provided here.
+    if ($ckeditor5_settings === ['__DEFAULT__']) {
+      $ckeditor5_settings = \Drupal::service('plugin.manager.editor')->createInstance('ckeditor5')->getDefaultSettings();
+    }
+
+    FilterFormat::create([
+      'format' => 'dummy',
+      'name' => 'Dummy',
+    ])->save();
+    $editor = Editor::create([
+      'format' => 'dummy',
+      'editor' => 'ckeditor5',
+      'settings' => $ckeditor5_settings,
+      'image_upload' => [],
+    ]);
+
+    $typed_config = $this->typedConfig->createFromNameAndData(
+      $editor->getConfigDependencyName(),
+      $editor->toArray(),
+    );
+    $violations = $typed_config->validate();
+
+    $actual_violations = [];
+    foreach ($violations as $violation) {
+      $actual_violations[$violation->getPropertyPath()] = (string) $violation->getMessage();
+    }
+    $this->assertSame($expected_violations, $actual_violations);
+
+    if (empty($expected_violations)) {
+      $this->assertConfigSchema(
+        $this->typedConfig,
+        $editor->getConfigDependencyName(),
+        $typed_config->getValue()
+      );
+    }
+  }
+
+  /**
+   * Provides a list of Text Editor config entities using CKEditor 5 to test.
+   */
+  public function provider(): array {
+    $data = [];
+    $data['CKEditor5::getDefaultSettings()'] = [
+      // @see ::test()
+      'settings' => ['__DEFAULT__'],
+      'violations' => [],
+    ];
+    $data['non-existent toolbar button'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'underline',
+            'bold',
+            'italic',
+            '-',
+            'bulletedList',
+            'foobar',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'violations' => [
+        'settings.toolbar.items.5' => 'The provided toolbar item <em class="placeholder">foobar</em> is not valid.',
+      ],
+    ];
+
+    $data['missing heading plugin configuration'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'heading',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'violations' => [
+        'settings.plugins.ckeditor5_heading' => 'Configuration for the enabled plugin "<em class="placeholder">Headings</em>" (<em class="placeholder">ckeditor5_heading</em>) is missing.',
+      ],
+    ];
+    $data['missing language plugin configuration'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'violations' => [
+        'settings.plugins.ckeditor5_language' => 'Configuration for the enabled plugin "<em class="placeholder">Language</em>" (<em class="placeholder">ckeditor5_language</em>) is missing.',
+      ],
+    ];
+    $data['empty language plugin configuration'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_language' => [],
+        ],
+      ],
+      'violations' => [
+        'settings.plugins.ckeditor5_language' => 'Configuration for the enabled plugin "<em class="placeholder">Language</em>" (<em class="placeholder">ckeditor5_language</em>) is missing.',
+      ],
+    ];
+    $data['valid language plugin configuration: un'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_language' => [
+            'language_list' => 'un',
+          ],
+        ],
+      ],
+      'violations' => [],
+    ];
+    $data['valid language plugin configuration: all'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_language' => [
+            'language_list' => 'all',
+          ],
+        ],
+      ],
+      'violations' => [],
+    ];
+    $data['invalid language plugin configuration: textPartLanguage button not enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'bold',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_language' => [
+            'language_list' => 'all',
+          ],
+        ],
+      ],
+      'violations' => [
+        'settings.plugins.ckeditor5_language.language_list' => 'Depends on <em class="placeholder">textPartLanguage</em>, which is not enabled.',
+      ],
+    ];
+    $data['invalid language plugin configuration: invalid language_list setting'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_language' => [
+            'language_list' => 'foo',
+          ],
+        ],
+      ],
+      'violations' => [
+        'settings.plugins.ckeditor5_language.language_list' => 'The value you selected is not a valid choice.',
+      ],
+    ];
+
+    $data['uploadImage toolbar item condition not met: image uploads must be enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'uploadImage',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'violations' => [
+        'settings.toolbar.items.0' => 'The <em class="placeholder">Image upload</em> toolbar item requires image uploads to be enabled.',
+      ],
+    ];
+    $data['drupalMedia toolbar item condition not met: media filter enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'drupalMedia',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'violations' => [
+        'settings.toolbar.items.0' => 'The <em class="placeholder">Drupal media</em> toolbar item requires the <em class="placeholder">Embed media</em> filter to be enabled.',
+      ],
+    ];
+    $data['fooBarConditions toolbar item condition not met: Heading and Table plugins enabled, neither are'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'fooBarConditions',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'violations' => [
+        'settings.toolbar.items.0' => 'The <em class="placeholder">Foo Bar (Test Plugins Condition)</em> toolbar item requires the <em class="placeholder">Headings, Table</em> plugins to be enabled.',
+      ],
+    ];
+    $data['fooBarConditions toolbar item condition not met: Heading and Table plugins enabled, only one is'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'fooBarConditions',
+            'heading',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+            ],
+          ],
+        ],
+      ],
+      'violations' => [
+        'settings.toolbar.items.0' => 'The <em class="placeholder">Foo Bar (Test Plugins Condition)</em> toolbar item requires the <em class="placeholder">Table</em> plugin to be enabled.',
+      ],
+    ];
+    $data['fooBarConditions toolbar item condition met: Heading and Table plugins enabled, both are'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'fooBarConditions',
+            'heading',
+            'insertTable',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+            ],
+          ],
+        ],
+      ],
+      'violations' => [],
+    ];
+
+    return $data;
+  }
+
+  /**
+   * @covers \Drupal\ckeditor5\Plugin\Editor\CKEditor5::validatePair()
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraintValidator
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemConstraintValidator
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemDependencyConstraintValidator
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\EnabledConfigurablePluginsConstraintValidator
+   * @dataProvider providerPair
+   *
+   * @param array $ckeditor5_settings
+   *   The paired text editor's CKEditor 5 settings to test.
+   * @param array $editor_image_upload_settings
+   *   The paired text editor's image upload settings to test.
+   * @param array $filters
+   *   The paired text format's filters and filter settings.
+   * @param array $expected_violations
+   *   All expected violations for the pair.
+   */
+  public function testPair(array $ckeditor5_settings, array $editor_image_upload_settings, array $filters, array $expected_violations) {
+    $text_editor = Editor::create([
+      'format' => 'dummy',
+      'editor' => 'ckeditor5',
+      'settings' => $ckeditor5_settings,
+      'image_upload' => $editor_image_upload_settings,
+    ]);
+    assert($text_editor instanceof EditorInterface);
+    $this->assertConfigSchema(
+      $this->typedConfig,
+      $text_editor->getConfigDependencyName(),
+      $text_editor->toArray()
+    );
+    $text_format = FilterFormat::create([
+      'filters' => $filters,
+    ]);
+    assert($text_format instanceof FilterFormatInterface);
+
+    $this->assertSame($expected_violations, $this->validatePairToViolationsArray($text_editor, $text_format, TRUE));
+  }
+
+  /**
+   * Provides a list of Text Editor + Text Format pairs to test.
+   */
+  public function providerPair(): array {
+    // cspell:ignore donk
+    $data = [];
+    $data['INVALID: non-HTML format: filter_autop'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'bold',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_autop' => [
+          'id' => 'filter_autop',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [],
+        ],
+      ],
+      'violations' => [
+        '' => 'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert line breaks into HTML (i.e. &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;)</em>" (<em class="placeholder">filter_autop</em>) filter implies this text format is not HTML anymore.',
+      ],
+    ];
+    $data['INVALID: non-HTML format: filter_autop + filter_url'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'bold',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_autop' => [
+          'id' => 'filter_autop',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [],
+        ],
+        'filter_url' => [
+          'id' => 'filter_url',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'filter_url_length' => 72,
+          ],
+        ],
+      ],
+      'violations' => [
+        '' => [
+          'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert URLs into links</em>" (<em class="placeholder">filter_url</em>) filter implies this text format is not HTML anymore.',
+          'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert line breaks into HTML (i.e. &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;)</em>" (<em class="placeholder">filter_autop</em>) filter implies this text format is not HTML anymore.',
+        ],
+      ],
+    ];
+    $data['INVALID: forbidden tags'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_test_restrict_tags_and_attributes' => [
+          'id' => 'filter_test_restrict_tags_and_attributes',
+          'provider' => 'filter_test',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'restrictions' => [
+              'forbidden_tags' => ['p' => FALSE],
+            ],
+          ],
+        ],
+      ],
+      'violations' => [
+        '' => 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are forbidden by the "<em class="placeholder">Tag and attribute restricting filter</em>" (<em class="placeholder">filter_test_restrict_tags_and_attributes</em>) filter.',
+      ],
+    ];
+    $restricted_html_format_filters = Yaml::parseFile('profiles/standard/config/install/filter.format.restricted_html.yml')['filters'];
+    $data['INVALID: the default restricted_html text format'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => $restricted_html_format_filters,
+      'violations' => [
+        '' => [
+          'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert URLs into links</em>" (<em class="placeholder">filter_url</em>) filter implies this text format is not HTML anymore.',
+          'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert line breaks into HTML (i.e. &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;)</em>" (<em class="placeholder">filter_autop</em>) filter implies this text format is not HTML anymore.',
+        ],
+      ],
+    ];
+    $data['INVALID: the modified restricted_html text format (with filter_autop and filter_url removed)'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => array_diff_key(
+        $restricted_html_format_filters,
+        ['filter_autop' => TRUE, 'filter_url' => TRUE]
+      ),
+      'violations' => [
+        '' => 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are not allowed by the "<em class="placeholder">Limit allowed HTML tags and correct faulty HTML</em>" (<em class="placeholder">filter_html</em>) filter.',
+      ],
+    ];
+    $data['VALID: HTML format: empty toolbar + minimal allowed HTML'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_html' => [
+          'id' => 'filter_html',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'allowed_html' => "<p> <br>",
+            'filter_html_help' => TRUE,
+            'filter_html_nofollow' => TRUE,
+          ],
+        ],
+      ],
+      'violations' => [],
+    ];
+    $data['VALID: HTML format: very minimal toolbar + minimal allowed HTML'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'bold',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_html' => [
+          'id' => 'filter_html',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'allowed_html' => "<p> <br> <strong>",
+            'filter_html_help' => TRUE,
+            'filter_html_nofollow' => TRUE,
+          ],
+        ],
+      ],
+      'violations' => [],
+    ];
+    $data['INVALID: HTML format: empty toolbar + default allowed HTML tags + <p> + <br>'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_html' => [
+          'id' => 'filter_html',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'allowed_html' => "<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type='1 A I'> <li> <dl> <dt> <dd> <h2 id='jump-*'> <h3 id> <h4 id> <h5 id> <h6 id>" . "<p> <br>",
+            'filter_html_help' => TRUE,
+            'filter_html_nofollow' => TRUE,
+          ],
+        ],
+      ],
+      'violations' => [
+        'filters.filter_html' => sprintf(
+          'The current CKEditor 5 build requires the following elements and attributes: <br><code>%s</code><br>The following elements are not supported: <br><code>%s</code>',
+          Html::escape('<br> <p>'),
+          Html::escape('<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type="1 A I"> <li> <dl> <dt> <dd> <h2 id="jump-*"> <h3 id> <h4 id> <h5 id> <h6 id>'),
+        ),
+      ],
+    ];
+    $data['INVALID: HTML format: empty toolbar + default allowed HTML tags'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_html' => [
+          'id' => 'filter_html',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'allowed_html' => "<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type='1 A I'> <li> <dl> <dt> <dd> <h2 id='jump-*'> <h3 id> <h4 id> <h5 id> <h6 id>",
+            'filter_html_help' => TRUE,
+            'filter_html_nofollow' => TRUE,
+          ],
+        ],
+      ],
+      'violations' => [
+        '' => 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are not allowed by the "<em class="placeholder">Limit allowed HTML tags and correct faulty HTML</em>" (<em class="placeholder">filter_html</em>) filter.',
+      ],
+    ];
+    $data['INVALID Source Editable tag already provided by plugin and another available in a not enabled plugin'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'heading',
+            'bold',
+            'italic',
+            'sourceEditing',
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+          'ckeditor5_language' => [
+            'language_list' => 'un',
+          ],
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [
+              '<strong>',
+              '<table>',
+            ],
+          ],
+        ],
+      ],
+      'image_upload' => [
+        'status' => TRUE,
+      ],
+      'filters' => [],
+      'violations' => [
+        'settings.plugins.ckeditor5_sourceEditing.allowed_tags.0' => 'The following tag(s) are already supported by enabled plugins and should not be added to the Source Editing "Manually editable HTML tags" field: <em class="placeholder">Bold (&lt;strong&gt;)</em>.',
+        'settings.plugins.ckeditor5_sourceEditing.allowed_tags.1' => 'The following tag(s) are already supported by available plugins and should not be added to the Source Editing "Manually editable HTML tags" field. Instead, enable the following plugins to support these tags: <em class="placeholder">Table (&lt;table&gt;)</em>.',
+      ],
+    ];
+    $data['INVALID some invalid Source Editable tags provided by plugin and another available in a not enabled plugin'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'heading',
+            'bold',
+            'italic',
+            'sourceEditing',
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+          'ckeditor5_language' => [
+            'language_list' => 'un',
+          ],
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [
+              '<aside>',
+              '<footer>',
+              'roy',
+              '<#donk>',
+              '<junior>cruft',
+            ],
+          ],
+        ],
+      ],
+      'image_upload' => [
+        'status' => TRUE,
+      ],
+      'filters' => [],
+      'violations' => [
+        'settings.plugins.ckeditor5_sourceEditing.allowed_tags.2' => 'The following tag is not valid HTML: <em class="placeholder">roy</em>.',
+        'settings.plugins.ckeditor5_sourceEditing.allowed_tags.3' => 'The following tag is not valid HTML: <em class="placeholder">&lt;#donk&gt;</em>.',
+        'settings.plugins.ckeditor5_sourceEditing.allowed_tags.4' => 'The following tag is not valid HTML: <em class="placeholder">&lt;junior&gt;cruft</em>.',
+      ],
+    ];
+
+    $data['INVALID: uploadImage toolbar item condition NOT met: image uploads must be enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'uploadImage',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [],
+      'violations' => [
+        'settings.toolbar.items.0' => 'The <em class="placeholder">Image upload</em> toolbar item requires image uploads to be enabled.',
+      ],
+    ];
+    $data['VALID: uploadImage toolbar item condition met: image uploads must be enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'uploadImage',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => TRUE,
+      ],
+      'filters' => [],
+      'violations' => [],
+    ];
+    $data['INVALID: drupalMedia toolbar item condition NOT met: media filter enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'drupalMedia',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [],
+      'violations' => [
+        'settings.toolbar.items.0' => 'The <em class="placeholder">Drupal media</em> toolbar item requires the <em class="placeholder">Embed media</em> filter to be enabled.',
+      ],
+    ];
+    $data['VALID: drupalMedia toolbar item condition met: media filter enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'drupalMedia',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_html' => [
+          'id' => 'media_embed',
+          'provider' => 'media',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'default_view_mode' => 'default',
+            'allowed_view_modes' => [],
+            'allowed_media_types' => [],
+          ],
+        ],
+      ],
+      'violations' => [
+        'settings.toolbar.items.0' => 'The <em class="placeholder">Drupal media</em> toolbar item requires the <em class="placeholder">Embed media</em> filter to be enabled.',
+      ],
+    ];
+
+    return $data;
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Nightwatch/Tests/drupalHtmlBuilderTest.es6.js b/core/modules/ckeditor5/tests/src/Nightwatch/Tests/drupalHtmlBuilderTest.es6.js
new file mode 100644
index 0000000000000000000000000000000000000000..906097a3f7bec76b6bd10b3b69d0d6694561aa3d
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Nightwatch/Tests/drupalHtmlBuilderTest.es6.js
@@ -0,0 +1,131 @@
+const assert = require('assert');
+const fs = require('fs');
+const path = require('path');
+// eslint-disable-next-line import/no-extraneous-dependencies
+const { JSDOM } = require('jsdom');
+
+// Nightwatch doesn't support ES modules. This workaround loads the class
+// directly here.
+// @todo remove this after https://www.drupal.org/project/drupal/issues/3247647
+//   has been resolved.
+// eslint-disable-next-line no-eval
+const DrupalHtmlBuilder = eval(
+  `(${fs
+    .readFileSync(
+      path.resolve(
+        __dirname,
+        '../../../../js/ckeditor5_plugins/drupalHtmlEngine/src/drupalhtmlbuilder.js',
+      ),
+    )
+    .toString()})`.replace('export default', ''),
+);
+const { document, Node } = new JSDOM(`<!DOCTYPE html>`).window;
+
+module.exports = {
+  '@tags': ['ckeditor5'],
+  '@unitTest': true,
+  'should return empty string when empty DocumentFragment is passed':
+    function () {
+      const drupalHtmlBuilder = new DrupalHtmlBuilder();
+      drupalHtmlBuilder.appendNode(document.createDocumentFragment());
+      assert.equal(drupalHtmlBuilder.build(), '');
+    },
+  'should create text from single text node': function () {
+    const drupalHtmlBuilder = new DrupalHtmlBuilder();
+    const text = 'foo bar';
+    const fragment = document.createDocumentFragment();
+    const textNode = document.createTextNode(text);
+    fragment.appendChild(textNode);
+
+    drupalHtmlBuilder.appendNode(fragment);
+    assert.equal(drupalHtmlBuilder.build(), text);
+  },
+  'should return correct HTML from fragment with paragraph': function () {
+    const drupalHtmlBuilder = new DrupalHtmlBuilder();
+    const fragment = document.createDocumentFragment();
+    const paragraph = document.createElement('p');
+    paragraph.textContent = 'foo bar';
+    fragment.appendChild(paragraph);
+
+    drupalHtmlBuilder.appendNode(fragment);
+    assert.equal(drupalHtmlBuilder.build(), '<p>foo bar</p>');
+  },
+  'should return correct HTML from fragment with multiple child nodes':
+    function () {
+      const drupalHtmlBuilder = new DrupalHtmlBuilder();
+      const fragment = document.createDocumentFragment();
+      const text = document.createTextNode('foo bar');
+      const paragraph = document.createElement('p');
+      const div = document.createElement('div');
+
+      paragraph.textContent = 'foo';
+      div.textContent = 'bar';
+
+      fragment.appendChild(text);
+      fragment.appendChild(paragraph);
+      fragment.appendChild(div);
+
+      drupalHtmlBuilder.appendNode(fragment);
+
+      assert.equal(
+        drupalHtmlBuilder.build(),
+        'foo bar<p>foo</p><div>bar</div>',
+      );
+    },
+  'should return correct HTML from fragment with comment': function () {
+    const drupalHtmlBuilder = new DrupalHtmlBuilder();
+    const fragment = document.createDocumentFragment();
+    const div = document.createElement('div');
+    const comment = document.createComment('bar');
+    div.textContent = 'bar';
+
+    fragment.appendChild(div);
+    fragment.appendChild(comment);
+
+    drupalHtmlBuilder.appendNode(fragment);
+
+    assert.equal(drupalHtmlBuilder.build(), '<div>bar</div>');
+  },
+  'should return correct HTML from fragment with attributes': function () {
+    const drupalHtmlBuilder = new DrupalHtmlBuilder();
+    const fragment = document.createDocumentFragment();
+    const div = document.createElement('div');
+    div.setAttribute('id', 'foo');
+    div.classList.add('bar');
+    div.textContent = 'baz';
+
+    fragment.appendChild(div);
+    drupalHtmlBuilder.appendNode(fragment);
+
+    assert.equal(
+      drupalHtmlBuilder.build(),
+      '<div id="foo" class="bar">baz</div>',
+    );
+  },
+  'should return correct HTML from fragment with self closing tag':
+    function () {
+      const drupalHtmlBuilder = new DrupalHtmlBuilder();
+      const fragment = document.createDocumentFragment();
+      const hr = document.createElement('hr');
+
+      fragment.appendChild(hr);
+      drupalHtmlBuilder.appendNode(fragment);
+
+      assert.equal(drupalHtmlBuilder.build(), '<hr>');
+    },
+  'attribute values should be escaped': function () {
+    const drupalHtmlBuilder = new DrupalHtmlBuilder();
+    const fragment = document.createDocumentFragment();
+    const div = document.createElement('div');
+    div.setAttribute('data-caption', 'Kittens & llamas are <em>cute</em>');
+    div.textContent = 'foo';
+
+    fragment.appendChild(div);
+    drupalHtmlBuilder.appendNode(fragment);
+
+    assert.equal(
+      drupalHtmlBuilder.build(),
+      '<div data-caption="Kittens &amp; llamas are &lt;em&gt;cute&lt;/em&gt;">foo</div>',
+    );
+  },
+};
diff --git a/core/modules/ckeditor5/tests/src/Nightwatch/Tests/drupalHtmlBuilderTest.js b/core/modules/ckeditor5/tests/src/Nightwatch/Tests/drupalHtmlBuilderTest.js
new file mode 100644
index 0000000000000000000000000000000000000000..8d416758b5177b21ab3fc8b35042987aa5b607ba
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Nightwatch/Tests/drupalHtmlBuilderTest.js
@@ -0,0 +1,101 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+var assert = require('assert');
+
+var fs = require('fs');
+
+var path = require('path');
+
+var _require = require('jsdom'),
+    JSDOM = _require.JSDOM;
+
+var DrupalHtmlBuilder = eval("(".concat(fs.readFileSync(path.resolve(__dirname, '../../../../js/ckeditor5_plugins/drupalHtmlEngine/src/drupalhtmlbuilder.js')).toString(), ")").replace('export default', ''));
+var _JSDOM$window = new JSDOM("<!DOCTYPE html>").window,
+    document = _JSDOM$window.document,
+    Node = _JSDOM$window.Node;
+module.exports = {
+  '@tags': ['ckeditor5'],
+  '@unitTest': true,
+  'should return empty string when empty DocumentFragment is passed': function shouldReturnEmptyStringWhenEmptyDocumentFragmentIsPassed() {
+    var drupalHtmlBuilder = new DrupalHtmlBuilder();
+    drupalHtmlBuilder.appendNode(document.createDocumentFragment());
+    assert.equal(drupalHtmlBuilder.build(), '');
+  },
+  'should create text from single text node': function shouldCreateTextFromSingleTextNode() {
+    var drupalHtmlBuilder = new DrupalHtmlBuilder();
+    var text = 'foo bar';
+    var fragment = document.createDocumentFragment();
+    var textNode = document.createTextNode(text);
+    fragment.appendChild(textNode);
+    drupalHtmlBuilder.appendNode(fragment);
+    assert.equal(drupalHtmlBuilder.build(), text);
+  },
+  'should return correct HTML from fragment with paragraph': function shouldReturnCorrectHTMLFromFragmentWithParagraph() {
+    var drupalHtmlBuilder = new DrupalHtmlBuilder();
+    var fragment = document.createDocumentFragment();
+    var paragraph = document.createElement('p');
+    paragraph.textContent = 'foo bar';
+    fragment.appendChild(paragraph);
+    drupalHtmlBuilder.appendNode(fragment);
+    assert.equal(drupalHtmlBuilder.build(), '<p>foo bar</p>');
+  },
+  'should return correct HTML from fragment with multiple child nodes': function shouldReturnCorrectHTMLFromFragmentWithMultipleChildNodes() {
+    var drupalHtmlBuilder = new DrupalHtmlBuilder();
+    var fragment = document.createDocumentFragment();
+    var text = document.createTextNode('foo bar');
+    var paragraph = document.createElement('p');
+    var div = document.createElement('div');
+    paragraph.textContent = 'foo';
+    div.textContent = 'bar';
+    fragment.appendChild(text);
+    fragment.appendChild(paragraph);
+    fragment.appendChild(div);
+    drupalHtmlBuilder.appendNode(fragment);
+    assert.equal(drupalHtmlBuilder.build(), 'foo bar<p>foo</p><div>bar</div>');
+  },
+  'should return correct HTML from fragment with comment': function shouldReturnCorrectHTMLFromFragmentWithComment() {
+    var drupalHtmlBuilder = new DrupalHtmlBuilder();
+    var fragment = document.createDocumentFragment();
+    var div = document.createElement('div');
+    var comment = document.createComment('bar');
+    div.textContent = 'bar';
+    fragment.appendChild(div);
+    fragment.appendChild(comment);
+    drupalHtmlBuilder.appendNode(fragment);
+    assert.equal(drupalHtmlBuilder.build(), '<div>bar</div>');
+  },
+  'should return correct HTML from fragment with attributes': function shouldReturnCorrectHTMLFromFragmentWithAttributes() {
+    var drupalHtmlBuilder = new DrupalHtmlBuilder();
+    var fragment = document.createDocumentFragment();
+    var div = document.createElement('div');
+    div.setAttribute('id', 'foo');
+    div.classList.add('bar');
+    div.textContent = 'baz';
+    fragment.appendChild(div);
+    drupalHtmlBuilder.appendNode(fragment);
+    assert.equal(drupalHtmlBuilder.build(), '<div id="foo" class="bar">baz</div>');
+  },
+  'should return correct HTML from fragment with self closing tag': function shouldReturnCorrectHTMLFromFragmentWithSelfClosingTag() {
+    var drupalHtmlBuilder = new DrupalHtmlBuilder();
+    var fragment = document.createDocumentFragment();
+    var hr = document.createElement('hr');
+    fragment.appendChild(hr);
+    drupalHtmlBuilder.appendNode(fragment);
+    assert.equal(drupalHtmlBuilder.build(), '<hr>');
+  },
+  'attribute values should be escaped': function attributeValuesShouldBeEscaped() {
+    var drupalHtmlBuilder = new DrupalHtmlBuilder();
+    var fragment = document.createDocumentFragment();
+    var div = document.createElement('div');
+    div.setAttribute('data-caption', 'Kittens & llamas are <em>cute</em>');
+    div.textContent = 'foo';
+    fragment.appendChild(div);
+    drupalHtmlBuilder.appendNode(fragment);
+    assert.equal(drupalHtmlBuilder.build(), '<div data-caption="Kittens &amp; llamas are &lt;em&gt;cute&lt;/em&gt;">foo</div>');
+  }
+};
\ No newline at end of file
diff --git a/core/modules/ckeditor5/tests/src/Traits/CKEditor5TestTrait.php b/core/modules/ckeditor5/tests/src/Traits/CKEditor5TestTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..2510d3a58fcc90baa073e3b0f274270b4514f386
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Traits/CKEditor5TestTrait.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\Traits;
+
+use Behat\Mink\Element\NodeElement;
+use Drupal\Component\Utility\Html;
+
+// cspell:ignore downcasted
+
+/**
+ * Provides methods to test CKEditor 5.
+ *
+ * This trait is meant to be used only by functional JavaScript test classes.
+ */
+trait CKEditor5TestTrait {
+
+  /**
+   * Gets CKEditor 5 instance data as a PHP DOMDocument.
+   *
+   * @return \DOMDocument
+   *   The result of parsing CKEditor 5's data into a PHP DOMDocument.
+   *
+   * @see https://ckeditor.com/docs/ckeditor5/latest/api/module_editor-classic_classiceditor-ClassicEditor.html#function-getData
+   */
+  protected function getEditorDataAsDom(): \DOMDocument {
+    // We cannot trust on CKEditor updating the textarea every time model
+    // changes. Therefore, the most reliable way to get downcasted data is to
+    // use the CKEditor API.
+    $javascript = <<<JS
+(function(){
+  return Drupal.CKEditor5Instances.get(Drupal.CKEditor5Instances.keys().next().value).getData();
+})();
+JS;
+    return Html::load($this->getSession()->evaluateScript($javascript));
+  }
+
+  /**
+   * Waits for CKEditor to initialize.
+   */
+  protected function waitForEditor() {
+    $assert_session = $this->assertSession();
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+  }
+
+  /**
+   * Clicks a CKEditor button.
+   *
+   * @param string $name
+   *   The name of the button, such as `drupallink`, `source`, etc.
+   */
+  protected function pressEditorButton($name) {
+    $this->getEditorButton($name)->click();
+  }
+
+  /**
+   * Waits for a CKEditor button and returns it when available and visible.
+   *
+   * @param string $name
+   *   The name of the button, such as `drupallink`, `source`, etc.
+   *
+   * @return \Behat\Mink\Element\NodeElement|null
+   *   The page element node if found, NULL if not.
+   */
+  protected function getEditorButton($name) {
+    $button = $this->assertSession()->waitForElementVisible('xpath', "//button[span[text()='$name']]");
+    $this->assertNotEmpty($button);
+    return $button;
+  }
+
+  /**
+   * Asserts a CKEditor button is disabled.
+   *
+   * @param string $name
+   *   The name of the button, such as `drupallink`, `source`, etc.
+   */
+  protected function assertEditorButtonDisabled($name) {
+    $button = $this->getEditorButton($name);
+    $this->assertTrue($button->hasAttribute('aria-disabled'));
+    $this->assertTrue($button->hasClass('ck-disabled'));
+  }
+
+  /**
+   * Asserts a CKEditor button is enabled.
+   *
+   * @param string $name
+   *   The name of the button, such as `drupallink`, `source`, etc.
+   */
+  protected function assertEditorButtonEnabled($name) {
+    $button = $this->getEditorButton($name);
+    $this->assertFalse($button->hasAttribute('aria-disabled'));
+    $this->assertFalse($button->hasClass('ck-disabled'));
+  }
+
+  /**
+   * Asserts a particular balloon is visible.
+   *
+   * @param string $balloon_content_selector
+   *   A CSS selector.
+   *
+   * @return \Behat\Mink\Element\NodeElement
+   *   The asserted balloon.
+   */
+  protected function assertVisibleBalloon(string $balloon_content_selector): NodeElement {
+    $this->assertSession()->elementExists('css', '.ck-balloon-panel_visible');
+    $selector = ".ck-balloon-panel_visible .ck-balloon-rotator__content > .ck$balloon_content_selector";
+    $this->assertSession()->elementExists('css', $selector);
+    return $this->getSession()->getPage()->find('css', $selector);
+  }
+
+  /**
+   * Gets a button from the currently visible balloon.
+   *
+   * @param string $name
+   *   The label of the button to find.
+   *
+   * @return \Behat\Mink\Element\NodeElement
+   *   The requested button.
+   */
+  protected function getBalloonButton(string $name): NodeElement {
+    $button = $this->getSession()->getPage()
+      ->find('css', '.ck-balloon-panel_visible .ck-balloon-rotator__content')
+      ->find('xpath', "//button[span[text()='$name']]");
+    $this->assertNotEmpty($button);
+    return $button;
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Traits/SynchronizeCsrfTokenSeedTrait.php b/core/modules/ckeditor5/tests/src/Traits/SynchronizeCsrfTokenSeedTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..e106d28c43ee7a2990e82c3431f73b699e37b315
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Traits/SynchronizeCsrfTokenSeedTrait.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\Traits;
+
+use Drupal\Core\Session\AccountInterface;
+
+/**
+ * Synchronizes the child site's CSRF token seed back to the test runner.
+ *
+ * For the test to be able to generate valid CSRF tokens, it needs access to the
+ * CSRF token seed in the child site (i.e. tested site). This requires reading
+ * the CSRF token seed from the session that gets created in the child site
+ * after logging in, and then setting it in the test runner's container.
+ * Otherwise, the test runner would generate its own CSRF token seed and would
+ * hence generate CSRF tokens that are not valid for the session in the child
+ * site.
+ *
+ * @see \Drupal\Core\Access\CsrfTokenGenerator::get()
+ *
+ * @internal
+ */
+trait SynchronizeCsrfTokenSeedTrait {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function drupalLogin(AccountInterface $account) {
+    parent::drupalLogin($account);
+    $session_data = $this->container->get('session_handler.write_safe')->read($this->getSession()->getCookie($this->getSessionName()));
+    $csrf_token_seed = unserialize(explode('_sf2_meta|', $session_data)[1])['s'];
+    $this->container->get('session_manager.metadata_bag')->setCsrfTokenSeed($csrf_token_seed);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function drupalLogout() {
+    parent::drupalLogout();
+    $this->container->get('session_manager.metadata_bag')->stampNew();
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Unit/CKEditor5Test.php b/core/modules/ckeditor5/tests/src/Unit/CKEditor5Test.php
new file mode 100644
index 0000000000000000000000000000000000000000..66b339439a021b1b968b8115c28394dc509c0d4c
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Unit/CKEditor5Test.php
@@ -0,0 +1,117 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\Unit;
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\ckeditor5\Plugin\Editor\CKEditor5
+ * @group ckeditor5
+ * @internal
+ */
+class CKEditor5Test extends UnitTestCase {
+
+  /**
+   * Simulated CKEditor5::buildConfigurationForm() form structure.
+   *
+   * @var array
+   */
+  protected const SIMULATED_FORM_STRUCTURE = [
+    'toolbar' => [
+      'available' => [],
+      'items' => [],
+    ],
+    'available_items_description' => [],
+    'active_items_description' => [],
+    'plugin_settings' => [],
+    'plugins' => [
+      'providerA_plugin1' => [],
+      'providerB_plugin2' => [
+        'foo' => [],
+        'bar' => [],
+      ],
+    ],
+  ];
+
+  /**
+   * Gets a protected/private method to test.
+   *
+   * @param string $name
+   *   The method name.
+   *
+   * @return \ReflectionMethod
+   *   The accessible method.
+   */
+  protected static function getMethod(string $name): \ReflectionMethod {
+    $class = new \ReflectionClass(CKEditor5::class);
+    $method = $class->getMethod($name);
+    $method->setAccessible(TRUE);
+    return $method;
+  }
+
+  /**
+   * @covers \Drupal\ckeditor5\Plugin\Editor\CKEditor5::mapViolationPropertyPathsToFormNames
+   * @dataProvider providerPathsToFormNames
+   */
+  public function testPathsToFormNames(string $property_path, string $expected_form_item_name, bool $expect_exception = FALSE): void {
+    $mapMethod = self::getMethod('mapViolationPropertyPathsToFormNames');
+    if ($expect_exception) {
+      $this->expectExceptionMessage('assert($shifted === \'settings\')');
+    }
+
+    $form_item_name = $mapMethod->invokeArgs(NULL, [$property_path, static::SIMULATED_FORM_STRUCTURE]);
+
+    if (!$expect_exception) {
+      $this->assertSame($expected_form_item_name, $form_item_name);
+    }
+  }
+
+  /**
+   * Data provider for testing mapViolationPropertyPathsToFormNames.
+   *
+   * @return array[]
+   *   An array with the property path and expected form item name.
+   */
+  public function providerPathsToFormNames(): array {
+    return [
+      'validation error targeting toolbar items' => [
+        'settings.toolbar.items',
+        'settings][toolbar][items',
+      ],
+      'validation error targeting a specific toolbar item' => [
+        'settings.toolbar.items.6',
+        'settings][toolbar][items',
+      ],
+      'validation error targeting a simple plugin form' => [
+        'settings.plugins.providerA_plugin1',
+        'settings][plugins][providerA_plugin1',
+      ],
+      'validation error targeting a simple plugin form, with deep config schema detail' => [
+        'settings.plugins.providerA_plugin1.foo.bar.baz',
+        'settings][plugins][providerA_plugin1',
+      ],
+      'validation error targeting a complex plugin form' => [
+        'settings.plugins.providerB_plugin2',
+        'settings][plugins][providerB_plugin2',
+      ],
+      'validation error targeting a complex plugin form, with deep config schema detail' => [
+        'settings.plugins.providerB_plugin2.foo.bar.baz',
+        'settings][plugins][providerB_plugin2][foo',
+      ],
+      'unrealistic example one — should trigger exception' => [
+        'bad.bad.worst',
+        'I DO NOT EXIST',
+        TRUE,
+      ],
+      'unrealistic example two — should trigger exception' => [
+        'one.two.three.four',
+        'one][two][three][four',
+        TRUE,
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/ckeditor5/webpack.config.js b/core/modules/ckeditor5/webpack.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..71152e4b1e59d233571bb53c9ac7cc1808c4e957
--- /dev/null
+++ b/core/modules/ckeditor5/webpack.config.js
@@ -0,0 +1,63 @@
+const path = require('path');
+const fs = require('fs');
+const webpack = require('webpack');
+const { styles, builds } = require('@ckeditor/ckeditor5-dev-utils');
+const TerserPlugin = require('terser-webpack-plugin');
+
+function getDirectories(srcpath) {
+  return fs
+    .readdirSync(srcpath)
+    .filter((item) => fs.statSync(path.join(srcpath, item)).isDirectory());
+}
+
+module.exports = [];
+// Loop through every subdirectory in ckeditor5_plugins, which should be a different
+// plugin, and build them all in ./build.
+getDirectories(path.resolve(__dirname, './js/ckeditor5_plugins')).forEach((dir) => {
+  const bc = {
+    mode: 'production',
+    optimization: {
+      minimize: true,
+      minimizer: [
+        new TerserPlugin({
+          terserOptions: {
+            format: {
+              comments: false,
+            },
+          },
+          test: /\.js(\?.*)?$/i,
+          extractComments: false,
+        }),
+      ],
+      moduleIds: 'named',
+    },
+    entry: {
+      path: path.resolve(
+        __dirname,
+        'js/ckeditor5_plugins',
+        dir,
+        'src/index.js',
+      ),
+    },
+    output: {
+      path: path.resolve(__dirname, './js/build'),
+      filename: `${dir}.js`,
+      library: ['CKEditor5', dir],
+      libraryTarget: 'umd',
+      libraryExport: 'default',
+    },
+    plugins: [
+      new webpack.BannerPlugin('cspell:disable'),
+      new webpack.DllReferencePlugin({
+        manifest: require(path.resolve(__dirname, '../../node_modules/ckeditor5/build/ckeditor5-dll.manifest.json')), // eslint-disable-line global-require, import/no-unresolved
+        scope: 'ckeditor5/src',
+        name: 'CKEditor5.dll',
+      }),
+    ],
+    module: {
+      rules: [{ test: /\.svg$/, use: 'raw-loader' }],
+    },
+  };
+
+  module.exports.push(bc);
+});
diff --git a/core/package.json b/core/package.json
index 9c08076961829a4353d655f27a4f071d6e8929e7..1d132c75e27e40d59a9ba16aca0e2ad903697ce8 100644
--- a/core/package.json
+++ b/core/package.json
@@ -24,16 +24,38 @@
     "lint:css-checkstyle": "stylelint \"**/*.css\" --custom-formatter ./node_modules/stylelint-checkstyle-formatter/index.js",
     "lint:yaml": "node ./node_modules/eslint/bin/eslint.js --ext .yml .",
     "test:nightwatch": "cross-env BABEL_ENV=development node -r dotenv-safe/config -r @babel/register ./node_modules/.bin/nightwatch --config ./tests/Drupal/Nightwatch/nightwatch.conf.js",
-    "prettier": "prettier --write \"./**/*.es6.js\" \"./tests/Drupal/Nightwatch/**/*.js\"",
+    "prettier": "prettier --write \"./**/*.es6.js\" \"./tests/Drupal/Nightwatch/**/*.js\" \"./modules/ckeditor5/js/ckeditor5_plugins/**/*.js\"",
     "spellcheck": "cspell",
     "spellcheck:make-drupal-dict": "rm -f misc/cspell/dictionary.txt && touch misc/cspell/dictionary.txt && yarn -s spellcheck:core --unique --wordsOnly | tr '[:upper:]' '[:lower:]' | tr -d \\\\\\\\ | LC_ALL=C sort -u -o misc/cspell/dictionary.txt",
     "spellcheck:core": "cspell \"**/*\" \".*\" \"../composer/**/*\" \"../composer.json\"",
-    "vendor-update": "node ./scripts/js/assets.js"
+    "vendor-update": "node ./scripts/js/assets.js",
+    "ckeditor5:watch": "webpack --mode development --config ./modules/ckeditor5/webpack.config.js --watch",
+    "ckeditor5:build": "webpack --config ./modules/ckeditor5/webpack.config.js"
   },
   "devDependencies": {
     "@babel/core": "^7.0.0",
     "@babel/preset-env": "^7.0.0",
     "@babel/register": "^7.7.7",
+    "@ckeditor/ckeditor5-alignment": "~31.0.0",
+    "@ckeditor/ckeditor5-basic-styles": "~31.0.0",
+    "@ckeditor/ckeditor5-block-quote": "~31.0.0",
+    "@ckeditor/ckeditor5-dev-utils": "^25.4.5",
+    "@ckeditor/ckeditor5-editor-classic": "~31.0.0",
+    "@ckeditor/ckeditor5-editor-decoupled": "~31.0.0",
+    "@ckeditor/ckeditor5-essentials": "~31.0.0",
+    "@ckeditor/ckeditor5-heading": "~31.0.0",
+    "@ckeditor/ckeditor5-horizontal-line": "~31.0.0",
+    "@ckeditor/ckeditor5-html-support": "~31.0.0",
+    "@ckeditor/ckeditor5-image": "~31.0.0",
+    "@ckeditor/ckeditor5-indent": "~31.0.0",
+    "@ckeditor/ckeditor5-language": "~31.0.0",
+    "@ckeditor/ckeditor5-link": "~31.0.0",
+    "@ckeditor/ckeditor5-list": "~31.0.0",
+    "@ckeditor/ckeditor5-paste-from-office": "~31.0.0",
+    "@ckeditor/ckeditor5-remove-format": "~31.0.0",
+    "@ckeditor/ckeditor5-source-editing": "~31.0.0",
+    "@ckeditor/ckeditor5-special-characters": "~31.0.0",
+    "@ckeditor/ckeditor5-table": "~31.0.0",
     "@drupal/once": "^1.0.1",
     "@popperjs/core": "^2.9.2",
     "babel-plugin-add-header-comment": "^1.0.3",
@@ -41,6 +63,7 @@
     "chalk": "^4.1.0",
     "chokidar": "^3.3.1",
     "chromedriver": "^87.0.0",
+    "ckeditor5": "~31.0.0",
     "cross-env": "^7.0.2",
     "cspell": "^5.0.0",
     "css.escape": "^1.5.1",
@@ -63,6 +86,7 @@
     "jquery-form": "^4.3.0",
     "jquery-once": "^2.2.3",
     "js-cookie": "^3.0.1",
+    "jsdom": "^18.0.1",
     "loadjs": "^4.2.0",
     "minimist": "^1.2.2",
     "mkdirp": "^1.0.4",
@@ -77,6 +101,7 @@
     "postcss-pxtorem": "^5.1.1",
     "postcss-url": "^8.0.0",
     "prettier": "^2.1.2",
+    "raw-loader": "^4.0.2",
     "shepherd.js": "^8.3.1",
     "sortablejs": "^1.13.0",
     "stylelint": "^13.0.0",
@@ -85,7 +110,10 @@
     "stylelint-order": "^4.0.0",
     "tabbable": "^5.2.0",
     "terser": "^5.3.4",
-    "underscore": "^1.13.1"
+    "terser-webpack-plugin": "^5.2.0",
+    "underscore": "^1.13.1",
+    "webpack": "^5.51.1",
+    "webpack-cli": "^4.4.0"
   },
   "//": "'development is the default environment, and legacy is for transpiling the old jQuery codebase",
   "babel": {
diff --git a/core/scripts/dev/commit-code-check.sh b/core/scripts/dev/commit-code-check.sh
index db3eabda919262e4b84335782ae9152b8662a8a2..e5cba556954cb84733e11c6504c1e75249f73594 100755
--- a/core/scripts/dev/commit-code-check.sh
+++ b/core/scripts/dev/commit-code-check.sh
@@ -286,7 +286,7 @@
   ############################################################################
   ### JAVASCRIPT FILES
   ############################################################################
-  if [[ -f "$TOP_LEVEL/$FILE" ]] && [[ $FILE =~ \.js$ ]] && [[ ! $FILE =~ ^core/tests/Drupal/Nightwatch ]] && [[ ! $FILE =~ ^core/assets/vendor/jquery.ui/ui ]]; then
+  if [[ -f "$TOP_LEVEL/$FILE" ]] && [[ $FILE =~ \.js$ ]] && [[ ! $FILE =~ ^core/tests/Drupal/Nightwatch ]] && [[ ! $FILE =~ ^core/assets/vendor/jquery.ui/ui ]] && [[ ! $FILE =~ ^core/modules/ckeditor5/js/ckeditor5_plugins ]]; then
     # Work out the root name of the JavaScript so we can ensure that the ES6
     # version has been compiled correctly.
     if [[ $FILE =~ \.es6\.js$ ]]; then
@@ -327,7 +327,7 @@
     else
       # If there is no .es6.js file then there should be unless the .js is
       # not really Drupal's.
-      if ! [[ "$FILE" =~ ^core/assets/vendor ]] && ! [[ "$FILE" =~ ^core/scripts/js ]] && ! [[ "$FILE" =~ ^core/scripts/css ]] && ! [[ "$FILE" =~ core/postcss.config.js ]] && ! [[ -f "$TOP_LEVEL/$BASENAME.es6.js" ]]; then
+      if ! [[ "$FILE" =~ ^core/assets/vendor ]] && ! [[ "$FILE" =~ ^core/modules/ckeditor5/js/build ]] && ! [[ "$FILE" =~ ^core/scripts/js ]] && ! [[ "$FILE" =~ ^core/scripts/css ]] && ! [[ "$FILE" =~ core/postcss.config.js ]] && ! [[ "$FILE" =~ webpack.config.js$ ]] && ! [[ -f "$TOP_LEVEL/$BASENAME.es6.js" ]] && ! [[ "$FILE" =~ core/modules/ckeditor5/tests/modules/ckeditor5_test/js/build/layercake.js ]]; then
         printf "${red}FAILURE${reset} $FILE does not have a corresponding $BASENAME.es6.js\n"
         STATUS=1
       fi
diff --git a/core/scripts/js/assets.js b/core/scripts/js/assets.js
index 5e7186775fafb4eb94f965d3f943514390d5d7ca..d6b3cf2586eae5bc940b718c2ff5f5dd56bc46f8 100644
--- a/core/scripts/js/assets.js
+++ b/core/scripts/js/assets.js
@@ -8,7 +8,7 @@
  */
 
 const path = require('path');
-const { copyFile, writeFile, readFile, chmod } = require('fs').promises;
+const { copyFile, writeFile, readFile, chmod, rmdir, mkdir, readdir, appendFile } = require('fs').promises;
 
 const coreFolder = path.resolve(__dirname, '../../');
 const packageFolder = `${coreFolder}/node_modules`;
@@ -28,7 +28,7 @@ const assetsFolder = `${coreFolder}/assets/vendor`;
       const libraryDeclaration = libraries[libraryIndex];
       // Get the previous package version.
       const currentVersion = libraryDeclaration.match(/version: "(.*)"\n/)[1];
-      // Replace the version value and the version in the licence URL.
+      // Replace the version value and the version in the license URL.
       libraries[libraryIndex] = libraryDeclaration.replace(
         new RegExp(currentVersion, 'g'),
         version,
@@ -36,6 +36,16 @@ const assetsFolder = `${coreFolder}/assets/vendor`;
     }
   }
 
+  // CKEditor 5 translation files need some special handling. Start by ensuring
+  // that an empty /translations directory exists in the
+  // /core/assets/vendor/ckeditor5 directory.
+  const ckeditor5Path = `${assetsFolder}/ckeditor5`;
+  await rmdir(`${ckeditor5Path}/translations`, { recursive: true })
+    .catch(() => {
+      // Nothing to do if the directory doesn't exist.
+    });
+  await mkdir(`${ckeditor5Path}/translations`);
+
   /**
    * Declare the array that defines what needs to be copied over.
    *
@@ -171,66 +181,249 @@ const assetsFolder = `${coreFolder}/assets/vendor`;
       pack: 'loadjs',
       files: [{ from: 'dist/loadjs.min.js', to: 'loadjs.min.js' }],
     },
-  ].map(async ({ pack, files = [], folder = false, library = false }) => {
-    const sourceFolder = pack;
-    const libraryName = library || folder || pack;
-    const destFolder = folder || pack;
-
-    let packageInfo;
-    // Take the version info from the package.json file.
-    if (!['joyride', 'farbtastic'].includes(pack)) {
-      packageInfo = JSON.parse(
-        await readFile(`${packageFolder}/${sourceFolder}/package.json`),
-      );
-    }
-    if (packageInfo) {
-      updateLibraryVersion(libraryName, packageInfo);
+    {
+      pack: '@ckeditor/ckeditor5-alignment',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/alignment.js', to: 'alignment.js' }
+      ],
+      library: 'ckeditor5.alignment',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-basic-styles',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/basic-styles.js', to: 'basic-styles.js' }
+      ],
+      library: 'ckeditor5.basic',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-block-quote',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/block-quote.js', to: 'block-quote.js' }
+      ],
+      library: 'ckeditor5.blockquote',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-editor-classic',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/editor-classic.js', to: 'editor-classic.js' }
+      ],
+      library: 'ckeditor5.editorClassic',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-editor-decoupled',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/editor-decoupled.js', to: 'editor-decoupled.js' }
+      ],
+      library: 'ckeditor5.editorDecoupled',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-essentials',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/essentials.js', to: 'essentials.js' }
+      ],
+      library: 'ckeditor5.internal',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-heading',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/heading.js', to: 'heading.js' }
+      ],
+      library: 'ckeditor5.internal',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-horizontal-line',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/horizontal-line.js', to: 'horizontal-line.js' }
+      ],
+      library: 'ckeditor5.horizontalLine',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-image',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/image.js', to: 'image.js' }
+      ],
+      library: 'ckeditor5.image',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-indent',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/indent.js', to: 'indent.js' }
+      ],
+      library: 'ckeditor5.indent',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-language',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/language.js', to: 'language.js' },
+      ],
+      library: 'ckeditor5.language',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-link',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/link.js', to: 'link.js' }
+      ],
+      library: 'ckeditor5.link',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-list',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/list.js', to: 'list.js' }
+      ],
+      library: 'ckeditor5.list',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-paste-from-office',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/paste-from-office.js', to: 'paste-from-office.js' }
+      ],
+      library: 'ckeditor5.pasteFromOffice',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-remove-format',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/remove-format.js', to: 'remove-format.js' }
+      ],
+      library: 'ckeditor5.removeFormat',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-source-editing',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/source-editing.js', to: 'source-editing.js' }
+      ],
+      library: 'ckeditor5.sourceEditing',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-table',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/table.js', to: 'table.js' }
+      ],
+      library: 'ckeditor5.table',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-html-support',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/html-support.js', to: 'html-support.js' }
+      ],
+      library: 'ckeditor5.htmlSupport',
+    },
+    {
+      pack: '@ckeditor/ckeditor5-special-characters',
+      folder: 'ckeditor5',
+      files: [
+        { from: 'build/special-characters.js', to: 'special-characters.js' }
+      ],
+      library: 'ckeditor5.specialCharacters',
+    },
+    {
+      pack: 'ckeditor5',
+      files: [
+        { from: 'build/ckeditor5-dll.js', to: 'ckeditor5-dll.js' }
+      ],
     }
+  ];
 
-    files.forEach(async (file) => {
-      let source = file;
-      let dest = file;
-      if (typeof file === 'object') {
-        source = file.from;
-        dest = file.to;
-      }
-      // For map files, make sure the sources files don't leak outside the
-      // library folder. In the `sources` member, remove all "../" values at
-      // the start of the files names to avoid having the virtual files outside
-      // of the library vendor folder in dev tools.
-      if (path.extname(source) === '.map') {
-        console.log('Process map file', source);
-        const map = await readFile(
-          `${packageFolder}/${sourceFolder}/${source}`,
-        );
-        const json = JSON.parse(map);
-        json.sources = json.sources.map((source) =>
-          source.replace(/^(\.\.\/)+/, ''),
-        );
-        await writeFile(
-          `${assetsFolder}/${destFolder}/${dest}`,
-          JSON.stringify(json),
-        );
-      } else {
-        console.log(
-          'Copy',
-          `${sourceFolder}/${source}`,
-          'to',
-          `${destFolder}/${dest}`,
-        );
-        await copyFile(
-          `${packageFolder}/${sourceFolder}/${source}`,
-          `${assetsFolder}/${destFolder}/${dest}`,
+  // Use Array.reduce for sequential processing to avoid corrupting the
+  // contents of the concatenated CKEditor 5 translation files.
+  process.reduce(async (previous, { pack, files = [], folder = false, library = false }) => {
+    return previous.then(async () => {
+      const sourceFolder = pack;
+      const libraryName = library || folder || pack;
+      const destFolder = folder || pack;
+
+      let packageInfo;
+      // Take the version info from the package.json file.
+      if (!['joyride', 'farbtastic'].includes(pack)) {
+        packageInfo = JSON.parse(
+          await readFile(`${packageFolder}/${sourceFolder}/package.json`),
         );
-        // These 2 files come from a zip file that hasn't been updated in years
-        // hardcode the permission fix to pass the commit checks.
-        if (['jquery.joyride-2.1.js', 'marker.png'].includes(dest)) {
-          await chmod(`${assetsFolder}/${destFolder}/${dest}`, 0o644);
-        }
       }
+      if (packageInfo) {
+        updateLibraryVersion(libraryName, packageInfo);
+      }
+
+      // CKEditor 5 packages ship with translation files.
+      if (pack.startsWith('@ckeditor') || pack === 'ckeditor5') {
+        const packageTranslationPath = `${packageFolder}/${sourceFolder}/build/translations`;
+        await readdir(packageTranslationPath, { withFileTypes: true }).then(async (translationFiles) => {
+          return translationFiles.map(async (translationFile) => {
+            if (!translationFile.isDirectory()) {
+              // Translation files are concatenated to a single translation
+              // file to avoid having to make multiple network requests to
+              // various translation files. As a trade off, this leads into
+              // some redundant translations depending on configuration.
+              await readFile(`${packageTranslationPath}/${translationFile.name}`).then(async (contents) => {
+                return appendFile(`${assetsFolder}/${destFolder}/translations/${translationFile.name}`, contents);
+              });
+            }
+          }, Promise.resolve());
+        }).catch(() => {
+          // Do nothing as it's expected that not all packages ship translations.
+        });
+      }
+
+      return files.forEach(async (file) => {
+        let source = file;
+        let dest = file;
+        if (typeof file === 'object') {
+          source = file.from;
+          dest = file.to;
+        }
+        // For map files, make sure the sources files don't leak outside the
+        // library folder. In the `sources` member, remove all "../" values at
+        // the start of the files names to avoid having the virtual files outside
+        // of the library vendor folder in dev tools.
+        if (path.extname(source) === '.map') {
+          console.log('Process map file', source);
+          const map = await readFile(
+            `${packageFolder}/${sourceFolder}/${source}`,
+          );
+          const json = JSON.parse(map);
+          json.sources = json.sources.map((source) =>
+            source.replace(/^(\.\.\/)+/, ''),
+          );
+          await writeFile(
+            `${assetsFolder}/${destFolder}/${dest}`,
+            JSON.stringify(json),
+          );
+        } else {
+          console.log(
+            'Copy',
+            `${sourceFolder}/${source}`,
+            'to',
+            `${destFolder}/${dest}`,
+          );
+          await copyFile(
+            `${packageFolder}/${sourceFolder}/${source}`,
+            `${assetsFolder}/${destFolder}/${dest}`,
+          );
+          // These 2 files come from a zip file that hasn't been updated in years
+          // hardcode the permission fix to pass the commit checks.
+          if (['jquery.joyride-2.1.js', 'marker.png'].includes(dest)) {
+            await chmod(`${assetsFolder}/${destFolder}/${dest}`, 0o644);
+          }
+        }
+      });
     });
-  });
+  }, Promise.resolve());
 
-  await Promise.all(process);
   await writeFile(librariesPath, libraries.join('\n\n'));
 })();
diff --git a/core/yarn.lock b/core/yarn.lock
index ff0c29bfeaac3556ddf9705d9c80dd035d9b6958..2670ffc0242208e74e1253843ef090dd4cea9446 100644
--- a/core/yarn.lock
+++ b/core/yarn.lock
@@ -894,6 +894,305 @@
     "@babel/helper-validator-identifier" "^7.14.9"
     to-fast-properties "^2.0.0"
 
+"@ckeditor/ckeditor5-alignment@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-alignment/-/ckeditor5-alignment-31.0.0.tgz#b91e935a9fef8731cea13a83cc6bc3d9391a45cf"
+  integrity sha512-nbu6O657MyUj+OaUrVTE7VZaHO7KFqCmsYeQJq+endcLiwKqBWEBtBKNRgakJCsgbIvh/7E6QQCr75kmLKa9+Q==
+  dependencies:
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-basic-styles@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-31.0.0.tgz#e65e3b3fd6133b8fa27cca7d30ae61f66f194619"
+  integrity sha512-1QXryQRj3uQ0Qmef6yMk5V0xjfk3T8fXESi1pHIsy/A3zgSUCUg+/xXJmIOBLp6LLRiL+bju/grbjerbHXEIHg==
+  dependencies:
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-block-quote@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-31.0.0.tgz#8c59783f5168599ff621071a0efeaf60f48007a8"
+  integrity sha512-T9NPuCWVtNF4EGXn4q8YSyJI1Ry9jJ0PZUv2exKsQAh5DloVXA3ufdAqqi7W/h7S4e5ffF+VAhrgNa0js3BcnA==
+  dependencies:
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-clipboard@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-31.0.0.tgz#158b4089ca2c38d6d29e1399915a82146b0ce6fc"
+  integrity sha512-wmdYd/bNp3zYA9ERo2ednl+ivf2xYq91iTnUDybxgexRHrMc8mjYTTzevrF4aXY56kpQR8c7dhU+Mzy68F7dTg==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^31.0.0"
+    "@ckeditor/ckeditor5-engine" "^31.0.0"
+    "@ckeditor/ckeditor5-utils" "^31.0.0"
+    "@ckeditor/ckeditor5-widget" "^31.0.0"
+    lodash-es "^4.17.11"
+
+"@ckeditor/ckeditor5-core@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-core/-/ckeditor5-core-31.0.0.tgz#3559042497791a026be56bef5c0bbd18dacc8d74"
+  integrity sha512-8AvolCaFC/iTDJViNAQk2uJr2LLRieCEc0Kda5OUT0xgeoUF+/B5DYSU3ie8cJOghBSjZmEoZFUApqGaDm0QIA==
+  dependencies:
+    "@ckeditor/ckeditor5-engine" "^31.0.0"
+    "@ckeditor/ckeditor5-ui" "^31.0.0"
+    "@ckeditor/ckeditor5-utils" "^31.0.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-dev-utils@^25.4.5":
+  version "25.4.5"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-dev-utils/-/ckeditor5-dev-utils-25.4.5.tgz#723d5a2bbf128f492279e5f9b9c8899fd9a923e5"
+  integrity sha512-ssW6QPNVG/yz0JxFfivNP8LLFgzAnQvuW2qA90RT9E0+jVpB1E5ayrhuZv2KOKvGeVMc5l7PIoNrR6NShvfOpQ==
+  dependencies:
+    "@ckeditor/ckeditor5-dev-webpack-plugin" "^25.4.5"
+    acorn "^6.2.1"
+    acorn-walk "^6.2.0"
+    chalk "^3.0.0"
+    cssnano "^4.0.0"
+    del "^5.0.0"
+    escodegen "^1.9.0"
+    fs-extra "^8.1.0"
+    javascript-stringify "^1.6.0"
+    pofile "^1.0.9"
+    postcss "^7.0.36"
+    postcss-import "^12.0.0"
+    postcss-loader "^3.0.0"
+    postcss-mixins "^6.2.0"
+    postcss-nesting "^7.0.0"
+    raw-loader "^4.0.1"
+    shelljs "^0.8.1"
+    style-loader "^1.2.1"
+    terser-webpack-plugin "^3.0.2"
+    through2 "^3.0.1"
+
+"@ckeditor/ckeditor5-dev-webpack-plugin@^25.4.5":
+  version "25.4.5"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-dev-webpack-plugin/-/ckeditor5-dev-webpack-plugin-25.4.5.tgz#6513dd9d3cf001e3e6be887aa2565b8f69c7897d"
+  integrity sha512-pR8eUDcq1ssEj2fRIJMKwFQzJj/KARLo78SS+MzmE27b+p4PR+sJERZle6ihzrJO8Y4jgHPbG6G/jsv8BlBzeA==
+  dependencies:
+    "@ckeditor/ckeditor5-dev-utils" "^25.4.5"
+    chalk "^4.0.0"
+    rimraf "^3.0.2"
+    semver "^7.3.4"
+    webpack-sources "^2.0.1"
+
+"@ckeditor/ckeditor5-editor-classic@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-31.0.0.tgz#6038007a5b4fdbb2a64c48fd5752f2b68201b2ba"
+  integrity sha512-73uctgAl8cX6//KlW1CUMQFXEK3USw6DfpUJrKXucMrdRksNXllu1WcZbADwcXgQk006byr8DKA51wNI00+daQ==
+  dependencies:
+    ckeditor5 "^31.0.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-editor-decoupled@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-decoupled/-/ckeditor5-editor-decoupled-31.0.0.tgz#4730f285919d9428ac4c958375700b91c0a6609c"
+  integrity sha512-FRjfzldQEk3i0hBSxRdgQWcwRpVeNF7Hvkf50vRFHoZItww/NQWURi+tUwf/Ohkshr4Pv9Rx5Pu/7HOvnJA3sw==
+  dependencies:
+    ckeditor5 "^31.0.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-engine@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-31.0.0.tgz#629cdd6e8824a0679cd1842ce4f511234fba5a89"
+  integrity sha512-RVsGWx2R9T0cgDZtEo6O5GihvKB3PHoM7SJ/qbmDDWKuhJ/89KZDrWuFrgdNyfZsZwdgNplwnvX8gDvSHpRqkw==
+  dependencies:
+    "@ckeditor/ckeditor5-utils" "^31.0.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-enter@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-31.0.0.tgz#803badc2be7a38ca27a25e3e2de2e44c8905169c"
+  integrity sha512-FCv890nP1CoBLpZ8gOWmgWhmtNhSzIYODmbogI42pVhtQXbu/wMdlA5PsJF81cdrDL1MlL7Tnmor7+Yk1Ej1QQ==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^31.0.0"
+    "@ckeditor/ckeditor5-engine" "^31.0.0"
+    "@ckeditor/ckeditor5-utils" "^31.0.0"
+
+"@ckeditor/ckeditor5-essentials@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-31.0.0.tgz#48928686e44ebf2658af6223ce18fd6e318a9f23"
+  integrity sha512-S14B/cyushn4n4ANz8H4TjjbxaeH94OG+EDwKL4bXAYn/B1S/I5Cm+MRi7Q8Z3A8A6fjzGhNPUyDx0GnpmKZHQ==
+  dependencies:
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-heading@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-heading/-/ckeditor5-heading-31.0.0.tgz#a0eae16d9d5b0288b250596502a7e9b8f89815d4"
+  integrity sha512-bAcNG2K7sZWxvTJTriof/lsR81o4QGbpaFcwj62QfTjYP+To5jlD4YhUIcCbg1YpiwlbJr8tv6PuWH6MkNh/5g==
+  dependencies:
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-horizontal-line@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-horizontal-line/-/ckeditor5-horizontal-line-31.0.0.tgz#4a01738e435474f4213b7430b235912711c39724"
+  integrity sha512-QBw34CAMZ3KDr69qJ+qlPoMx7nxkv0Z9NrN/ZkguFmFFI+Wa6SvQKw5qhu9f8T6cgGlkruDtXOGBWSoiEIPfUg==
+  dependencies:
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-html-support@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-html-support/-/ckeditor5-html-support-31.0.0.tgz#02abcfc62102828e752768c7c8e139faec48e7d4"
+  integrity sha512-ayNDdGqmhQLqUvbNGv4c+4qtzfOFrQsO8OqIsn1TLbCLjyIzHKrVHpAVUWIQCxJBZDUPJKQ/McGLIS2R37LIrQ==
+  dependencies:
+    ckeditor5 "^31.0.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-image@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-image/-/ckeditor5-image-31.0.0.tgz#75ea102cac5909c1b2d09a1c4e7f030fc59941bc"
+  integrity sha512-t7eYiRx4fLbSrBuSV7DoRC8zmTyzUQyind5gWQNWWDq/nF+bEaMkijOmbvak/gKQIl/C15Eo3jV6dPbzDdwgbg==
+  dependencies:
+    "@ckeditor/ckeditor5-ui" "^31.0.0"
+    ckeditor5 "^31.0.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-indent@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-indent/-/ckeditor5-indent-31.0.0.tgz#397043a4f830a1cef6bded40547c2b2a84c6acb4"
+  integrity sha512-3WuQFMvbxTzGJkAlNhmXaCqwyrSb0k/8HpTw3M9ef7nu0J0eutwT09bJQrfdyeyZ9I7thOXKjh00wTOAni8y2Q==
+  dependencies:
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-language@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-language/-/ckeditor5-language-31.0.0.tgz#807ac9f6bd2c5dd59b07ae8cb169e86c26081b0f"
+  integrity sha512-3r5pv/xpErMb5QstCEpABFCifdubIw/nKSeVIPza/gIMOYExJOjVJGRsSuqsPu9QxdkxxTY62JTbjlWq/33elw==
+  dependencies:
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-link@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-link/-/ckeditor5-link-31.0.0.tgz#4cf4fe0e318c64b038b636f732b87dde8ba6143c"
+  integrity sha512-CeX05fQIR1p3/aD512vuLedq2OVHJE/toEg3ewZOlWfKan71L3/6wiuuSHO7KkCbp1d/1I/pGOz9G9pBfLUtvg==
+  dependencies:
+    "@ckeditor/ckeditor5-ui" "^31.0.0"
+    ckeditor5 "^31.0.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-list@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-list/-/ckeditor5-list-31.0.0.tgz#a2ef7bc30939774ccdf1b97b132ffcf04f24a5a7"
+  integrity sha512-lSGobEoHdS94ueyhJ+N7XJmZ6CafCobVy+5cNCOymSVoHAY3GI5xOdkWO9slOxV+i8+/yiHT5NDWuCxTzj3WxQ==
+  dependencies:
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-paragraph@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-31.0.0.tgz#8e5d5b94c362965625b6478dab6ab467144f3d9f"
+  integrity sha512-v6zSihnX6/C2eQ1P0Q2V1po/u/vkiPqUKYBSagCvW6jexUhUWiAUiBfyc1mS2VUFdyr9Anw6eHaMjbauwnTmFw==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^31.0.0"
+    "@ckeditor/ckeditor5-ui" "^31.0.0"
+    "@ckeditor/ckeditor5-utils" "^31.0.0"
+
+"@ckeditor/ckeditor5-paste-from-office@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-paste-from-office/-/ckeditor5-paste-from-office-31.0.0.tgz#ff001fa47e48feeec18cc3ebba61e1fedded2272"
+  integrity sha512-ACdbjBOm9SjQGYkA43bX6e+SfCMcyIxnHX7yl2iEXLSZO5kk70xqpKv0tWlg8N5jlcsYPEXR9dHJheWRPehNsg==
+  dependencies:
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-remove-format@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-remove-format/-/ckeditor5-remove-format-31.0.0.tgz#e62f7a277a55c0a650582e5f914dd0cb254d865f"
+  integrity sha512-zAcQjsvqPMro3PqBE3QrladNvKlT6cxRtYN4tWBn+kqg3DPlnZcH9HqeVxf6e2GVwDLkp8xRY9BD2CgyLtGt3Q==
+  dependencies:
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-select-all@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-31.0.0.tgz#59877462ff73cfd490464d9a9eed76288cd592d6"
+  integrity sha512-+n3LvYx9Kdr+A0AUr012FT8O+5/A7GdkSRMI/L0gAuy1IHXYmPYzbymO+qFLY8lyrAfJvZX6rqFLcnaqtLUL6A==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^31.0.0"
+    "@ckeditor/ckeditor5-ui" "^31.0.0"
+    "@ckeditor/ckeditor5-utils" "^31.0.0"
+
+"@ckeditor/ckeditor5-source-editing@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-source-editing/-/ckeditor5-source-editing-31.0.0.tgz#eec813af3fb6178631fbeb0a80960722b0f94150"
+  integrity sha512-PPy6Q0/+APKECexoDgzwj52obpow+PnEuoRFTaEspjgt11Dfw/YB7XjAnvuc2msehSkzDhEnDfsB0rPgVvvnzw==
+  dependencies:
+    "@ckeditor/ckeditor5-theme-lark" "^31.0.0"
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-special-characters@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-special-characters/-/ckeditor5-special-characters-31.0.0.tgz#d6534ee116e03f4b11ebd3e37db68a833ad594eb"
+  integrity sha512-ja7WjK+GHpfql+CmVV1R6m5ukiQwwenFaiwyf0e8JYrvG0h7brt32ala8Faum/HvwpaTjoLJZRLlxgtt1sTdQg==
+  dependencies:
+    ckeditor5 "^31.0.0"
+
+"@ckeditor/ckeditor5-table@~31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-table/-/ckeditor5-table-31.0.0.tgz#40e19b8dca19f8d7163416bfce3196a122c28323"
+  integrity sha512-KdotVXhRlJBuYUPkTo/VDvCSoPm4dZSeZDwV0PWTMiAutmxkpdHHG0FGnAJphCPA1BLO0eLj84DkSyMdw3WlsQ==
+  dependencies:
+    ckeditor5 "^31.0.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-theme-lark@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-theme-lark/-/ckeditor5-theme-lark-31.0.0.tgz#713197a129ef346297c4c218d9968f14e9283f74"
+  integrity sha512-e66pDi5uc6pF7R2LQas64zp1dmi55VfuXabTopsLaaS0TIN1KO6vtKQse7rd9wHGlZPwgonY/YbweeXWIN/EhA==
+  dependencies:
+    "@ckeditor/ckeditor5-ui" "^31.0.0"
+
+"@ckeditor/ckeditor5-typing@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-31.0.0.tgz#cd7ef4fc34985d56d00ae3da2ac85588be43959c"
+  integrity sha512-7lILwGNhynpUcXKqzzAmPsL57myxqFcv0K1OPb+2jkzEruaYkAINJ3fMYNBwwAxtg2wZDP598ufwonplcSNsJA==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^31.0.0"
+    "@ckeditor/ckeditor5-engine" "^31.0.0"
+    "@ckeditor/ckeditor5-utils" "^31.0.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-ui@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-31.0.0.tgz#1c3e7703a99bb3a0e80cab7356d0dc593dc0ef14"
+  integrity sha512-WDEwToA8FOPi/AeYqdF6isdTM7hJp26WzxDhDNGWC8aYu/zA146Z07qTbYuBOebG9TWqjsZOQYDXbH/4phmyDg==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^31.0.0"
+    "@ckeditor/ckeditor5-utils" "^31.0.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-undo@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-31.0.0.tgz#f5b84a9c8cb8183ea0b3ba84a16c4e46b1a12484"
+  integrity sha512-mTSjiMJ/sSTP485djBiMQ4yD7M0qDIcqDlTV6op34M1eXLY63ZwQUnd9NiOqOLrBiwaBBmnRYlSeZCQjoCuk0A==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^31.0.0"
+    "@ckeditor/ckeditor5-engine" "^31.0.0"
+    "@ckeditor/ckeditor5-ui" "^31.0.0"
+
+"@ckeditor/ckeditor5-upload@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-31.0.0.tgz#caea779bf563077ff96b74491233e0176d317d95"
+  integrity sha512-ChtGU66fdqwTaOazXtRXcOi6tOzAiTPC5UUv+LycxwSB6MKbqJANg8ny9RoTGWDpHUabb6UHyX8bwlfkXKIqbQ==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^31.0.0"
+    "@ckeditor/ckeditor5-ui" "^31.0.0"
+    "@ckeditor/ckeditor5-utils" "^31.0.0"
+
+"@ckeditor/ckeditor5-utils@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-31.0.0.tgz#aeff820668e46dd4ab709da8d5f5089da3cd1b71"
+  integrity sha512-T9S2x0AUBnhN8BJ7Pg4E8okEUccYBKyu5hp4nH2kMUSmfqeJ0JWC9CD5dA1nDOXvU10J6Rw8VoqkbRx/4MuYEw==
+  dependencies:
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-widget@^31.0.0":
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-31.0.0.tgz#b6bfe9643b36498f11dc44c3dec7bd721eab7081"
+  integrity sha512-MCpBdT2sD/nRgC825aIaI1Tu7T6OQYvNxc6Q4D+gNkdRbLLZrGoWKHNZdgmQg9Di1WgVO1cPo+h45HO2KYHAMA==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^31.0.0"
+    "@ckeditor/ckeditor5-engine" "^31.0.0"
+    "@ckeditor/ckeditor5-enter" "^31.0.0"
+    "@ckeditor/ckeditor5-typing" "^31.0.0"
+    "@ckeditor/ckeditor5-ui" "^31.0.0"
+    "@ckeditor/ckeditor5-utils" "^31.0.0"
+    lodash-es "^4.17.15"
+
 "@cspell/cspell-bundled-dicts@^5.12.3":
   version "5.12.3"
   resolved "https://registry.yarnpkg.com/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-5.12.3.tgz#d4ae61d03c6f991f4b03b03ee718830522bf74d5"
@@ -1120,6 +1419,11 @@
   resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
   integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==
 
+"@discoveryjs/json-ext@^0.5.0":
+  version "0.5.5"
+  resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz#9283c9ce5b289a3c4f61c12757469e59377f81f3"
+  integrity sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==
+
 "@drupal/once@^1.0.1":
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/@drupal/once/-/once-1.0.1.tgz#7c1ef480aec6d5fa4b5ae986afa5a607afc38482"
@@ -1140,6 +1444,11 @@
     minimatch "^3.0.4"
     strip-json-comments "^3.1.1"
 
+"@gar/promisify@^1.0.1":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210"
+  integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==
+
 "@humanwhocodes/config-array@^0.5.0":
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
@@ -1154,6 +1463,14 @@
   resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf"
   integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==
 
+"@mrmlnc/readdir-enhanced@^2.2.1":
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+  integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
+  dependencies:
+    call-me-maybe "^1.0.1"
+    glob-to-regexp "^0.3.0"
+
 "@nodelib/fs.scandir@2.1.5":
   version "2.1.5"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -1167,6 +1484,11 @@
   resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
   integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
 
+"@nodelib/fs.stat@^1.1.2":
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
+  integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+
 "@nodelib/fs.walk@^1.2.3":
   version "1.2.8"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
@@ -1175,6 +1497,22 @@
     "@nodelib/fs.scandir" "2.1.5"
     fastq "^1.6.0"
 
+"@npmcli/fs@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f"
+  integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==
+  dependencies:
+    "@gar/promisify" "^1.0.1"
+    semver "^7.3.5"
+
+"@npmcli/move-file@^1.0.1":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674"
+  integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==
+  dependencies:
+    mkdirp "^1.0.4"
+    rimraf "^3.0.2"
+
 "@popperjs/core@^2.9.2":
   version "2.10.2"
   resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.2.tgz#0798c03351f0dea1a5a4cabddf26a55a7cbee590"
@@ -1205,6 +1543,45 @@
   resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
   integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
 
+"@tootallnate/once@2":
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
+  integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
+
+"@types/eslint-scope@^3.7.0":
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e"
+  integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==
+  dependencies:
+    "@types/eslint" "*"
+    "@types/estree" "*"
+
+"@types/eslint@*":
+  version "7.28.2"
+  resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.2.tgz#0ff2947cdd305897c52d5372294e8c76f351db68"
+  integrity sha512-KubbADPkfoU75KgKeKLsFHXnU4ipH7wYg0TRT33NK3N3yiu7jlFAAoygIWBV+KbuHx/G+AvuGX6DllnK35gfJA==
+  dependencies:
+    "@types/estree" "*"
+    "@types/json-schema" "*"
+
+"@types/estree@*", "@types/estree@^0.0.50":
+  version "0.0.50"
+  resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
+  integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==
+
+"@types/glob@^7.1.1":
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
+  integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
+  dependencies:
+    "@types/minimatch" "*"
+    "@types/node" "*"
+
+"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8":
+  version "7.0.9"
+  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
+  integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
+
 "@types/json5@^0.0.29":
   version "0.0.29"
   resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
@@ -1217,6 +1594,11 @@
   dependencies:
     "@types/unist" "*"
 
+"@types/minimatch@*":
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
+  integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
+
 "@types/minimist@^1.2.0":
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
@@ -1237,6 +1619,11 @@
   resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
   integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
 
+"@types/q@^1.5.1":
+  version "1.5.5"
+  resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df"
+  integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==
+
 "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2":
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d"
@@ -1249,16 +1636,202 @@
   dependencies:
     "@types/node" "*"
 
+"@webassemblyjs/ast@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
+  integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
+  dependencies:
+    "@webassemblyjs/helper-numbers" "1.11.1"
+    "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+
+"@webassemblyjs/floating-point-hex-parser@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
+  integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
+
+"@webassemblyjs/helper-api-error@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
+  integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
+
+"@webassemblyjs/helper-buffer@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
+  integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
+
+"@webassemblyjs/helper-numbers@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
+  integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
+  dependencies:
+    "@webassemblyjs/floating-point-hex-parser" "1.11.1"
+    "@webassemblyjs/helper-api-error" "1.11.1"
+    "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/helper-wasm-bytecode@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
+  integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
+
+"@webassemblyjs/helper-wasm-section@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
+  integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
+  dependencies:
+    "@webassemblyjs/ast" "1.11.1"
+    "@webassemblyjs/helper-buffer" "1.11.1"
+    "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+    "@webassemblyjs/wasm-gen" "1.11.1"
+
+"@webassemblyjs/ieee754@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
+  integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
+  dependencies:
+    "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
+  integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
+  dependencies:
+    "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
+  integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
+
+"@webassemblyjs/wasm-edit@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
+  integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
+  dependencies:
+    "@webassemblyjs/ast" "1.11.1"
+    "@webassemblyjs/helper-buffer" "1.11.1"
+    "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+    "@webassemblyjs/helper-wasm-section" "1.11.1"
+    "@webassemblyjs/wasm-gen" "1.11.1"
+    "@webassemblyjs/wasm-opt" "1.11.1"
+    "@webassemblyjs/wasm-parser" "1.11.1"
+    "@webassemblyjs/wast-printer" "1.11.1"
+
+"@webassemblyjs/wasm-gen@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
+  integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
+  dependencies:
+    "@webassemblyjs/ast" "1.11.1"
+    "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+    "@webassemblyjs/ieee754" "1.11.1"
+    "@webassemblyjs/leb128" "1.11.1"
+    "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wasm-opt@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
+  integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
+  dependencies:
+    "@webassemblyjs/ast" "1.11.1"
+    "@webassemblyjs/helper-buffer" "1.11.1"
+    "@webassemblyjs/wasm-gen" "1.11.1"
+    "@webassemblyjs/wasm-parser" "1.11.1"
+
+"@webassemblyjs/wasm-parser@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
+  integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
+  dependencies:
+    "@webassemblyjs/ast" "1.11.1"
+    "@webassemblyjs/helper-api-error" "1.11.1"
+    "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+    "@webassemblyjs/ieee754" "1.11.1"
+    "@webassemblyjs/leb128" "1.11.1"
+    "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wast-printer@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
+  integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
+  dependencies:
+    "@webassemblyjs/ast" "1.11.1"
+    "@xtuc/long" "4.2.2"
+
+"@webpack-cli/configtest@^1.1.0":
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.0.tgz#8342bef0badfb7dfd3b576f2574ab80c725be043"
+  integrity sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==
+
+"@webpack-cli/info@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.0.tgz#b9179c3227ab09cbbb149aa733475fcf99430223"
+  integrity sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==
+  dependencies:
+    envinfo "^7.7.3"
+
+"@webpack-cli/serve@^1.6.0":
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.0.tgz#2c275aa05c895eccebbfc34cfb223c6e8bd591a2"
+  integrity sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==
+
+"@xtuc/ieee754@^1.2.0":
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+  integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+  integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+abab@^2.0.3, abab@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
+  integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==
+
+acorn-globals@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"
+  integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==
+  dependencies:
+    acorn "^7.1.1"
+    acorn-walk "^7.1.1"
+
+acorn-import-assertions@^1.7.6:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
+  integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
+
 acorn-jsx@^5.3.1:
   version "5.3.2"
   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
   integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
 
-acorn@^7.4.0:
+acorn-walk@^6.2.0:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
+  integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
+
+acorn-walk@^7.1.1:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
+  integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
+
+acorn@^6.2.1:
+  version "6.4.2"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6"
+  integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==
+
+acorn@^7.1.1, acorn@^7.4.0:
   version "7.4.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
   integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
 
+acorn@^8.4.1, acorn@^8.5.0:
+  version "8.5.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
+  integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
+
 agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2:
   version "6.0.2"
   resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
@@ -1274,7 +1847,17 @@ aggregate-error@^3.0.0:
     clean-stack "^2.0.0"
     indent-string "^4.0.0"
 
-ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4:
+ajv-errors@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
+  integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
+
+ajv-keywords@^3.1.0, ajv-keywords@^3.5.2:
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+  integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5:
   version "6.12.6"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
   integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -1294,6 +1877,11 @@ ajv@^8.0.1:
     require-from-string "^2.0.2"
     uri-js "^4.2.2"
 
+alphanum-sort@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+  integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
+
 ansi-colors@3.2.3:
   version "3.2.3"
   resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813"
@@ -1356,6 +1944,21 @@ aria-query@^4.2.2:
     "@babel/runtime" "^7.10.2"
     "@babel/runtime-corejs3" "^7.10.2"
 
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+  integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+  integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+  integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
 array-includes@^3.1.1, array-includes@^3.1.3, array-includes@^3.1.4:
   version "3.1.4"
   resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9"
@@ -1372,11 +1975,28 @@ array-timsort@^1.0.3:
   resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926"
   integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==
 
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
+  dependencies:
+    array-uniq "^1.0.1"
+
 array-union@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
   integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
 
+array-uniq@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+  integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
+
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+  integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
 array.prototype.flat@^1.2.5:
   version "1.2.5"
   resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13"
@@ -1422,6 +2042,11 @@ assertion-error@^1.1.0:
   resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
   integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
 
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+  integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
 ast-types-flow@^0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
@@ -1449,6 +2074,11 @@ asynckit@^0.4.0:
   resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
   integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
 
+atob@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
 autoprefixer@^9.6.1, autoprefixer@^9.8.6:
   version "9.8.8"
   resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a"
@@ -1547,6 +2177,19 @@ balanced-match@^2.0.0:
   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9"
   integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==
 
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+  dependencies:
+    cache-base "^1.0.1"
+    class-utils "^0.3.5"
+    component-emitter "^1.2.1"
+    define-property "^1.0.0"
+    isobject "^3.0.1"
+    mixin-deep "^1.2.0"
+    pascalcase "^0.1.1"
+
 bcrypt-pbkdf@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
@@ -1554,6 +2197,11 @@ bcrypt-pbkdf@^1.0.0:
   dependencies:
     tweetnacl "^0.14.3"
 
+big.js@^5.2.2:
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+  integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
 binary-extensions@^2.0.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
@@ -1564,6 +2212,11 @@ bluebird@^3.5.0:
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
   integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
 
+boolbase@^1.0.0, boolbase@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+  integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
 brace-expansion@^1.1.7:
   version "1.1.11"
   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -1572,6 +2225,22 @@ brace-expansion@^1.1.7:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
 
+braces@^2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+  integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+  dependencies:
+    arr-flatten "^1.1.0"
+    array-unique "^0.3.2"
+    extend-shallow "^2.0.1"
+    fill-range "^4.0.0"
+    isobject "^3.0.1"
+    repeat-element "^1.1.2"
+    snapdragon "^0.8.1"
+    snapdragon-node "^2.0.1"
+    split-string "^3.0.2"
+    to-regex "^3.0.1"
+
 braces@^3.0.1, braces@~3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
@@ -1579,11 +2248,27 @@ braces@^3.0.1, braces@~3.0.2:
   dependencies:
     fill-range "^7.0.1"
 
+browser-process-hrtime@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
+  integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
+
 browser-stdout@1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
   integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
 
+browserslist@^4.0.0, browserslist@^4.14.5:
+  version "4.17.6"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d"
+  integrity sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==
+  dependencies:
+    caniuse-lite "^1.0.30001274"
+    electron-to-chromium "^1.3.886"
+    escalade "^3.1.1"
+    node-releases "^2.0.1"
+    picocolors "^1.0.0"
+
 browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.6.4:
   version "4.17.5"
   resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.5.tgz#c827bbe172a4c22b123f5e337533ceebadfdd559"
@@ -1610,6 +2295,45 @@ bytes@3.1.0:
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
   integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
 
+cacache@^15.0.5:
+  version "15.3.0"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb"
+  integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==
+  dependencies:
+    "@npmcli/fs" "^1.0.0"
+    "@npmcli/move-file" "^1.0.1"
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    glob "^7.1.4"
+    infer-owner "^1.0.4"
+    lru-cache "^6.0.0"
+    minipass "^3.1.1"
+    minipass-collect "^1.0.2"
+    minipass-flush "^1.0.5"
+    minipass-pipeline "^1.2.2"
+    mkdirp "^1.0.3"
+    p-map "^4.0.0"
+    promise-inflight "^1.0.1"
+    rimraf "^3.0.2"
+    ssri "^8.0.1"
+    tar "^6.0.2"
+    unique-filename "^1.1.1"
+
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+  dependencies:
+    collection-visit "^1.0.0"
+    component-emitter "^1.2.1"
+    get-value "^2.0.6"
+    has-value "^1.0.0"
+    isobject "^3.0.1"
+    set-value "^2.0.0"
+    to-object-path "^0.3.0"
+    union-value "^1.0.0"
+    unset-value "^1.0.0"
+
 call-bind@^1.0.0, call-bind@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
@@ -1618,11 +2342,40 @@ call-bind@^1.0.0, call-bind@^1.0.2:
     function-bind "^1.1.1"
     get-intrinsic "^1.0.2"
 
+call-me-maybe@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
+  integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
+
+caller-callsite@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
+  integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
+  dependencies:
+    callsites "^2.0.0"
+
+caller-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
+  integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
+  dependencies:
+    caller-callsite "^2.0.0"
+
+callsites@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+  integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
+
 callsites@^3.0.0, callsites@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
   integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
 
+camelcase-css@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
+  integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
+
 camelcase-keys@^6.2.2:
   version "6.2.2"
   resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
@@ -1637,6 +2390,21 @@ camelcase@^5.0.0, camelcase@^5.3.1:
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
   integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
 
+caniuse-api@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+  integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+  dependencies:
+    browserslist "^4.0.0"
+    caniuse-lite "^1.0.0"
+    lodash.memoize "^4.1.2"
+    lodash.uniq "^4.5.0"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001274:
+  version "1.0.30001279"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz#eb06818da481ef5096a3b3760f43e5382ed6b0ce"
+  integrity sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==
+
 caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001271:
   version "1.0.30001271"
   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001271.tgz#0dda0c9bcae2cf5407cd34cac304186616cc83e8"
@@ -1655,7 +2423,7 @@ chai-nightwatch@^0.4.0:
     assertion-error "1.0.0"
     deep-eql "0.1.3"
 
-chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2:
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
   integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -1710,6 +2478,16 @@ chokidar@^3.3.1:
   optionalDependencies:
     fsevents "~2.3.2"
 
+chownr@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+  integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+chrome-trace-event@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
+  integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
+
 chromedriver@^87.0.0:
   version "87.0.7"
   resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-87.0.7.tgz#74041e02ff7f633e91b98eb707e2476f713dc4ca"
@@ -1729,6 +2507,34 @@ ci-info@^2.0.0:
   resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
   integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
 
+ckeditor5@^31.0.0, ckeditor5@~31.0.0:
+  version "31.0.0"
+  resolved "https://registry.yarnpkg.com/ckeditor5/-/ckeditor5-31.0.0.tgz#304208c1796138c8d063895e8b962f321a627846"
+  integrity sha512-6e6RJWn4mk3xKASy4DiwF0wz165wxagYfWsun7nB0oM4/s7Ri8T6Ihr433RVdepwaVLwrEp70yjk5pbY02cU9A==
+  dependencies:
+    "@ckeditor/ckeditor5-clipboard" "^31.0.0"
+    "@ckeditor/ckeditor5-core" "^31.0.0"
+    "@ckeditor/ckeditor5-engine" "^31.0.0"
+    "@ckeditor/ckeditor5-enter" "^31.0.0"
+    "@ckeditor/ckeditor5-paragraph" "^31.0.0"
+    "@ckeditor/ckeditor5-select-all" "^31.0.0"
+    "@ckeditor/ckeditor5-typing" "^31.0.0"
+    "@ckeditor/ckeditor5-ui" "^31.0.0"
+    "@ckeditor/ckeditor5-undo" "^31.0.0"
+    "@ckeditor/ckeditor5-upload" "^31.0.0"
+    "@ckeditor/ckeditor5-utils" "^31.0.0"
+    "@ckeditor/ckeditor5-widget" "^31.0.0"
+
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
 clean-stack@^2.0.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
@@ -1784,7 +2590,24 @@ clone@^1.0.2:
   resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
   integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
 
-color-convert@^1.9.0:
+coa@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
+  integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==
+  dependencies:
+    "@types/q" "^1.5.1"
+    chalk "^2.4.1"
+    q "^1.1.2"
+
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+  dependencies:
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
+
+color-convert@^1.9.0, color-convert@^1.9.3:
   version "1.9.3"
   resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
   integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
@@ -1803,12 +2626,33 @@ color-name@1.1.3:
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
   integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
 
-color-name@~1.1.4:
+color-name@^1.0.0, color-name@~1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
   integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
 
-combined-stream@^1.0.6, combined-stream@~1.0.6:
+color-string@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312"
+  integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==
+  dependencies:
+    color-name "^1.0.0"
+    simple-swizzle "^0.2.2"
+
+color@^3.0.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164"
+  integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==
+  dependencies:
+    color-convert "^1.9.3"
+    color-string "^1.6.0"
+
+colorette@^2.0.14:
+  version "2.0.16"
+  resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da"
+  integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
   version "1.0.8"
   resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
   integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
@@ -1820,6 +2664,11 @@ commander@^2.20.0:
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
   integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
 
+commander@^7.0.0:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
+  integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
 commander@^8.2.0:
   version "8.3.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
@@ -1841,6 +2690,11 @@ commondir@^1.0.1:
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
   integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
 
+component-emitter@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+  integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
 concat-map@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -1870,6 +2724,11 @@ convert-source-map@^1.7.0:
   dependencies:
     safe-buffer "~5.1.1"
 
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+  integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
 core-js-compat@^3.16.0, core-js-compat@^3.16.2:
   version "3.19.0"
   resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.0.tgz#b3b93f93c8721b3ed52b91f12f964cc410967f8b"
@@ -1893,6 +2752,16 @@ core-util-is@^1.0.2, core-util-is@~1.0.0:
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
   integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
 
+cosmiconfig@^5.0.0:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
+  integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
+  dependencies:
+    import-fresh "^2.0.0"
+    is-directory "^0.3.1"
+    js-yaml "^3.13.1"
+    parse-json "^4.0.0"
+
 cosmiconfig@^7.0.0, cosmiconfig@^7.0.1:
   version "7.0.1"
   resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
@@ -1911,7 +2780,7 @@ cross-env@^7.0.2:
   dependencies:
     cross-spawn "^7.0.1"
 
-cross-spawn@^7.0.1, cross-spawn@^7.0.2:
+cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
   version "7.0.3"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
   integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -2002,6 +2871,19 @@ css-blank-pseudo@^0.1.4:
   dependencies:
     postcss "^7.0.5"
 
+css-color-names@0.0.4, css-color-names@^0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+  integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
+css-declaration-sorter@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
+  integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
+  dependencies:
+    postcss "^7.0.1"
+    timsort "^0.3.0"
+
 css-has-pseudo@^0.10.0:
   version "0.10.0"
   resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee"
@@ -2017,6 +2899,42 @@ css-prefers-color-scheme@^3.1.1:
   dependencies:
     postcss "^7.0.5"
 
+css-select-base-adapter@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
+  integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
+
+css-select@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
+  integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==
+  dependencies:
+    boolbase "^1.0.0"
+    css-what "^3.2.1"
+    domutils "^1.7.0"
+    nth-check "^1.0.2"
+
+css-tree@1.0.0-alpha.37:
+  version "1.0.0-alpha.37"
+  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22"
+  integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
+  dependencies:
+    mdn-data "2.0.4"
+    source-map "^0.6.1"
+
+css-tree@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
+  integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
+  dependencies:
+    mdn-data "2.0.14"
+    source-map "^0.6.1"
+
+css-what@^3.2.1:
+  version "3.4.2"
+  resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4"
+  integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==
+
 css.escape@^1.5.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb"
@@ -2037,6 +2955,98 @@ cssesc@^3.0.0:
   resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
   integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
 
+cssnano-preset-default@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff"
+  integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==
+  dependencies:
+    css-declaration-sorter "^4.0.1"
+    cssnano-util-raw-cache "^4.0.1"
+    postcss "^7.0.0"
+    postcss-calc "^7.0.1"
+    postcss-colormin "^4.0.3"
+    postcss-convert-values "^4.0.1"
+    postcss-discard-comments "^4.0.2"
+    postcss-discard-duplicates "^4.0.2"
+    postcss-discard-empty "^4.0.1"
+    postcss-discard-overridden "^4.0.1"
+    postcss-merge-longhand "^4.0.11"
+    postcss-merge-rules "^4.0.3"
+    postcss-minify-font-values "^4.0.2"
+    postcss-minify-gradients "^4.0.2"
+    postcss-minify-params "^4.0.2"
+    postcss-minify-selectors "^4.0.2"
+    postcss-normalize-charset "^4.0.1"
+    postcss-normalize-display-values "^4.0.2"
+    postcss-normalize-positions "^4.0.2"
+    postcss-normalize-repeat-style "^4.0.2"
+    postcss-normalize-string "^4.0.2"
+    postcss-normalize-timing-functions "^4.0.2"
+    postcss-normalize-unicode "^4.0.1"
+    postcss-normalize-url "^4.0.1"
+    postcss-normalize-whitespace "^4.0.2"
+    postcss-ordered-values "^4.1.2"
+    postcss-reduce-initial "^4.0.3"
+    postcss-reduce-transforms "^4.0.2"
+    postcss-svgo "^4.0.3"
+    postcss-unique-selectors "^4.0.1"
+
+cssnano-util-get-arguments@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
+  integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=
+
+cssnano-util-get-match@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
+  integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=
+
+cssnano-util-raw-cache@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
+  integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
+  dependencies:
+    postcss "^7.0.0"
+
+cssnano-util-same-parent@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
+  integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
+
+cssnano@^4.0.0:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99"
+  integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==
+  dependencies:
+    cosmiconfig "^5.0.0"
+    cssnano-preset-default "^4.0.8"
+    is-resolvable "^1.0.0"
+    postcss "^7.0.0"
+
+csso@^4.0.2:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
+  integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
+  dependencies:
+    css-tree "^1.1.2"
+
+cssom@^0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36"
+  integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==
+
+cssom@~0.3.6:
+  version "0.3.8"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+  integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+cssstyle@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
+  integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
+  dependencies:
+    cssom "~0.3.6"
+
 cuint@^0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
@@ -2059,6 +3069,15 @@ data-uri-to-buffer@3:
   resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636"
   integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==
 
+data-urls@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.1.tgz#597fc2ae30f8bc4dbcf731fcd1b1954353afc6f8"
+  integrity sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw==
+  dependencies:
+    abab "^2.0.3"
+    whatwg-mimetype "^3.0.0"
+    whatwg-url "^10.0.0"
+
 debug@3.2.6:
   version "3.2.6"
   resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
@@ -2080,7 +3099,7 @@ debug@4.3.1:
   dependencies:
     ms "2.1.2"
 
-debug@^2.6.9:
+debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
   version "2.6.9"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
   integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
@@ -2107,6 +3126,16 @@ decamelize@^1.1.0, decamelize@^1.2.0:
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
 
+decimal.js@^10.3.1:
+  version "10.3.1"
+  resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
+  integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
+
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+  integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
 deep-eql@0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2"
@@ -2138,6 +3167,28 @@ define-properties@^1.1.2, define-properties@^1.1.3:
   dependencies:
     object-keys "^1.0.12"
 
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+  dependencies:
+    is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+  dependencies:
+    is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+  dependencies:
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
+
 degenerator@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-3.0.1.tgz#7ef78ec0c8577a544477308ddf1d2d6e88d51f5b"
@@ -2148,6 +3199,20 @@ degenerator@^3.0.1:
     esprima "^4.0.0"
     vm2 "^3.9.3"
 
+del@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7"
+  integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==
+  dependencies:
+    globby "^10.0.1"
+    graceful-fs "^4.2.2"
+    is-glob "^4.0.1"
+    is-path-cwd "^2.2.0"
+    is-path-inside "^3.0.1"
+    p-map "^3.0.0"
+    rimraf "^3.0.0"
+    slash "^3.0.0"
+
 del@^6.0.0:
   version "6.0.0"
   resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952"
@@ -2182,6 +3247,14 @@ diff@3.5.0:
   resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
   integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
 
+dir-glob@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034"
+  integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==
+  dependencies:
+    arrify "^1.0.1"
+    path-type "^3.0.0"
+
 dir-glob@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@@ -2221,6 +3294,13 @@ domelementtype@^2.0.1:
   resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
   integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
 
+domexception@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673"
+  integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==
+  dependencies:
+    webidl-conversions "^7.0.0"
+
 domhandler@^2.3.0:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
@@ -2228,7 +3308,7 @@ domhandler@^2.3.0:
   dependencies:
     domelementtype "1"
 
-domutils@^1.5.1:
+domutils@^1.5.1, domutils@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
   integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
@@ -2280,6 +3360,11 @@ electron-to-chromium@^1.3.878:
   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.880.tgz#58d1a298c5267f2faf440683d038c50ab39a6401"
   integrity sha512-iwIP/6WoeSimzUKJIQtjtpVDsK8Ir8qQCMXsUBwg+rxJR2Uh3wTNSbxoYRfs+3UWx/9MAnPIxVZCyWkm8MT0uw==
 
+electron-to-chromium@^1.3.886:
+  version "1.3.893"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.893.tgz#9d804c68953b05ede35409dba0d73dd54c077b4d"
+  integrity sha512-ChtwF7qB03INq1SyMpue08wc6cve+ktj2UC/Y7se9vB+JryfzziJeYwsgb8jLaCA5GMkHCdn5M62PfSMWhifZg==
+
 emoji-regex@^7.0.1:
   version "7.0.3"
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
@@ -2295,6 +3380,11 @@ emoji-regex@^9.0.0:
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
   integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
 
+emojis-list@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+  integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
 end-of-stream@^1.1.0:
   version "1.4.4"
   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@@ -2302,6 +3392,14 @@ end-of-stream@^1.1.0:
   dependencies:
     once "^1.4.0"
 
+enhanced-resolve@^5.8.3:
+  version "5.8.3"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0"
+  integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==
+  dependencies:
+    graceful-fs "^4.2.4"
+    tapable "^2.2.0"
+
 enquirer@^2.3.5:
   version "2.3.6"
   resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
@@ -2319,7 +3417,7 @@ entities@^2.0.0:
   resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
   integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
 
-envinfo@^7.5.1:
+envinfo@^7.5.1, envinfo@^7.7.3:
   version "7.8.1"
   resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
   integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
@@ -2331,7 +3429,7 @@ error-ex@^1.3.1:
   dependencies:
     is-arrayish "^0.2.1"
 
-es-abstract@^1.19.0, es-abstract@^1.19.1:
+es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1:
   version "1.19.1"
   resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3"
   integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==
@@ -2357,6 +3455,11 @@ es-abstract@^1.19.0, es-abstract@^1.19.1:
     string.prototype.trimstart "^1.0.4"
     unbox-primitive "^1.0.1"
 
+es-module-lexer@^0.9.0:
+  version "0.9.3"
+  resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
+  integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
+
 es-to-primitive@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
@@ -2386,7 +3489,7 @@ escape-string-regexp@^4.0.0:
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
   integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
 
-escodegen@^1.8.1:
+escodegen@^1.8.1, escodegen@^1.9.0:
   version "1.14.3"
   resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
   integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
@@ -2398,6 +3501,18 @@ escodegen@^1.8.1:
   optionalDependencies:
     source-map "~0.6.1"
 
+escodegen@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd"
+  integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==
+  dependencies:
+    esprima "^4.0.1"
+    estraverse "^5.2.0"
+    esutils "^2.0.2"
+    optionator "^0.8.1"
+  optionalDependencies:
+    source-map "~0.6.1"
+
 eslint-config-airbnb-base@^14.2.1:
   version "14.2.1"
   resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e"
@@ -2523,7 +3638,7 @@ eslint-plugin-yml@^0.10.0:
     natural-compare "^1.4.0"
     yaml-eslint-parser "^0.4.0"
 
-eslint-scope@^5.1.1:
+eslint-scope@5.1.1, eslint-scope@^5.1.1:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
   integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -2637,6 +3752,26 @@ esutils@^2.0.2:
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
   integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
 
+events@^3.2.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+  integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+execa@^5.0.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+  integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+  dependencies:
+    cross-spawn "^7.0.3"
+    get-stream "^6.0.0"
+    human-signals "^2.1.0"
+    is-stream "^2.0.0"
+    merge-stream "^2.0.0"
+    npm-run-path "^4.0.1"
+    onetime "^5.1.2"
+    signal-exit "^3.0.3"
+    strip-final-newline "^2.0.0"
+
 execall@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45"
@@ -2644,11 +3779,53 @@ execall@^2.0.0:
   dependencies:
     clone-regexp "^2.1.0"
 
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+  dependencies:
+    debug "^2.3.3"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    posix-character-classes "^0.1.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+  dependencies:
+    is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
 extend@^3.0.0, extend@~3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
   integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
 
+extglob@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+  dependencies:
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    expand-brackets "^2.1.4"
+    extend-shallow "^2.0.1"
+    fragment-cache "^0.2.1"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
 extract-zip@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
@@ -2684,7 +3861,19 @@ fast-diff@^1.1.2:
   resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
   integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
 
-fast-glob@^3.1.1, fast-glob@^3.2.5:
+fast-glob@^2.0.2:
+  version "2.2.7"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
+  integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==
+  dependencies:
+    "@mrmlnc/readdir-enhanced" "^2.2.1"
+    "@nodelib/fs.stat" "^1.1.2"
+    glob-parent "^3.1.0"
+    is-glob "^4.0.0"
+    merge2 "^1.2.3"
+    micromatch "^3.1.10"
+
+fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.5:
   version "3.2.7"
   resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
   integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
@@ -2743,6 +3932,16 @@ filelist@^1.0.1:
   dependencies:
     minimatch "^3.0.4"
 
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
 fill-range@^7.0.1:
   version "7.0.1"
   resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
@@ -2759,6 +3958,15 @@ find-cache-dir@^2.0.0:
     make-dir "^2.0.0"
     pkg-dir "^3.0.0"
 
+find-cache-dir@^3.3.1:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
+  integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^3.0.2"
+    pkg-dir "^4.1.0"
+
 find-up@3.0.0, find-up@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
@@ -2773,7 +3981,7 @@ find-up@^2.1.0:
   dependencies:
     locate-path "^2.0.0"
 
-find-up@^4.1.0:
+find-up@^4.0.0, find-up@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
   integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
@@ -2819,11 +4027,25 @@ follow-redirects@^1.14.0:
   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379"
   integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==
 
+for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+  integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
 forever-agent@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
   integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
 
+form-data@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+  integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.8"
+    mime-types "^2.1.12"
+
 form-data@~2.3.2:
   version "2.3.3"
   resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
@@ -2833,6 +4055,13 @@ form-data@~2.3.2:
     combined-stream "^1.0.6"
     mime-types "^2.1.12"
 
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+  dependencies:
+    map-cache "^0.2.2"
+
 fs-extra@^10.0.0:
   version "10.0.0"
   resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1"
@@ -2851,6 +4080,13 @@ fs-extra@^8.1.0:
     jsonfile "^4.0.0"
     universalify "^0.1.0"
 
+fs-minipass@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+  integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+  dependencies:
+    minipass "^3.0.0"
+
 fs.realpath@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@@ -2920,6 +4156,11 @@ get-stream@^5.1.0:
   dependencies:
     pump "^3.0.0"
 
+get-stream@^6.0.0:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+  integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
 get-symbol-description@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
@@ -2940,6 +4181,11 @@ get-uri@3:
     fs-extra "^8.1.0"
     ftp "^0.3.10"
 
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+  integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
 getpass@^0.1.1:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
@@ -2947,6 +4193,14 @@ getpass@^0.1.1:
   dependencies:
     assert-plus "^1.0.0"
 
+glob-parent@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
 glob-parent@^5.1.2, glob-parent@~5.1.2:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@@ -2954,6 +4208,16 @@ glob-parent@^5.1.2, glob-parent@~5.1.2:
   dependencies:
     is-glob "^4.0.1"
 
+glob-to-regexp@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+  integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
+
+glob-to-regexp@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
+  integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+
 glob@7.1.3:
   version "7.1.3"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
@@ -2966,7 +4230,7 @@ glob@7.1.3:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-glob@^7.1.2, glob@^7.1.3, glob@^7.2.0:
+glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0:
   version "7.2.0"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
   integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
@@ -3013,6 +4277,20 @@ globals@^13.6.0, globals@^13.9.0:
   dependencies:
     type-fest "^0.20.2"
 
+globby@^10.0.1:
+  version "10.0.2"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
+  integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
+  dependencies:
+    "@types/glob" "^7.1.1"
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.0.3"
+    glob "^7.1.3"
+    ignore "^5.1.1"
+    merge2 "^1.2.3"
+    slash "^3.0.0"
+
 globby@^11.0.1, globby@^11.0.3:
   version "11.0.4"
   resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5"
@@ -3025,6 +4303,19 @@ globby@^11.0.1, globby@^11.0.3:
     merge2 "^1.3.0"
     slash "^3.0.0"
 
+globby@^8.0.1:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d"
+  integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==
+  dependencies:
+    array-union "^1.0.1"
+    dir-glob "2.0.0"
+    fast-glob "^2.0.2"
+    glob "^7.1.2"
+    ignore "^3.3.5"
+    pify "^3.0.0"
+    slash "^1.0.0"
+
 globjoin@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
@@ -3037,7 +4328,7 @@ gonzales-pe@^4.3.0:
   dependencies:
     minimist "^1.2.5"
 
-graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4:
   version "4.2.8"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
   integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
@@ -3097,7 +4388,38 @@ has-tostringtag@^1.0.0:
   dependencies:
     has-symbols "^1.0.2"
 
-has@^1.0.3:
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+  dependencies:
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
+
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+  dependencies:
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
+
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+  integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+has@^1.0.0, has@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
   integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
@@ -3109,6 +4431,11 @@ he@1.2.0:
   resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
   integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
 
+hex-color-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+  integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+
 hosted-git-info@^2.1.4:
   version "2.8.9"
   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
@@ -3121,6 +4448,23 @@ hosted-git-info@^4.0.1:
   dependencies:
     lru-cache "^6.0.0"
 
+hsl-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+  integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
+
+hsla-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+  integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
+
+html-encoding-sniffer@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9"
+  integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==
+  dependencies:
+    whatwg-encoding "^2.0.0"
+
 html-tags@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
@@ -3158,6 +4502,15 @@ http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1:
     agent-base "6"
     debug "4"
 
+http-proxy-agent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43"
+  integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==
+  dependencies:
+    "@tootallnate/once" "2"
+    agent-base "6"
+    debug "4"
+
 http-signature@~1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
@@ -3175,6 +4528,11 @@ https-proxy-agent@5, https-proxy-agent@^5.0.0:
     agent-base "6"
     debug "4"
 
+human-signals@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+  integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
 iconv-lite@0.4.24:
   version "0.4.24"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -3182,16 +4540,48 @@ iconv-lite@0.4.24:
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
+iconv-lite@0.6.3:
+  version "0.6.3"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+  integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3.0.0"
+
+ignore@^3.3.5:
+  version "3.3.10"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+  integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
+
 ignore@^4.0.6:
   version "4.0.6"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
+ignore@^5.1.1:
+  version "5.1.9"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb"
+  integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==
+
 ignore@^5.1.4, ignore@^5.1.8:
   version "5.1.8"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
   integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
 
+import-cwd@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
+  integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=
+  dependencies:
+    import-from "^2.1.0"
+
+import-fresh@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
+  integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
+  dependencies:
+    caller-path "^2.0.0"
+    resolve-from "^3.0.0"
+
 import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@@ -3200,11 +4590,26 @@ import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0:
     parent-module "^1.0.0"
     resolve-from "^4.0.0"
 
+import-from@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
+  integrity sha1-M1238qev/VOqpHHUuAId7ja387E=
+  dependencies:
+    resolve-from "^3.0.0"
+
 import-lazy@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153"
   integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==
 
+import-local@^3.0.2:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0"
+  integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==
+  dependencies:
+    pkg-dir "^4.2.0"
+    resolve-cwd "^3.0.0"
+
 imurmurhash@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
@@ -3220,6 +4625,11 @@ indexes-of@^1.0.1:
   resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
   integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
 
+infer-owner@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+  integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+
 inflight@^1.0.4:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@@ -3228,7 +4638,7 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -3247,6 +4657,16 @@ internal-slot@^1.0.3:
     has "^1.0.3"
     side-channel "^1.0.4"
 
+interpret@^1.0.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
+  integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
+
+interpret@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
+  integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
+
 ip-regex@^4.1.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5"
@@ -3257,6 +4677,25 @@ ip@^1.1.5:
   resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
   integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
 
+is-absolute-url@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+  integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
+
+is-accessor-descriptor@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+  dependencies:
+    kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+  dependencies:
+    kind-of "^6.0.0"
+
 is-alphabetical@^1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
@@ -3275,6 +4714,11 @@ is-arrayish@^0.2.1:
   resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
   integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
 
+is-arrayish@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+  integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
 is-bigint@^1.0.1:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
@@ -3297,6 +4741,11 @@ is-boolean-object@^1.1.0:
     call-bind "^1.0.2"
     has-tostringtag "^1.0.0"
 
+is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+  integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
 is-buffer@^2.0.0, is-buffer@~2.0.3:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
@@ -3307,6 +4756,18 @@ is-callable@^1.1.4, is-callable@^1.2.4:
   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
   integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
 
+is-color-stop@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
+  integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
+  dependencies:
+    css-color-names "^0.0.4"
+    hex-color-regex "^1.1.0"
+    hsl-regex "^1.0.0"
+    hsla-regex "^1.0.0"
+    rgb-regex "^1.0.1"
+    rgba-regex "^1.0.0"
+
 is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.7.0:
   version "2.8.0"
   resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
@@ -3314,6 +4775,20 @@ is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.7.0:
   dependencies:
     has "^1.0.3"
 
+is-data-descriptor@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+  dependencies:
+    kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+  dependencies:
+    kind-of "^6.0.0"
+
 is-date-object@^1.0.1:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
@@ -3326,7 +4801,42 @@ is-decimal@^1.0.0:
   resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
   integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
 
-is-extglob@^2.1.1:
+is-descriptor@^0.1.0:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+  dependencies:
+    is-accessor-descriptor "^0.1.6"
+    is-data-descriptor "^0.1.4"
+    kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+  dependencies:
+    is-accessor-descriptor "^1.0.0"
+    is-data-descriptor "^1.0.0"
+    kind-of "^6.0.2"
+
+is-directory@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+  integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+  integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+  dependencies:
+    is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
   integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
@@ -3341,6 +4851,13 @@ is-fullwidth-code-point@^3.0.0:
   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
   integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
 
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
+  dependencies:
+    is-extglob "^2.1.0"
+
 is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
@@ -3370,6 +4887,13 @@ is-number-object@^1.0.4:
   dependencies:
     has-tostringtag "^1.0.0"
 
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+  dependencies:
+    kind-of "^3.0.2"
+
 is-number@^7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@@ -3385,7 +4909,7 @@ is-path-cwd@^2.2.0:
   resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
   integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
 
-is-path-inside@^3.0.2:
+is-path-inside@^3.0.1, is-path-inside@^3.0.2:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
   integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
@@ -3400,13 +4924,18 @@ is-plain-obj@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
   integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
 
-is-plain-object@^2.0.4:
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
   integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
   dependencies:
     isobject "^3.0.1"
 
+is-potential-custom-element-name@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
+  integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
 is-regex@^1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
@@ -3420,11 +4949,21 @@ is-regexp@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d"
   integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==
 
+is-resolvable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+  integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
 is-shared-array-buffer@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6"
   integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==
 
+is-stream@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+  integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
 is-string@^1.0.5, is-string@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
@@ -3461,6 +5000,11 @@ is-weakref@^1.0.1:
   dependencies:
     call-bind "^1.0.0"
 
+is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
 is2@^2.0.6:
   version "2.0.7"
   resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.7.tgz#d084e10cab3bd45d6c9dfde7a48599fcbb93fcac"
@@ -3475,12 +5019,24 @@ isarray@0.0.1:
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
   integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
 
+isarray@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+  integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
 isexe@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
   integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
 
-isobject@^3.0.1:
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+  dependencies:
+    isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
   integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
@@ -3500,6 +5056,29 @@ jake@^10.6.1:
     filelist "^1.0.1"
     minimatch "^3.0.4"
 
+javascript-stringify@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3"
+  integrity sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=
+
+jest-worker@^26.2.1:
+  version "26.6.2"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
+  integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
+  dependencies:
+    "@types/node" "*"
+    merge-stream "^2.0.0"
+    supports-color "^7.0.0"
+
+jest-worker@^27.0.6:
+  version "27.3.1"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.3.1.tgz#0def7feae5b8042be38479799aeb7b5facac24b2"
+  integrity sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==
+  dependencies:
+    "@types/node" "*"
+    merge-stream "^2.0.0"
+    supports-color "^8.0.0"
+
 "joyride@https://github.com/zurb/joyride/archive/refs/heads/v2.1.tar.gz":
   version "0.0.0"
   resolved "https://github.com/zurb/joyride/archive/refs/heads/v2.1.tar.gz#a2149b220318565de072ed0c956310cd7c30c7d7"
@@ -3554,6 +5133,39 @@ jsbn@~0.1.0:
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
   integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
 
+jsdom@^18.0.1:
+  version "18.0.1"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-18.0.1.tgz#7317c91be425f31ff25814ad427eed8a2a310b61"
+  integrity sha512-mgVzrYP4IJiJKVqXkAdBn+jg+nQgPusBxTJulz3m1Y/1RIrkk8aDoNaQE5BNbHwe72WwiwE7k3Av2THXDpvzPQ==
+  dependencies:
+    abab "^2.0.5"
+    acorn "^8.5.0"
+    acorn-globals "^6.0.0"
+    cssom "^0.5.0"
+    cssstyle "^2.3.0"
+    data-urls "^3.0.1"
+    decimal.js "^10.3.1"
+    domexception "^4.0.0"
+    escodegen "^2.0.0"
+    form-data "^4.0.0"
+    html-encoding-sniffer "^3.0.0"
+    http-proxy-agent "^5.0.0"
+    https-proxy-agent "^5.0.0"
+    is-potential-custom-element-name "^1.0.1"
+    nwsapi "^2.2.0"
+    parse5 "6.0.1"
+    saxes "^5.0.1"
+    symbol-tree "^3.2.4"
+    tough-cookie "^4.0.0"
+    w3c-hr-time "^1.0.2"
+    w3c-xmlserializer "^3.0.0"
+    webidl-conversions "^7.0.0"
+    whatwg-encoding "^2.0.0"
+    whatwg-mimetype "^3.0.0"
+    whatwg-url "^10.0.0"
+    ws "^8.2.3"
+    xml-name-validator "^4.0.0"
+
 jsesc@^2.5.1:
   version "2.5.2"
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
@@ -3564,6 +5176,11 @@ jsesc@~0.5.0:
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
   integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
 
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+  integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
 json-parse-even-better-errors@^2.3.0:
   version "2.3.1"
   resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
@@ -3642,7 +5259,26 @@ jsprim@^1.2.2:
     array-includes "^3.1.3"
     object.assign "^4.1.2"
 
-kind-of@^6.0.2, kind-of@^6.0.3:
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+  integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
   version "6.0.3"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
   integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
@@ -3685,6 +5321,29 @@ lines-and-columns@^1.1.6:
   resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
   integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
 
+loader-runner@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
+  integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==
+
+loader-utils@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
+  integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
+  dependencies:
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^1.0.1"
+
+loader-utils@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129"
+  integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==
+  dependencies:
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^2.1.2"
+
 loadjs@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/loadjs/-/loadjs-4.2.0.tgz#2a0336376397a6a43edf98c9ec3229ddd5abb6f6"
@@ -3720,6 +5379,11 @@ locate-path@^6.0.0:
   dependencies:
     p-locate "^5.0.0"
 
+lodash-es@^4.17.11, lodash-es@^4.17.15:
+  version "4.17.21"
+  resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
+  integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
 lodash._arraycopy@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1"
@@ -3818,6 +5482,11 @@ lodash.keys@^3.0.0:
     lodash.isarguments "^3.0.0"
     lodash.isarray "^3.0.0"
 
+lodash.memoize@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+  integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+
 lodash.merge@^4.6.2:
   version "4.6.2"
   resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
@@ -3828,6 +5497,11 @@ lodash.truncate@^4.4.2:
   resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
   integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
 
+lodash.uniq@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+  integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
+
 lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21:
   version "4.17.21"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@@ -3889,13 +5563,18 @@ make-dir@^2.0.0, make-dir@^2.1.0:
     pify "^4.0.1"
     semver "^5.6.0"
 
-make-dir@^3.0.0:
+make-dir@^3.0.0, make-dir@^3.0.2:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
   integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
   dependencies:
     semver "^6.0.0"
 
+map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+  integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
 map-obj@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
@@ -3906,6 +5585,13 @@ map-obj@^4.0.0:
   resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a"
   integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==
 
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+  dependencies:
+    object-visit "^1.0.0"
+
 mathml-tag-names@^2.1.3:
   version "2.1.3"
   resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
@@ -3939,6 +5625,16 @@ mdast-util-to-string@^2.0.0:
   resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b"
   integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==
 
+mdn-data@2.0.14:
+  version "2.0.14"
+  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
+  integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
+
+mdn-data@2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
+  integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
+
 meow@^9.0.0:
   version "9.0.0"
   resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364"
@@ -3957,7 +5653,12 @@ meow@^9.0.0:
     type-fest "^0.18.0"
     yargs-parser "^20.2.3"
 
-merge2@^1.3.0:
+merge-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+  integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.2.3, merge2@^1.3.0:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
   integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
@@ -3970,6 +5671,25 @@ micromark@~2.11.0:
     debug "^4.0.0"
     parse-entities "^2.0.0"
 
+micromatch@^3.1.10:
+  version "3.1.10"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+  integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.3.1"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    extglob "^2.0.4"
+    fragment-cache "^0.2.1"
+    kind-of "^6.0.2"
+    nanomatch "^1.2.9"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.2"
+
 micromatch@^4.0.4:
   version "4.0.4"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
@@ -3983,6 +5703,11 @@ mime-db@1.50.0:
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f"
   integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==
 
+mime-db@1.51.0:
+  version "1.51.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
+  integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
+
 mime-types@^2.1.12, mime-types@~2.1.19:
   version "2.1.33"
   resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb"
@@ -3990,6 +5715,13 @@ mime-types@^2.1.12, mime-types@~2.1.19:
   dependencies:
     mime-db "1.50.0"
 
+mime-types@^2.1.27:
+  version "2.1.34"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
+  integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
+  dependencies:
+    mime-db "1.51.0"
+
 mime@^2.3.1:
   version "2.5.2"
   resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
@@ -4026,6 +5758,50 @@ minimist@^1.2.0, minimist@^1.2.2, minimist@^1.2.5:
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
   integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
 
+minipass-collect@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
+  integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass-flush@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
+  integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass-pipeline@^1.2.2:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
+  integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass@^3.0.0, minipass@^3.1.1:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732"
+  integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==
+  dependencies:
+    yallist "^4.0.0"
+
+minizlib@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+  integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+  dependencies:
+    minipass "^3.0.0"
+    yallist "^4.0.0"
+
+mixin-deep@^1.2.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+  integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
 mkdirp@0.5.4:
   version "0.5.4"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512"
@@ -4033,14 +5809,14 @@ mkdirp@0.5.4:
   dependencies:
     minimist "^1.2.5"
 
-mkdirp@^0.5.0:
+mkdirp@^0.5.0, mkdirp@~0.5.1:
   version "0.5.5"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
   integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
   dependencies:
     minimist "^1.2.5"
 
-mkdirp@^1.0.4:
+mkdirp@^1.0.3, mkdirp@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
   integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
@@ -4104,11 +5880,33 @@ mute-stream@0.0.8:
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
   integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 
+nanomatch@^1.2.9:
+  version "1.2.13"
+  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+  integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
 natural-compare@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
   integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
 
+neo-async@^2.6.2:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+  integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
 netmask@^2.0.1:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
@@ -4193,16 +5991,40 @@ normalize-selector@^0.2.0:
   resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03"
   integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=
 
+normalize-url@^3.0.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
+  integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
+
 normalize.css@^8.0.1:
   version "8.0.1"
   resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3"
   integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==
 
+npm-run-path@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+  integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+  dependencies:
+    path-key "^3.0.0"
+
+nth-check@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+  integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+  dependencies:
+    boolbase "~1.0.0"
+
 num2fraction@^1.2.2:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
   integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
 
+nwsapi@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
+  integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
+
 oauth-sign@~0.9.0:
   version "0.9.0"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
@@ -4213,6 +6035,15 @@ object-assign@^4.1.1:
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
   integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
 
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+  dependencies:
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
+
 object-inspect@^1.11.0, object-inspect@^1.9.0:
   version "1.11.0"
   resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
@@ -4223,6 +6054,13 @@ object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
   resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
   integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
 
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+  dependencies:
+    isobject "^3.0.0"
+
 object.assign@4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
@@ -4261,7 +6099,7 @@ object.fromentries@^2.0.4:
     define-properties "^1.1.3"
     es-abstract "^1.19.1"
 
-object.getownpropertydescriptors@^2.0.3:
+object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0:
   version "2.1.3"
   resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e"
   integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==
@@ -4278,7 +6116,14 @@ object.hasown@^1.0.0:
     define-properties "^1.1.3"
     es-abstract "^1.19.1"
 
-object.values@^1.1.4, object.values@^1.1.5:
+object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+  dependencies:
+    isobject "^3.0.1"
+
+object.values@^1.1.0, object.values@^1.1.4, object.values@^1.1.5:
   version "1.1.5"
   resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac"
   integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==
@@ -4294,7 +6139,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
   dependencies:
     wrappy "1"
 
-onetime@^5.1.0:
+onetime@^5.1.0, onetime@^5.1.2:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
   integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
@@ -4388,6 +6233,13 @@ p-locate@^5.0.0:
   dependencies:
     p-limit "^3.0.2"
 
+p-map@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
+  integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
+  dependencies:
+    aggregate-error "^3.0.0"
+
 p-map@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
@@ -4455,6 +6307,14 @@ parse-entities@^2.0.0:
     is-decimal "^1.0.0"
     is-hexadecimal "^1.0.0"
 
+parse-json@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+  integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
+  dependencies:
+    error-ex "^1.3.1"
+    json-parse-better-errors "^1.0.1"
+
 parse-json@^5.0.0:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
@@ -4465,6 +6325,21 @@ parse-json@^5.0.0:
     json-parse-even-better-errors "^2.3.0"
     lines-and-columns "^1.1.6"
 
+parse5@6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+  integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+  integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+  integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
+
 path-exists@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
@@ -4480,7 +6355,7 @@ path-is-absolute@^1.0.0:
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
   integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
 
-path-key@^3.1.0:
+path-key@^3.0.0, path-key@^3.1.0:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
   integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
@@ -4490,6 +6365,13 @@ path-parse@^1.0.6:
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
   integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
 
+path-type@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+  integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
+  dependencies:
+    pify "^3.0.0"
+
 path-type@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
@@ -4530,6 +6412,11 @@ pify@^2.3.0:
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
   integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
 
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+  integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
+
 pify@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
@@ -4556,6 +6443,23 @@ pkg-dir@^3.0.0:
   dependencies:
     find-up "^3.0.0"
 
+pkg-dir@^4.1.0, pkg-dir@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+  integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+  dependencies:
+    find-up "^4.0.0"
+
+pofile@^1.0.9:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/pofile/-/pofile-1.1.1.tgz#a581df04a6fae4941eebd7c1211dbd43700c5541"
+  integrity sha512-RVAzFGo1Mx9+YukVKSgTLut6r4ZVBW8IVrqGHAPfEsVJN93WSp5HRD6+qNa7av1q/joPKDNJd55m5AJl9GBQGA==
+
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+  integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
 postcss-attribute-case-insensitive@^4.0.1:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880"
@@ -4615,6 +6519,25 @@ postcss-color-rebeccapurple@^4.0.1:
     postcss "^7.0.2"
     postcss-values-parser "^2.0.0"
 
+postcss-colormin@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
+  integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
+  dependencies:
+    browserslist "^4.0.0"
+    color "^3.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-convert-values@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
+  integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
+  dependencies:
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
 postcss-custom-media@^7.0.8:
   version "7.0.8"
   resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c"
@@ -4646,6 +6569,34 @@ postcss-dir-pseudo-class@^5.0.0:
     postcss "^7.0.2"
     postcss-selector-parser "^5.0.0-rc.3"
 
+postcss-discard-comments@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
+  integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-discard-duplicates@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
+  integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-discard-empty@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
+  integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-discard-overridden@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
+  integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
+  dependencies:
+    postcss "^7.0.0"
+
 postcss-double-position-gradients@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e"
@@ -4713,7 +6664,7 @@ postcss-image-set-function@^3.0.1:
     postcss "^7.0.2"
     postcss-values-parser "^2.0.0"
 
-postcss-import@^12.0.1:
+postcss-import@^12.0.0, postcss-import@^12.0.1:
   version "12.0.1"
   resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153"
   integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==
@@ -4730,6 +6681,14 @@ postcss-initial@^3.0.0:
   dependencies:
     postcss "^7.0.2"
 
+postcss-js@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-2.0.3.tgz#a96f0f23ff3d08cec7dc5b11bf11c5f8077cdab9"
+  integrity sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==
+  dependencies:
+    camelcase-css "^2.0.1"
+    postcss "^7.0.18"
+
 postcss-lab-function@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e"
@@ -4744,33 +6703,214 @@ postcss-less@^3.1.4:
   resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad"
   integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==
   dependencies:
-    postcss "^7.0.14"
+    postcss "^7.0.14"
+
+postcss-load-config@^2.0.0:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a"
+  integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==
+  dependencies:
+    cosmiconfig "^5.0.0"
+    import-cwd "^2.0.0"
+
+postcss-loader@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d"
+  integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==
+  dependencies:
+    loader-utils "^1.1.0"
+    postcss "^7.0.0"
+    postcss-load-config "^2.0.0"
+    schema-utils "^1.0.0"
+
+postcss-logical@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5"
+  integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==
+  dependencies:
+    postcss "^7.0.2"
+
+postcss-media-minmax@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5"
+  integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==
+  dependencies:
+    postcss "^7.0.2"
+
+postcss-media-query-parser@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
+  integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=
+
+postcss-merge-longhand@^4.0.11:
+  version "4.0.11"
+  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
+  integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
+  dependencies:
+    css-color-names "0.0.4"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+    stylehacks "^4.0.0"
+
+postcss-merge-rules@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
+  integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
+  dependencies:
+    browserslist "^4.0.0"
+    caniuse-api "^3.0.0"
+    cssnano-util-same-parent "^4.0.0"
+    postcss "^7.0.0"
+    postcss-selector-parser "^3.0.0"
+    vendors "^1.0.0"
+
+postcss-minify-font-values@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
+  integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
+  dependencies:
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-minify-gradients@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
+  integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
+  dependencies:
+    cssnano-util-get-arguments "^4.0.0"
+    is-color-stop "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-minify-params@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
+  integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
+  dependencies:
+    alphanum-sort "^1.0.0"
+    browserslist "^4.0.0"
+    cssnano-util-get-arguments "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+    uniqs "^2.0.0"
+
+postcss-minify-selectors@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
+  integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
+  dependencies:
+    alphanum-sort "^1.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-selector-parser "^3.0.0"
+
+postcss-mixins@^6.2.0:
+  version "6.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-mixins/-/postcss-mixins-6.2.3.tgz#021893ba455d04b5baa052bf196297ddd70e4af1"
+  integrity sha512-gfH5d09YilzDn/CLGFA9Lwv7GTezuyHgnAyXC8AfvhUMpl67ZTewhcpNuOgawClCOD+76XePE2IHO1xMgsOlvA==
+  dependencies:
+    globby "^8.0.1"
+    postcss "^7.0.21"
+    postcss-js "^2.0.3"
+    postcss-simple-vars "^5.0.2"
+    sugarss "^2.0.0"
+
+postcss-nesting@^7.0.0:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052"
+  integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==
+  dependencies:
+    postcss "^7.0.2"
+
+postcss-normalize-charset@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
+  integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-normalize-display-values@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
+  integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
+  dependencies:
+    cssnano-util-get-match "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-positions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
+  integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
+  dependencies:
+    cssnano-util-get-arguments "^4.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-repeat-style@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
+  integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
+  dependencies:
+    cssnano-util-get-arguments "^4.0.0"
+    cssnano-util-get-match "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-string@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
+  integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
+  dependencies:
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-timing-functions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
+  integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
+  dependencies:
+    cssnano-util-get-match "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
 
-postcss-logical@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5"
-  integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==
+postcss-normalize-unicode@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
+  integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
   dependencies:
-    postcss "^7.0.2"
+    browserslist "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
 
-postcss-media-minmax@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5"
-  integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==
+postcss-normalize-url@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
+  integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
   dependencies:
-    postcss "^7.0.2"
+    is-absolute-url "^2.0.0"
+    normalize-url "^3.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
 
-postcss-media-query-parser@^0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
-  integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=
+postcss-normalize-whitespace@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
+  integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
+  dependencies:
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
 
-postcss-nesting@^7.0.0:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052"
-  integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==
+postcss-ordered-values@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
+  integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
   dependencies:
-    postcss "^7.0.2"
+    cssnano-util-get-arguments "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
 
 postcss-overflow-shorthand@^2.0.0:
   version "2.0.0"
@@ -4852,6 +6992,26 @@ postcss-pxtorem@^5.1.1:
   dependencies:
     postcss "^7.0.27"
 
+postcss-reduce-initial@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
+  integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
+  dependencies:
+    browserslist "^4.0.0"
+    caniuse-api "^3.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+
+postcss-reduce-transforms@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
+  integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
+  dependencies:
+    cssnano-util-get-match "^4.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
 postcss-replace-overflow-wrap@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c"
@@ -4902,6 +7062,15 @@ postcss-selector-not@^4.0.0:
     balanced-match "^1.0.0"
     postcss "^7.0.2"
 
+postcss-selector-parser@^3.0.0:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270"
+  integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==
+  dependencies:
+    dot-prop "^5.2.0"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
 postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c"
@@ -4919,6 +7088,13 @@ postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.5:
     cssesc "^3.0.0"
     util-deprecate "^1.0.2"
 
+postcss-simple-vars@^5.0.2:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz#e2f81b3d0847ddd4169816b6d141b91d51e6e22e"
+  integrity sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==
+  dependencies:
+    postcss "^7.0.14"
+
 postcss-sorting@^5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/postcss-sorting/-/postcss-sorting-5.0.1.tgz#10d5d0059eea8334dacc820c0121864035bc3f11"
@@ -4927,11 +7103,29 @@ postcss-sorting@^5.0.1:
     lodash "^4.17.14"
     postcss "^7.0.17"
 
+postcss-svgo@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e"
+  integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==
+  dependencies:
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+    svgo "^1.0.0"
+
 postcss-syntax@^0.36.2:
   version "0.36.2"
   resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c"
   integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==
 
+postcss-unique-selectors@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
+  integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
+  dependencies:
+    alphanum-sort "^1.0.0"
+    postcss "^7.0.0"
+    uniqs "^2.0.0"
+
 postcss-url@^8.0.0:
   version "8.0.0"
   resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-8.0.0.tgz#7b10059bd12929cdbb1971c60f61a0e5af86b4ca"
@@ -4943,7 +7137,7 @@ postcss-url@^8.0.0:
     postcss "^7.0.2"
     xxhashjs "^0.2.1"
 
-postcss-value-parser@^3.2.3:
+postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3:
   version "3.3.1"
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
   integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
@@ -4962,7 +7156,7 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
     indexes-of "^1.0.1"
     uniq "^1.0.1"
 
-postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.18, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6:
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.18, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6:
   version "7.0.39"
   resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
   integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
@@ -4997,6 +7191,11 @@ progress@^2.0.0:
   resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
   integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
 
+promise-inflight@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+  integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+
 prop-types@^15.7.2:
   version "15.7.2"
   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
@@ -5025,7 +7224,7 @@ proxy-from-env@^1.0.0, proxy-from-env@^1.1.0:
   resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
   integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
 
-psl@^1.1.28:
+psl@^1.1.28, psl@^1.1.33:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
   integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
@@ -5043,6 +7242,11 @@ punycode@^2.1.0, punycode@^2.1.1:
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
   integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
 
+q@^1.1.2:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+  integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+
 qs@~6.5.2:
   version "6.5.2"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
@@ -5058,6 +7262,13 @@ quick-lru@^4.0.1:
   resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
   integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
 
+randombytes@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+  integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+  dependencies:
+    safe-buffer "^5.1.0"
+
 raw-body@^2.2.0:
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
@@ -5068,6 +7279,14 @@ raw-body@^2.2.0:
     iconv-lite "0.4.24"
     unpipe "1.0.0"
 
+raw-loader@^4.0.1, raw-loader@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6"
+  integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==
+  dependencies:
+    loader-utils "^2.0.0"
+    schema-utils "^3.0.0"
+
 react-is@^16.8.1:
   version "16.13.1"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
@@ -5109,7 +7328,7 @@ readable-stream@1.1.x:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-readable-stream@^3.1.1:
+"readable-stream@2 || 3", readable-stream@^3.1.1:
   version "3.6.0"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
   integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -5125,6 +7344,20 @@ readdirp@~3.6.0:
   dependencies:
     picomatch "^2.2.1"
 
+rechoir@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+  integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
+  dependencies:
+    resolve "^1.1.6"
+
+rechoir@^0.7.0:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686"
+  integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==
+  dependencies:
+    resolve "^1.9.0"
+
 redent@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
@@ -5157,6 +7390,14 @@ regenerator-transform@^0.14.2:
   dependencies:
     "@babel/runtime" "^7.8.4"
 
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+  dependencies:
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
+
 regexp.prototype.flags@^1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
@@ -5217,6 +7458,11 @@ remark@^13.0.0:
     remark-stringify "^9.0.0"
     unified "^9.1.0"
 
+repeat-element@^1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+  integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
 repeat-string@^1.0.0, repeat-string@^1.6.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
@@ -5280,6 +7526,18 @@ require-main-filename@^2.0.0:
   resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
   integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
 
+resolve-cwd@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+  integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+  dependencies:
+    resolve-from "^5.0.0"
+
+resolve-from@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+  integrity sha1-six699nWiBvItuZTM17rywoYh0g=
+
 resolve-from@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
@@ -5297,7 +7555,12 @@ resolve-global@^1.0.0:
   dependencies:
     global-dirs "^0.1.1"
 
-resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0:
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0:
   version "1.20.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
   integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
@@ -5321,12 +7584,27 @@ restore-cursor@^3.1.0:
     onetime "^5.1.0"
     signal-exit "^3.0.2"
 
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+  integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
 reusify@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-rimraf@^3.0.2:
+rgb-regex@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+  integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
+
+rgba-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+  integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
+
+rimraf@^3.0.0, rimraf@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
   integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
@@ -5340,7 +7618,7 @@ run-parallel@^1.1.9:
   dependencies:
     queue-microtask "^1.2.2"
 
-safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
   integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -5350,11 +7628,57 @@ safe-buffer@~5.1.1:
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+  dependencies:
+    ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 
+sax@~1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+saxes@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d"
+  integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==
+  dependencies:
+    xmlchars "^2.2.0"
+
+schema-utils@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
+  integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
+  dependencies:
+    ajv "^6.1.0"
+    ajv-errors "^1.0.0"
+    ajv-keywords "^3.1.0"
+
+schema-utils@^2.6.6, schema-utils@^2.7.0:
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
+  integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
+  dependencies:
+    "@types/json-schema" "^7.0.5"
+    ajv "^6.12.4"
+    ajv-keywords "^3.5.2"
+
+schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
+  integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
+  dependencies:
+    "@types/json-schema" "^7.0.8"
+    ajv "^6.12.5"
+    ajv-keywords "^3.5.2"
+
 "semver@2 || 3 || 4 || 5", semver@^5.6.0, semver@^5.7.0:
   version "5.7.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
@@ -5370,18 +7694,42 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
-semver@^7.2.1, semver@^7.3.4:
+semver@^7.2.1, semver@^7.3.4, semver@^7.3.5:
   version "7.3.5"
   resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
   integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
   dependencies:
     lru-cache "^6.0.0"
 
+serialize-javascript@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
+  integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
+  dependencies:
+    randombytes "^2.1.0"
+
+serialize-javascript@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
+  integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
+  dependencies:
+    randombytes "^2.1.0"
+
 set-blocking@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
   integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
 
+set-value@^2.0.0, set-value@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+  integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
+
 setprototypeof@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
@@ -5406,6 +7754,15 @@ shebang-regex@^3.0.0:
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
   integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
 
+shelljs@^0.8.1:
+  version "0.8.4"
+  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2"
+  integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==
+  dependencies:
+    glob "^7.0.0"
+    interpret "^1.0.0"
+    rechoir "^0.6.2"
+
 shepherd.js@^8.3.1:
   version "8.3.1"
   resolved "https://registry.yarnpkg.com/shepherd.js/-/shepherd.js-8.3.1.tgz#131eeefc5eb2bc44c9e23d0da139db46b2b55339"
@@ -5424,11 +7781,23 @@ side-channel@^1.0.4:
     get-intrinsic "^1.0.2"
     object-inspect "^1.9.0"
 
-signal-exit@^3.0.2:
+signal-exit@^3.0.2, signal-exit@^3.0.3:
   version "3.0.5"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f"
   integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==
 
+simple-swizzle@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+  integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
+  dependencies:
+    is-arrayish "^0.3.1"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+  integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+
 slash@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
@@ -5453,6 +7822,36 @@ smoothscroll-polyfill@^0.4.4:
   resolved "https://registry.yarnpkg.com/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz#3a259131dc6930e6ca80003e1cb03b603b69abf8"
   integrity sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==
 
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+  dependencies:
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+  dependencies:
+    kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+  integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+  dependencies:
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^3.1.0"
+
 socks-proxy-agent@5, socks-proxy-agent@^5.0.0:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e"
@@ -5475,7 +7874,23 @@ sortablejs@^1.13.0:
   resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.14.0.tgz#6d2e17ccbdb25f464734df621d4f35d4ab35b3d8"
   integrity sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==
 
-source-map-support@^0.5.16, source-map-support@~0.5.20:
+source-list-map@^2.0.0, source-list-map@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+  integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-resolve@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+  integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+  dependencies:
+    atob "^2.1.2"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
+source-map-support@^0.5.16, source-map-support@~0.5.12, source-map-support@~0.5.20:
   version "0.5.20"
   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9"
   integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==
@@ -5483,7 +7898,12 @@ source-map-support@^0.5.16, source-map-support@~0.5.20:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
 
-source-map@^0.5.0:
+source-map-url@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+  integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.0, source-map@^0.5.6:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
   integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@@ -5529,6 +7949,13 @@ specificity@^0.4.1:
   resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019"
   integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==
 
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+  dependencies:
+    extend-shallow "^3.0.0"
+
 sprintf-js@~1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
@@ -5549,6 +7976,26 @@ sshpk@^1.7.0:
     safer-buffer "^2.0.2"
     tweetnacl "~0.14.0"
 
+ssri@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af"
+  integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==
+  dependencies:
+    minipass "^3.1.1"
+
+stable@^0.1.8:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+  integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
 "statuses@>= 1.5.0 < 2":
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
@@ -5653,6 +8100,11 @@ strip-bom@^3.0.0:
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
   integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
 
+strip-final-newline@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+  integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
 strip-indent@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
@@ -5670,11 +8122,28 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
   integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
 
+style-loader@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e"
+  integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==
+  dependencies:
+    loader-utils "^2.0.0"
+    schema-utils "^2.7.0"
+
 style-search@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
   integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=
 
+stylehacks@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
+  integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
+  dependencies:
+    browserslist "^4.0.0"
+    postcss "^7.0.0"
+    postcss-selector-parser "^3.0.0"
+
 stylelint-checkstyle-formatter@^0.1.1:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/stylelint-checkstyle-formatter/-/stylelint-checkstyle-formatter-0.1.2.tgz#a127d97d352ec0e98229945db9768a65e1a89ca5"
@@ -5778,18 +8247,49 @@ supports-color@^5.3.0:
   dependencies:
     has-flag "^3.0.0"
 
-supports-color@^7.1.0:
+supports-color@^7.0.0, supports-color@^7.1.0:
   version "7.2.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
   integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
   dependencies:
     has-flag "^4.0.0"
 
+supports-color@^8.0.0:
+  version "8.1.1"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+  integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+  dependencies:
+    has-flag "^4.0.0"
+
 svg-tags@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
   integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
 
+svgo@^1.0.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
+  integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==
+  dependencies:
+    chalk "^2.4.1"
+    coa "^2.0.2"
+    css-select "^2.0.0"
+    css-select-base-adapter "^0.1.1"
+    css-tree "1.0.0-alpha.37"
+    csso "^4.0.2"
+    js-yaml "^3.13.1"
+    mkdirp "~0.5.1"
+    object.values "^1.1.0"
+    sax "~1.2.4"
+    stable "^0.1.8"
+    unquote "~1.1.1"
+    util.promisify "~1.0.0"
+
+symbol-tree@^3.2.4:
+  version "3.2.4"
+  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+  integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
 tabbable@^5.2.0:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.2.1.tgz#e3fda7367ddbb172dcda9f871c0fdb36d1c4cd9c"
@@ -5807,6 +8307,23 @@ table@^6.0.9, table@^6.6.0:
     string-width "^4.2.3"
     strip-ansi "^6.0.1"
 
+tapable@^2.1.1, tapable@^2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
+  integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+
+tar@^6.0.2:
+  version "6.1.11"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
+  integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
+  dependencies:
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    minipass "^3.0.0"
+    minizlib "^2.1.1"
+    mkdirp "^1.0.3"
+    yallist "^4.0.0"
+
 tcp-port-used@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.2.tgz#9652b7436eb1f4cfae111c79b558a25769f6faea"
@@ -5815,7 +8332,42 @@ tcp-port-used@^1.0.1:
     debug "4.3.1"
     is2 "^2.0.6"
 
-terser@^5.3.4:
+terser-webpack-plugin@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.1.0.tgz#91e6d39571460ed240c0cf69d295bcf30ebf98cb"
+  integrity sha512-cjdZte66fYkZ65rQ2oJfrdCAkkhJA7YLYk5eGOcGCSGlq0ieZupRdjedSQXYknMPo2IveQL+tPdrxUkERENCFA==
+  dependencies:
+    cacache "^15.0.5"
+    find-cache-dir "^3.3.1"
+    jest-worker "^26.2.1"
+    p-limit "^3.0.2"
+    schema-utils "^2.6.6"
+    serialize-javascript "^4.0.0"
+    source-map "^0.6.1"
+    terser "^4.8.0"
+    webpack-sources "^1.4.3"
+
+terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.0:
+  version "5.2.5"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz#ce65b9880a0c36872555c4874f45bbdb02ee32c9"
+  integrity sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==
+  dependencies:
+    jest-worker "^27.0.6"
+    schema-utils "^3.1.1"
+    serialize-javascript "^6.0.0"
+    source-map "^0.6.1"
+    terser "^5.7.2"
+
+terser@^4.8.0:
+  version "4.8.0"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
+  integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
+  dependencies:
+    commander "^2.20.0"
+    source-map "~0.6.1"
+    source-map-support "~0.5.12"
+
+terser@^5.3.4, terser@^5.7.2:
   version "5.9.0"
   resolved "https://registry.yarnpkg.com/terser/-/terser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351"
   integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==
@@ -5829,11 +8381,39 @@ text-table@^0.2.0:
   resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
   integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
 
+through2@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4"
+  integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==
+  dependencies:
+    inherits "^2.0.4"
+    readable-stream "2 || 3"
+
+timsort@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+  integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+
 to-fast-properties@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
   integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
 
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+  dependencies:
+    kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+  dependencies:
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+
 to-regex-range@^5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
@@ -5841,6 +8421,16 @@ to-regex-range@^5.0.1:
   dependencies:
     is-number "^7.0.0"
 
+to-regex@^3.0.1, to-regex@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
 toidentifier@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
@@ -5854,6 +8444,22 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0:
     psl "^1.1.28"
     punycode "^2.1.1"
 
+tough-cookie@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
+  integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
+  dependencies:
+    psl "^1.1.33"
+    punycode "^2.1.1"
+    universalify "^0.1.2"
+
+tr46@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9"
+  integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==
+  dependencies:
+    punycode "^2.1.1"
+
 trim-newlines@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
@@ -5987,11 +8593,40 @@ unified@^9.1.0:
     trough "^1.0.0"
     vfile "^4.0.0"
 
+union-value@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+  integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^2.0.1"
+
 uniq@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
   integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
 
+uniqs@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+  integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
+
+unique-filename@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+  integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+  dependencies:
+    unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
+  integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+  dependencies:
+    imurmurhash "^0.1.4"
+
 unique-string@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
@@ -6018,7 +8653,7 @@ unist-util-stringify-position@^2.0.0:
   dependencies:
     "@types/unist" "^2.0.2"
 
-universalify@^0.1.0:
+universalify@^0.1.0, universalify@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
   integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
@@ -6033,6 +8668,19 @@ unpipe@1.0.0:
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
   integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
 
+unquote@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+  integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
+
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
 uri-js@^4.2.2:
   version "4.4.1"
   resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
@@ -6040,11 +8688,31 @@ uri-js@^4.2.2:
   dependencies:
     punycode "^2.1.0"
 
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+  integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+use@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+  integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
 util-deprecate@^1.0.1, util-deprecate@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
   integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
 
+util.promisify@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee"
+  integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.2"
+    has-symbols "^1.0.1"
+    object.getownpropertydescriptors "^2.1.0"
+
 uuid@^3.3.2:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
@@ -6063,6 +8731,11 @@ validate-npm-package-license@^3.0.1:
     spdx-correct "^3.0.0"
     spdx-expression-parse "^3.0.0"
 
+vendors@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
+  integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
+
 verror@1.10.0:
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
@@ -6100,6 +8773,28 @@ vscode-uri@^3.0.2:
   resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.2.tgz#ecfd1d066cb8ef4c3a208decdbab9a8c23d055d0"
   integrity sha512-jkjy6pjU1fxUvI51P+gCsxg1u2n8LSt0W6KrCNQceaziKzff74GoWmjVG46KieVzybO1sttPQmYfrwSHey7GUA==
 
+w3c-hr-time@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
+  integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
+  dependencies:
+    browser-process-hrtime "^1.0.0"
+
+w3c-xmlserializer@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923"
+  integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==
+  dependencies:
+    xml-name-validator "^4.0.0"
+
+watchpack@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce"
+  integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==
+  dependencies:
+    glob-to-regexp "^0.4.1"
+    graceful-fs "^4.1.2"
+
 wcwidth@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
@@ -6107,6 +8802,108 @@ wcwidth@^1.0.1:
   dependencies:
     defaults "^1.0.3"
 
+webidl-conversions@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
+  integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
+
+webpack-cli@^4.4.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.1.tgz#b64be825e2d1b130f285c314caa3b1ba9a4632b3"
+  integrity sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==
+  dependencies:
+    "@discoveryjs/json-ext" "^0.5.0"
+    "@webpack-cli/configtest" "^1.1.0"
+    "@webpack-cli/info" "^1.4.0"
+    "@webpack-cli/serve" "^1.6.0"
+    colorette "^2.0.14"
+    commander "^7.0.0"
+    execa "^5.0.0"
+    fastest-levenshtein "^1.0.12"
+    import-local "^3.0.2"
+    interpret "^2.2.0"
+    rechoir "^0.7.0"
+    webpack-merge "^5.7.3"
+
+webpack-merge@^5.7.3:
+  version "5.8.0"
+  resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61"
+  integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==
+  dependencies:
+    clone-deep "^4.0.1"
+    wildcard "^2.0.0"
+
+webpack-sources@^1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
+  integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.6.1"
+
+webpack-sources@^2.0.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd"
+  integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==
+  dependencies:
+    source-list-map "^2.0.1"
+    source-map "^0.6.1"
+
+webpack-sources@^3.2.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.1.tgz#251a7d9720d75ada1469ca07dbb62f3641a05b6d"
+  integrity sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==
+
+webpack@^5.51.1:
+  version "5.63.0"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.63.0.tgz#4b074115800e0526d85112985e46c64b95e04aaf"
+  integrity sha512-HYrw6bkj/MDmphAXvqLEvn2fVoDZsYu6O638WjK6lSNgIpjb5jl/KtOrqJyU9EC/ZV9mLUmZW5h4mASB+CVA4A==
+  dependencies:
+    "@types/eslint-scope" "^3.7.0"
+    "@types/estree" "^0.0.50"
+    "@webassemblyjs/ast" "1.11.1"
+    "@webassemblyjs/wasm-edit" "1.11.1"
+    "@webassemblyjs/wasm-parser" "1.11.1"
+    acorn "^8.4.1"
+    acorn-import-assertions "^1.7.6"
+    browserslist "^4.14.5"
+    chrome-trace-event "^1.0.2"
+    enhanced-resolve "^5.8.3"
+    es-module-lexer "^0.9.0"
+    eslint-scope "5.1.1"
+    events "^3.2.0"
+    glob-to-regexp "^0.4.1"
+    graceful-fs "^4.2.4"
+    json-parse-better-errors "^1.0.2"
+    loader-runner "^4.2.0"
+    mime-types "^2.1.27"
+    neo-async "^2.6.2"
+    schema-utils "^3.1.0"
+    tapable "^2.1.1"
+    terser-webpack-plugin "^5.1.3"
+    watchpack "^2.2.0"
+    webpack-sources "^3.2.0"
+
+whatwg-encoding@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53"
+  integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==
+  dependencies:
+    iconv-lite "0.6.3"
+
+whatwg-mimetype@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7"
+  integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==
+
+whatwg-url@^10.0.0:
+  version "10.0.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da"
+  integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==
+  dependencies:
+    tr46 "^3.0.0"
+    webidl-conversions "^7.0.0"
+
 which-boxed-primitive@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
@@ -6144,6 +8941,11 @@ wide-align@1.1.3:
   dependencies:
     string-width "^1.0.2 || 2"
 
+wildcard@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
+  integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
+
 word-wrap@^1.2.3, word-wrap@~1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
@@ -6173,11 +8975,26 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3:
     signal-exit "^3.0.2"
     typedarray-to-buffer "^3.1.5"
 
+ws@^8.2.3:
+  version "8.2.3"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"
+  integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==
+
 xdg-basedir@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
   integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
 
+xml-name-validator@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
+  integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
+
+xmlchars@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+  integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
 xregexp@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"