@ckeditor/ckeditor5-image 40.0.0 → 40.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -25
- package/LICENSE.md +3 -3
- package/build/image.js +2 -2
- package/build/translations/ar.js +1 -1
- package/build/translations/ast.js +1 -1
- package/build/translations/az.js +1 -1
- package/build/translations/bg.js +1 -1
- package/build/translations/bn.js +1 -1
- package/build/translations/bs.js +1 -1
- package/build/translations/ca.js +1 -1
- package/build/translations/cs.js +1 -1
- package/build/translations/da.js +1 -1
- package/build/translations/de-ch.js +1 -1
- package/build/translations/de.js +1 -1
- package/build/translations/el.js +1 -1
- package/build/translations/en-au.js +1 -1
- package/build/translations/en-gb.js +1 -1
- package/build/translations/eo.js +1 -1
- package/build/translations/es.js +1 -1
- package/build/translations/et.js +1 -1
- package/build/translations/eu.js +1 -1
- package/build/translations/fa.js +1 -1
- package/build/translations/fi.js +1 -1
- package/build/translations/fr.js +1 -1
- package/build/translations/gl.js +1 -1
- package/build/translations/he.js +1 -1
- package/build/translations/hi.js +1 -1
- package/build/translations/hr.js +1 -1
- package/build/translations/hu.js +1 -1
- package/build/translations/id.js +1 -1
- package/build/translations/it.js +1 -1
- package/build/translations/ja.js +1 -1
- package/build/translations/jv.js +1 -1
- package/build/translations/km.js +1 -1
- package/build/translations/kn.js +1 -1
- package/build/translations/ko.js +1 -1
- package/build/translations/ku.js +1 -1
- package/build/translations/lt.js +1 -1
- package/build/translations/lv.js +1 -1
- package/build/translations/ms.js +1 -1
- package/build/translations/nb.js +1 -1
- package/build/translations/ne.js +1 -1
- package/build/translations/nl.js +1 -1
- package/build/translations/no.js +1 -1
- package/build/translations/pl.js +1 -1
- package/build/translations/pt-br.js +1 -1
- package/build/translations/pt.js +1 -1
- package/build/translations/ro.js +1 -1
- package/build/translations/ru.js +1 -1
- package/build/translations/si.js +1 -1
- package/build/translations/sk.js +1 -1
- package/build/translations/sq.js +1 -1
- package/build/translations/sr-latn.js +1 -1
- package/build/translations/sr.js +1 -1
- package/build/translations/sv.js +1 -1
- package/build/translations/th.js +1 -1
- package/build/translations/tk.js +1 -1
- package/build/translations/tr.js +1 -1
- package/build/translations/tt.js +1 -1
- package/build/translations/ug.js +1 -1
- package/build/translations/uk.js +1 -1
- package/build/translations/ur.js +1 -1
- package/build/translations/uz.js +1 -1
- package/build/translations/vi.js +1 -1
- package/build/translations/zh-cn.js +1 -1
- package/build/translations/zh.js +1 -1
- package/ckeditor5-metadata.json +3 -3
- package/lang/contexts.json +5 -0
- package/lang/translations/ar.po +20 -0
- package/lang/translations/ast.po +20 -0
- package/lang/translations/az.po +20 -0
- package/lang/translations/bg.po +20 -0
- package/lang/translations/bn.po +20 -0
- package/lang/translations/bs.po +20 -0
- package/lang/translations/ca.po +20 -0
- package/lang/translations/cs.po +20 -0
- package/lang/translations/da.po +20 -0
- package/lang/translations/de-ch.po +20 -0
- package/lang/translations/de.po +20 -0
- package/lang/translations/el.po +20 -0
- package/lang/translations/en-au.po +20 -0
- package/lang/translations/en-gb.po +20 -0
- package/lang/translations/en.po +20 -0
- package/lang/translations/eo.po +20 -0
- package/lang/translations/es.po +20 -0
- package/lang/translations/et.po +20 -0
- package/lang/translations/eu.po +20 -0
- package/lang/translations/fa.po +20 -0
- package/lang/translations/fi.po +20 -0
- package/lang/translations/fr.po +20 -0
- package/lang/translations/gl.po +20 -0
- package/lang/translations/he.po +20 -0
- package/lang/translations/hi.po +20 -0
- package/lang/translations/hr.po +20 -0
- package/lang/translations/hu.po +20 -0
- package/lang/translations/id.po +20 -0
- package/lang/translations/it.po +20 -0
- package/lang/translations/ja.po +20 -0
- package/lang/translations/jv.po +20 -0
- package/lang/translations/km.po +20 -0
- package/lang/translations/kn.po +20 -0
- package/lang/translations/ko.po +20 -0
- package/lang/translations/ku.po +20 -0
- package/lang/translations/lt.po +20 -0
- package/lang/translations/lv.po +20 -0
- package/lang/translations/ms.po +20 -0
- package/lang/translations/nb.po +20 -0
- package/lang/translations/ne.po +20 -0
- package/lang/translations/nl.po +20 -0
- package/lang/translations/no.po +20 -0
- package/lang/translations/pl.po +20 -0
- package/lang/translations/pt-br.po +20 -0
- package/lang/translations/pt.po +20 -0
- package/lang/translations/ro.po +20 -0
- package/lang/translations/ru.po +20 -0
- package/lang/translations/si.po +20 -0
- package/lang/translations/sk.po +20 -0
- package/lang/translations/sq.po +20 -0
- package/lang/translations/sr-latn.po +20 -0
- package/lang/translations/sr.po +20 -0
- package/lang/translations/sv.po +20 -0
- package/lang/translations/th.po +20 -0
- package/lang/translations/tk.po +20 -0
- package/lang/translations/tr.po +20 -0
- package/lang/translations/tt.po +20 -0
- package/lang/translations/ug.po +21 -1
- package/lang/translations/uk.po +20 -0
- package/lang/translations/ur.po +20 -0
- package/lang/translations/uz.po +20 -0
- package/lang/translations/vi.po +20 -0
- package/lang/translations/zh-cn.po +20 -0
- package/lang/translations/zh.po +20 -0
- package/package.json +3 -3
- package/src/augmentation.d.ts +56 -56
- package/src/augmentation.js +5 -5
- package/src/autoimage.d.ts +52 -52
- package/src/autoimage.js +132 -132
- package/src/image/converters.d.ts +66 -66
- package/src/image/converters.js +232 -232
- package/src/image/imageblockediting.d.ts +59 -58
- package/src/image/imageblockediting.js +153 -152
- package/src/image/imageediting.d.ts +30 -30
- package/src/image/imageediting.js +63 -63
- package/src/image/imageinlineediting.d.ts +60 -59
- package/src/image/imageinlineediting.js +177 -176
- package/src/image/imageloadobserver.d.ts +48 -48
- package/src/image/imageloadobserver.js +52 -52
- package/src/image/imageplaceholder.d.ts +39 -0
- package/src/image/imageplaceholder.js +113 -0
- package/src/image/imagetypecommand.d.ts +44 -44
- package/src/image/imagetypecommand.js +80 -80
- package/src/image/insertimagecommand.d.ts +66 -66
- package/src/image/insertimagecommand.js +120 -120
- package/src/image/replaceimagesourcecommand.d.ts +51 -34
- package/src/image/replaceimagesourcecommand.js +75 -44
- package/src/image/ui/utils.d.ts +25 -25
- package/src/image/ui/utils.js +44 -44
- package/src/image/utils.d.ts +64 -64
- package/src/image/utils.js +121 -121
- package/src/image.d.ts +34 -34
- package/src/image.js +38 -38
- package/src/imageblock.d.ts +34 -33
- package/src/imageblock.js +38 -37
- package/src/imagecaption/imagecaptionediting.d.ts +89 -89
- package/src/imagecaption/imagecaptionediting.js +225 -225
- package/src/imagecaption/imagecaptionui.d.ts +26 -26
- package/src/imagecaption/imagecaptionui.js +61 -61
- package/src/imagecaption/imagecaptionutils.d.ts +38 -38
- package/src/imagecaption/imagecaptionutils.js +62 -62
- package/src/imagecaption/toggleimagecaptioncommand.d.ts +66 -66
- package/src/imagecaption/toggleimagecaptioncommand.js +138 -138
- package/src/imagecaption.d.ts +26 -26
- package/src/imagecaption.js +30 -30
- package/src/imageconfig.d.ts +712 -713
- package/src/imageconfig.js +5 -5
- package/src/imageinline.d.ts +34 -33
- package/src/imageinline.js +38 -37
- package/src/imageinsert/imageinsertui.d.ts +72 -44
- package/src/imageinsert/imageinsertui.js +174 -141
- package/src/imageinsert/imageinsertviaurlui.d.ts +44 -0
- package/src/imageinsert/imageinsertviaurlui.js +122 -0
- package/src/imageinsert/ui/imageinsertformview.d.ts +56 -0
- package/src/imageinsert/ui/imageinsertformview.js +112 -0
- package/src/imageinsert/ui/imageinserturlview.d.ts +107 -0
- package/src/imageinsert/ui/imageinserturlview.js +156 -0
- package/src/imageinsert.d.ts +33 -33
- package/src/imageinsert.js +37 -37
- package/src/imageinsertviaurl.d.ts +31 -30
- package/src/imageinsertviaurl.js +35 -34
- package/src/imageresize/imageresizebuttons.d.ts +67 -67
- package/src/imageresize/imageresizebuttons.js +217 -217
- package/src/imageresize/imageresizeediting.d.ts +37 -37
- package/src/imageresize/imageresizeediting.js +165 -165
- package/src/imageresize/imageresizehandles.d.ts +31 -31
- package/src/imageresize/imageresizehandles.js +114 -114
- package/src/imageresize/resizeimagecommand.d.ts +42 -42
- package/src/imageresize/resizeimagecommand.js +63 -63
- package/src/imageresize.d.ts +27 -27
- package/src/imageresize.js +31 -31
- package/src/imagesizeattributes.d.ts +34 -34
- package/src/imagesizeattributes.js +142 -143
- package/src/imagestyle/converters.d.ts +24 -24
- package/src/imagestyle/converters.js +79 -79
- package/src/imagestyle/imagestylecommand.d.ts +68 -68
- package/src/imagestyle/imagestylecommand.js +107 -107
- package/src/imagestyle/imagestyleediting.d.ts +50 -50
- package/src/imagestyle/imagestyleediting.js +108 -108
- package/src/imagestyle/imagestyleui.d.ts +56 -56
- package/src/imagestyle/imagestyleui.js +192 -192
- package/src/imagestyle/utils.d.ts +101 -101
- package/src/imagestyle/utils.js +329 -329
- package/src/imagestyle.d.ts +32 -32
- package/src/imagestyle.js +36 -36
- package/src/imagetextalternative/imagetextalternativecommand.d.ts +34 -34
- package/src/imagetextalternative/imagetextalternativecommand.js +44 -44
- package/src/imagetextalternative/imagetextalternativeediting.d.ts +28 -28
- package/src/imagetextalternative/imagetextalternativeediting.js +35 -35
- package/src/imagetextalternative/imagetextalternativeui.d.ts +68 -68
- package/src/imagetextalternative/imagetextalternativeui.js +173 -173
- package/src/imagetextalternative/ui/textalternativeformview.d.ts +90 -72
- package/src/imagetextalternative/ui/textalternativeformview.js +121 -121
- package/src/imagetextalternative.d.ts +29 -29
- package/src/imagetextalternative.js +33 -33
- package/src/imagetoolbar.d.ts +35 -35
- package/src/imagetoolbar.js +57 -57
- package/src/imageupload/imageuploadediting.d.ts +111 -111
- package/src/imageupload/imageuploadediting.js +337 -337
- package/src/imageupload/imageuploadprogress.d.ts +42 -42
- package/src/imageupload/imageuploadprogress.js +211 -211
- package/src/imageupload/imageuploadui.d.ts +23 -23
- package/src/imageupload/imageuploadui.js +81 -57
- package/src/imageupload/uploadimagecommand.d.ts +60 -60
- package/src/imageupload/uploadimagecommand.js +100 -100
- package/src/imageupload/utils.d.ts +33 -33
- package/src/imageupload/utils.js +112 -112
- package/src/imageupload.d.ts +32 -32
- package/src/imageupload.js +36 -36
- package/src/imageutils.d.ts +125 -125
- package/src/imageutils.js +306 -306
- package/src/index.d.ts +48 -48
- package/src/index.js +39 -39
- package/src/pictureediting.d.ts +88 -88
- package/src/pictureediting.js +130 -130
- package/theme/imageinsert.css +5 -17
- package/theme/imageplaceholder.css +10 -0
- package/build/image.js.map +0 -1
- package/src/imageinsert/ui/imageinsertformrowview.d.ts +0 -61
- package/src/imageinsert/ui/imageinsertformrowview.js +0 -54
- package/src/imageinsert/ui/imageinsertpanelview.d.ts +0 -106
- package/src/imageinsert/ui/imageinsertpanelview.js +0 -161
- package/src/imageinsert/utils.d.ts +0 -25
- package/src/imageinsert/utils.js +0 -58
- package/theme/imageinsertformrowview.css +0 -36
package/build/image.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://CKEditor5.image/./theme/image.css","webpack://CKEditor5.image/./theme/imagecaption.css","webpack://CKEditor5.image/./theme/imageinsert.css","webpack://CKEditor5.image/./theme/imageinsertformrowview.css","webpack://CKEditor5.image/./theme/imageresize.css","webpack://CKEditor5.image/./theme/imagestyle.css","webpack://CKEditor5.image/./theme/imageuploadicon.css","webpack://CKEditor5.image/./theme/imageuploadloader.css","webpack://CKEditor5.image/./theme/imageuploadprogress.css","webpack://CKEditor5.image/./theme/textalternativeform.css","webpack://CKEditor5.image/../ckeditor5-ui/theme/components/responsive-form/responsiveform.css","webpack://CKEditor5.image/../node_modules/css-loader/dist/runtime/api.js","webpack://CKEditor5.image/../node_modules/css-loader/dist/runtime/cssWithMappingToString.js","webpack://CKEditor5.image/./theme/image.css?5f89","webpack://CKEditor5.image/./theme/imagecaption.css?9138","webpack://CKEditor5.image/./theme/imageinsert.css?059f","webpack://CKEditor5.image/./theme/imageinsertformrowview.css?b408","webpack://CKEditor5.image/./theme/imageresize.css?4eef","webpack://CKEditor5.image/./theme/imagestyle.css?a9b2","webpack://CKEditor5.image/./theme/imageuploadicon.css?80b6","webpack://CKEditor5.image/./theme/imageuploadloader.css?22b6","webpack://CKEditor5.image/./theme/imageuploadprogress.css?7beb","webpack://CKEditor5.image/./theme/textalternativeform.css?0574","webpack://CKEditor5.image/../ckeditor5-ui/theme/components/responsive-form/responsiveform.css?643e","webpack://CKEditor5.image/../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://CKEditor5.image/./src/autoimage.js","webpack://CKEditor5.image/./src/image.js","webpack://CKEditor5.image/./src/image/converters.js","webpack://CKEditor5.image/./src/image/imageblockediting.js","webpack://CKEditor5.image/./src/image/imageediting.js","webpack://CKEditor5.image/./src/image/imageinlineediting.js","webpack://CKEditor5.image/./src/image/imageloadobserver.js","webpack://CKEditor5.image/./src/image/imagetypecommand.js","webpack://CKEditor5.image/./src/image/insertimagecommand.js","webpack://CKEditor5.image/./src/image/ui/utils.js","webpack://CKEditor5.image/./src/image/utils.js","webpack://CKEditor5.image/./src/imageblock.js","webpack://CKEditor5.image/./src/imagecaption.js","webpack://CKEditor5.image/./src/imagecaption/imagecaptionediting.js","webpack://CKEditor5.image/./src/imagecaption/imagecaptionui.js","webpack://CKEditor5.image/./src/imagecaption/imagecaptionutils.js","webpack://CKEditor5.image/./src/imagecaption/toggleimagecaptioncommand.js","webpack://CKEditor5.image/./src/imageinline.js","webpack://CKEditor5.image/./src/imageinsert.js","webpack://CKEditor5.image/./src/imageinsert/imageinsertui.js","webpack://CKEditor5.image/./src/imageinsert/ui/imageinsertformrowview.js","webpack://CKEditor5.image/./src/imageinsert/ui/imageinsertpanelview.js","webpack://CKEditor5.image/./src/imageinsert/utils.js","webpack://CKEditor5.image/./src/imageinsertviaurl.js","webpack://CKEditor5.image/./src/imageresize.js","webpack://CKEditor5.image/./src/imageresize/imageresizebuttons.js","webpack://CKEditor5.image/./src/imageresize/imageresizeediting.js","webpack://CKEditor5.image/./src/imageresize/imageresizehandles.js","webpack://CKEditor5.image/./src/imageresize/resizeimagecommand.js","webpack://CKEditor5.image/./src/imagestyle.js","webpack://CKEditor5.image/./src/imagestyle/converters.js","webpack://CKEditor5.image/./src/imagestyle/imagestylecommand.js","webpack://CKEditor5.image/./src/imagestyle/imagestyleediting.js","webpack://CKEditor5.image/./src/imagestyle/imagestyleui.js","webpack://CKEditor5.image/./src/imagestyle/utils.js","webpack://CKEditor5.image/./src/imagetextalternative.js","webpack://CKEditor5.image/./src/imagetextalternative/imagetextalternativecommand.js","webpack://CKEditor5.image/./src/imagetextalternative/imagetextalternativeediting.js","webpack://CKEditor5.image/./src/imagetextalternative/imagetextalternativeui.js","webpack://CKEditor5.image/./src/imagetextalternative/ui/textalternativeformview.js","webpack://CKEditor5.image/./src/imagetoolbar.js","webpack://CKEditor5.image/./src/imageupload.js","webpack://CKEditor5.image/./src/imageupload/imageuploadediting.js","webpack://CKEditor5.image/./src/imageupload/imageuploadprogress.js","webpack://CKEditor5.image/./src/imageupload/imageuploadui.js","webpack://CKEditor5.image/./src/imageupload/uploadimagecommand.js","webpack://CKEditor5.image/./src/imageupload/utils.js","webpack://CKEditor5.image/./src/imageutils.js","webpack://CKEditor5.image/./src/pictureediting.js","webpack://CKEditor5.image/delegated \"./src/clipboard.js\" from dll-reference CKEditor5.dll","webpack://CKEditor5.image/delegated \"./src/core.js\" from dll-reference CKEditor5.dll","webpack://CKEditor5.image/delegated \"./src/engine.js\" from dll-reference CKEditor5.dll","webpack://CKEditor5.image/delegated \"./src/typing.js\" from dll-reference CKEditor5.dll","webpack://CKEditor5.image/delegated \"./src/ui.js\" from dll-reference CKEditor5.dll","webpack://CKEditor5.image/delegated \"./src/undo.js\" from dll-reference CKEditor5.dll","webpack://CKEditor5.image/delegated \"./src/upload.js\" from dll-reference CKEditor5.dll","webpack://CKEditor5.image/delegated \"./src/utils.js\" from dll-reference CKEditor5.dll","webpack://CKEditor5.image/delegated \"./src/widget.js\" from dll-reference CKEditor5.dll","webpack://CKEditor5.image/external var \"CKEditor5.dll\"","webpack://CKEditor5.image/javascript/node_modules/lodash-es/identity.js","webpack://CKEditor5.image/javascript/node_modules/lodash-es/isObject.js","webpack://CKEditor5.image/webpack/bootstrap","webpack://CKEditor5.image/webpack/runtime/compat get default export","webpack://CKEditor5.image/webpack/runtime/define property getters","webpack://CKEditor5.image/webpack/runtime/hasOwnProperty shorthand","webpack://CKEditor5.image/webpack/runtime/make namespace object","webpack://CKEditor5.image/webpack/runtime/nonce","webpack://CKEditor5.image/./src/index.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAC4H;AAC7B;AAC/F,8BAA8B,mFAA2B,CAAC,wGAAqC;AAC/F;AACA,6DAA6D,WAAW,cAAc,iBAAiB,eAAe,kBAAkB,uBAAuB,cAAc,cAAc,eAAe,eAAe,0BAA0B,uBAAuB,oBAAoB,eAAe,kCAAkC,aAAa,gEAAgE,YAAY,cAAc,eAAe,gEAAgE,gBAAgB,qBAAqB,sBAAsB,uBAAuB,mBAAmB,2GAA2G,UAAU,qEAAqE,aAAa,0FAA0F,eAAe,OAAO,0lBAA0lB,cAAc,qBAAqB,kBAAkB,yBAAyB,oUAAoU,8IAA8I,eAAe,iGAAiG,yGAAyG,sIAAsI,sKAAsK,KAAK,uBAAuB,8FAA8F,aAAa,oQAAoQ,uHAAuH,sJAAsJ,yHAAyH,sBAAsB,OAAO,yGAAyG,iIAAiI,uBAAuB,2HAA2H,OAAO,KAAK,GAAG,6BAA6B,8VAA8V,4BAA4B,6BAA6B,mMAAmM,uBAAuB,8BAA8B,KAAK,8LAA8L,iBAAiB,KAAK,0CAA0C,iBAAiB,sQAAsQ,sBAAsB,OAAO,KAAK,2KAA2K,2BAA2B,wBAAwB,OAAO,KAAK,GAAG,qBAAqB;AACnsK;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;;ACPvC;AAC4H;AAC7B;AAC/F,8BAA8B,mFAA2B,CAAC,wGAAqC;AAC/F;AACA,gDAAgD,4CAA4C,mCAAmC,oDAAoD,8BAA8B,0DAA0D,oBAAoB,yCAAyC,sBAAsB,gBAAgB,oBAAoB,aAAa,sBAAsB,qEAAqE,kDAAkD,sCAAsC,GAAG,qEAAqE,GAAG,2DAA2D,OAAO,2eAA2e,yDAAyD,mDAAmD,wEAAwE,GAAG,2DAA2D,2BAA2B,yBAAyB,2BAA2B,8CAA8C,+DAA+D,kBAAkB,qBAAqB,yBAAyB,GAAG,kGAAkG,uDAAuD,GAAG,2CAA2C,QAAQ,4EAA4E,KAAK,YAAY,iEAAiE,KAAK,GAAG,qBAAqB;AACrjE;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;;ACPvC;AAC4H;AAC7B;AAC/F,8BAA8B,mFAA2B,CAAC,wGAAqC;AAC/F;AACA,qEAAqE,gCAAgC,sCAAsC,sBAAsB,sCAAsC,cAAc,uCAAuC,WAAW,oDAAoD,YAAY,SAAS,UAAU,OAAO,uaAAua,qCAAqC,GAAG,2CAA2C,mBAAmB,gBAAgB,4CAA4C,sCAAsC,2CAA2C,GAAG,oHAAoH,eAAe,cAAc,iBAAiB,GAAG,qBAAqB;AACxrC;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;;ACPvC;AAC4H;AAC7B;AAC/F,8BAA8B,mFAA2B,CAAC,wGAAqC;AAC/F;AACA,yEAAyE,aAAa,iBAAiB,aAAa,mBAAmB,iBAAiB,8BAA8B,iCAAiC,YAAY,kDAAkD,sCAAsC,sIAAsI,uBAAuB,+EAA+E,2BAA2B,OAAO,ocAAoc,aAAa,sFAAsF,KAAK,GAAG,sBAAsB,kBAAkB,wBAAwB,sBAAsB,mCAAmC,iFAAiF,mBAAmB,KAAK,0CAA0C,6CAA6C,qDAAqD,gCAAgC,OAAO,wCAAwC,oCAAoC,OAAO,KAAK,GAAG,qBAAqB;AAC7nD;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;;ACPvC;AAC4H;AAC7B;AAC/F,8BAA8B,mFAA2B,CAAC,wGAAqC;AAC/F;AACA,2EAA2E,sBAAsB,cAAc,eAAe,qCAAqC,WAAW,4CAA4C,cAAc,sHAAsH,eAAe,oFAAoF,wCAAwC,oFAAoF,uCAAuC,oEAAoE,UAAU,OAAO,icAAic,oBAAoB,iXAAiX,2BAA2B,aAAa,8GAA8G,KAAK,sBAAsB,4GAA4G,KAAK,GAAG,6BAA6B,mKAAmK,yCAAyC,wBAAwB,OAAO,KAAK,GAAG,6FAA6F,6CAA6C,GAAG,6FAA6F,4CAA4C,GAAG,yEAAyE,eAAe,GAAG,qBAAqB;AAC77E;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;;ACPvC;AAC4H;AAC7B;AAC/F,8BAA8B,mFAA2B,CAAC,wGAAqC;AAC/F;AACA,gDAAgD,+BAA+B,sEAAsE,qFAAqF,qDAAqD,yEAAyE,WAAW,8BAA8B,YAAY,0CAA0C,cAAc,oCAAoC,WAAW,2CAA2C,sCAAsC,iBAAiB,kBAAkB,qCAAqC,YAAY,0CAA0C,2CAA2C,iBAAiB,eAAe,0CAA0C,cAAc,kBAAkB,6GAA6G,aAAa,mGAAmG,mDAAmD,gDAAgD,iDAAiD,kDAAkD,kDAAkD,iDAAiD,0lBAA0lB,sDAAsD,8nBAA8nB,aAAa,oVAAoV,4DAA4D,OAAO,gpBAAgpB,oCAAoC,6EAA6E,GAAG,iBAAiB,qVAAqV,4DAA4D,KAAK,sNAAsN,kBAAkB,KAAK,2BAA2B,mBAAmB,iDAAiD,qBAAqB,KAAK,iCAAiC,kBAAkB,kDAAkD,KAAK,mCAAmC,wBAAwB,yBAAyB,KAAK,kCAAkC,mBAAmB,iDAAiD,KAAK,wCAAwC,sBAAsB,wBAAwB,KAAK,uCAAuC,qBAAqB,yBAAyB,KAAK,sNAAsN,oBAAoB,KAAK,uBAAuB,gEAAgE,yDAAyD,4DAA4D,OAAO,kCAAkC,2DAA2D,OAAO,mCAAmC,0DAA0D,OAAO,KAAK,GAAG,wBAAwB,uKAAuK,2CAA2C,6KAA6K,iEAAiE,sBAAsB,0BAA0B,WAAW,SAAS,OAAO,qCAAqC,6KAA6K,uEAAuE,SAAS,OAAO,KAAK,GAAG,qBAAqB;AAC/gN;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;;ACPvC;AAC4H;AAC7B;AAC/F,8BAA8B,mFAA2B,CAAC,wGAAqC;AAC/F;AACA,yEAAyE,kBAAkB,cAAc,kBAAkB,uCAAuC,qCAAqC,UAAU,qCAAqC,aAAa,kBAAkB,MAAM,kCAAkC,gDAAgD,+BAA+B,iCAAiC,6DAA6D,+BAA+B,uBAAuB,2BAA2B,sCAAsC,yEAAyE,wDAAwD,qDAAqD,qFAAqF,UAAU,gBAAgB,oFAAoF,qCAAqC,oBAAoB,uBAAuB,6BAA6B,6CAA6C,uFAAuF,qFAAqF,sBAAsB,SAAS,SAAS,UAAU,QAAQ,oCAAoC,0BAA0B,QAAQ,wCAAwC,GAAG,UAAU,GAAG,WAAW,wCAAwC,GAAG,UAAU,GAAG,WAAW,yCAAyC,GAAG,SAAS,UAAU,QAAQ,IAAI,SAAS,WAAW,GAAG,aAAa,UAAU,YAAY,OAAO,uiCAAuiC,mBAAmB,uBAAuB,2NAA2N,6CAA6C,uBAAuB,eAAe,gBAAgB,oBAAoB,yBAAyB,KAAK,GAAG,0LAA0L,mDAAmD,iEAAiE,sIAAsI,sCAAsC,oEAAoE,GAAG,oCAAoC,eAAe,6DAA6D,+EAA+E,4CAA4C,qCAAqC,mGAAmG,wFAAwF,kNAAkN,2FAA2F,4FAA4F,kGAAkG,oGAAoG,iBAAiB,iBAAiB,gBAAgB,eAAe,6CAA6C,iCAAiC,4FAA4F,8FAA8F,sDAAsD,gCAAgC,6BAA6B,oCAAoC,0IAA0I,KAAK,GAAG,6CAA6C,UAAU,iBAAiB,KAAK,UAAU,iBAAiB,KAAK,GAAG,6CAA6C,UAAU,iBAAiB,KAAK,UAAU,iBAAiB,KAAK,GAAG,8CAA8C,QAAQ,iBAAiB,eAAe,gBAAgB,KAAK,SAAS,mBAAmB,gBAAgB,KAAK,UAAU,iBAAiB,mBAAmB,qBAAqB,KAAK,GAAG,qBAAqB;AAC/vL;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;;ACPvC;AAC4H;AAC7B;AAC/F,8BAA8B,mFAA2B,CAAC,wGAAqC;AAC/F;AACA,4EAA4E,mBAAmB,aAAa,uBAAuB,OAAO,kBAAkB,MAAM,yCAAyC,aAAa,kBAAkB,MAAM,6CAA6C,yCAAyC,+CAA+C,iCAAiC,SAAS,WAAW,8CAA8C,uGAAuG,qCAAqC,6DAA6D,kCAAkC,YAAY,WAAW,yCAAyC,0DAA0D,kBAAkB,mCAAmC,+DAA+D,gDAAgD,+CAA+C,wCAAwC,GAAG,yBAAyB,OAAO,ouBAAouB,uBAAuB,kBAAkB,wBAAwB,4BAA4B,WAAW,YAAY,iBAAiB,kBAAkB,yBAAyB,KAAK,GAAG,0LAA0L,0DAA0D,8CAA8C,oDAAoD,GAAG,sCAAsC,uFAAuF,cAAc,sBAAsB,oHAAoH,KAAK,aAAa,+cAA+c,KAAK,GAAG,uCAAuC,gBAAgB,iBAAiB,iBAAiB,sDAAsD,uDAAuD,yBAAyB,sEAAsE,0CAA0C,iEAAiE,KAAK,GAAG,6CAA6C,QAAQ,kCAAkC,KAAK,GAAG,qBAAqB;AAC1lH;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;;ACPvC;AAC4H;AAC7B;AAC/F,8BAA8B,mFAA2B,CAAC,wGAAqC;AAC/F;AACA,+GAA+G,kBAAkB,uGAAuG,OAAO,kBAAkB,MAAM,yFAAyF,qBAAqB,uGAAuG,iDAAiD,WAAW,qBAAqB,QAAQ,kBAAkB,GAAG,UAAU,GAAG,WAAW,OAAO,kjBAAkjB,kCAAkC,yBAAyB,KAAK,oGAAoG,yBAAyB,aAAa,cAAc,KAAK,GAAG,4MAA4M,kCAAkC,iDAAiD,gCAAgC,OAAO,KAAK,oGAAoG,kBAAkB,eAAe,wDAAwD,8BAA8B,KAAK,GAAG,uBAAuB,WAAW,aAAa,WAAW,aAAa,GAAG,qBAAqB;AACxgE;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;;ACPvC;AAC4H;AAC7B;AAC/F,8BAA8B,mFAA2B,CAAC,wGAAqC;AAC/F;AACA,uEAAuE,aAAa,mBAAmB,iBAAiB,oDAAoD,qBAAqB,uCAAuC,aAAa,oCAAoC,6BAA6B,eAAe,oDAAoD,gBAAgB,wCAAwC,gBAAgB,OAAO,ihBAAihB,kCAAkC,kBAAkB,wBAAwB,sBAAsB,gCAAgC,4BAA4B,KAAK,mBAAmB,oBAAoB,KAAK,6BAA6B,sBAAsB,kCAAkC,yBAAyB,OAAO,sBAAsB,wBAAwB,OAAO,KAAK,GAAG,iNAAiN,0CAA0C,qBAAqB,KAAK,GAAG,qBAAqB;AACvoD;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;;ACPvC;AACkI;AAC7B;AACrG,8BAA8B,mFAA2B,CAAC,wGAAqC;AAC/F;AACA,6EAA6E,YAAY,aAAa,kBAAkB,WAAW,SAAS,QAAQ,UAAU,yCAAyC,aAAa,oCAAoC,wCAAwC,YAAY,aAAa,kBAAkB,WAAW,SAAS,QAAQ,UAAU,8CAA8C,cAAc,qDAAqD,mDAAmD,uBAAuB,gCAAgC,6BAA6B,aAAa,uGAAuG,uCAAuC,oCAAoC,uBAAuB,UAAU,qCAAqC,8CAA8C,yDAAyD,6DAA6D,YAAY,WAAW,4EAA4E,mBAAmB,0DAA0D,mDAAmD,iGAAiG,gBAAgB,mCAAmC,mCAAmC,yHAAyH,iDAAiD,0OAA0O,cAAc,+IAA+I,oDAAoD,OAAO,4/BAA4/B,kCAAkC,cAAc,oBAAoB,eAAe,yBAAyB,kBAAkB,gBAAgB,mBAAmB,iBAAiB,KAAK,sBAAsB,oBAAoB,KAAK,GAAG,4BAA4B,2BAA2B,oBAAoB,kBAAkB,wBAAwB,mBAAmB,6BAA6B,sBAAsB,oBAAoB,uBAAuB,qBAAqB,SAAS,0BAA0B,wBAAwB,SAAS,OAAO,KAAK,GAAG,iNAAiN,0CAA0C,qBAAqB,KAAK,GAAG,4OAA4O,2DAA2D,6DAA6D,wDAAwD,GAAG,4BAA4B,qCAAqC,eAAe,sFAAsF,KAAK,yBAAyB,8BAA8B,gDAAgD,OAAO,KAAK,yBAAyB,6BAA6B,gDAAgD,OAAO,KAAK,6BAA6B,iBAAiB,8CAA8C,kCAAkC,kEAAkE,4BAA4B,uBAAuB,sBAAsB,SAAS,6GAA6G,8BAA8B,SAAS,OAAO,+HAA+H,kBAAkB,8DAA8D,SAAS,OAAO,iFAAiF,4CAA4C,4CAA4C,yBAAyB,yBAAyB,4DAA4D,SAAS,6BAA6B,yBAAyB,SAAS,6BAA6B,yBAAyB,4BAA4B,gEAAgE,WAAW,SAAS,OAAO,KAAK,GAAG,qBAAqB;AACv0L;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;ACP1B;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;;AAEA;AACA,4CAA4C,qBAAqB;AACjE;;AAEA;AACA,KAAK;AACL,KAAK;AACL;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,sBAAsB,iBAAiB;AACvC;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,qBAAqB;AAC1C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;ACjEa;;AAEb,kCAAkC;;AAElC,8BAA8B;;AAE9B,kDAAkD,gBAAgB,gEAAgE,wDAAwD,6DAA6D,sDAAsD;;AAE7S,uCAAuC,uDAAuD,uCAAuC,SAAS,OAAO,oBAAoB;;AAEzK,yCAAyC,8FAA8F,wBAAwB,eAAe,eAAe,gBAAgB,YAAY,MAAM,wBAAwB,+BAA+B,aAAa,qBAAqB,uCAAuC,cAAc,WAAW,YAAY,UAAU,MAAM,mDAAmD,UAAU,sBAAsB;;AAEve,gCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,uDAAuD,cAAc;AACrE;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;ACnC+F;AAC/F,YAA0K;;AAE1K,eAAe,+CAA+C;;AAE9D;AACA;;AAEA,aAAa,0GAAG,CAAC,sJAAO;;;;AAIxB,iEAAe,6JAAc,MAAM;;;;;;;;;;;;;;;;;;ACZ4D;AAC/F,YAAiL;;AAEjL,eAAe,+CAA+C;;AAE9D;AACA;;AAEA,aAAa,0GAAG,CAAC,6JAAO;;;;AAIxB,iEAAe,oKAAc,MAAM;;;;;;;;;;;;;;;;;;ACZ4D;AAC/F,YAAgL;;AAEhL,eAAe,+CAA+C;;AAE9D;AACA;;AAEA,aAAa,0GAAG,CAAC,4JAAO;;;;AAIxB,iEAAe,mKAAc,MAAM;;;;;;;;;;;;;;;;;;ACZ4D;AAC/F,YAA2L;;AAE3L,eAAe,+CAA+C;;AAE9D;AACA;;AAEA,aAAa,0GAAG,CAAC,uKAAO;;;;AAIxB,iEAAe,8KAAc,MAAM;;;;;;;;;;;;;;;;;;ACZ4D;AAC/F,YAAgL;;AAEhL,eAAe,+CAA+C;;AAE9D;AACA;;AAEA,aAAa,0GAAG,CAAC,4JAAO;;;;AAIxB,iEAAe,mKAAc,MAAM;;;;;;;;;;;;;;;;;;ACZ4D;AAC/F,YAA+K;;AAE/K,eAAe,+CAA+C;;AAE9D;AACA;;AAEA,aAAa,0GAAG,CAAC,2JAAO;;;;AAIxB,iEAAe,kKAAc,MAAM;;;;;;;;;;;;;;;;;;ACZ4D;AAC/F,YAAoL;;AAEpL,eAAe,+CAA+C;;AAE9D;AACA;;AAEA,aAAa,0GAAG,CAAC,gKAAO;;;;AAIxB,iEAAe,uKAAc,MAAM;;;;;;;;;;;;;;;;;;ACZ4D;AAC/F,YAAsL;;AAEtL,eAAe,+CAA+C;;AAE9D;AACA;;AAEA,aAAa,0GAAG,CAAC,kKAAO;;;;AAIxB,iEAAe,yKAAc,MAAM;;;;;;;;;;;;;;;;;;ACZ4D;AAC/F,YAAwL;;AAExL,eAAe,+CAA+C;;AAE9D;AACA;;AAEA,aAAa,0GAAG,CAAC,oKAAO;;;;AAIxB,iEAAe,2KAAc,MAAM;;;;;;;;;;;;;;;;;;ACZ4D;AAC/F,YAAwL;;AAExL,eAAe,+CAA+C;;AAE9D;AACA;;AAEA,aAAa,0GAAG,CAAC,oKAAO;;;;AAIxB,iEAAe,2KAAc,MAAM;;;;;;;;;;;;;;;;;;ACZkE;AACrG,YAA+L;;AAE/L,eAAe,+CAA+C;;AAE9D;AACA;;AAEA,aAAa,0GAAG,CAAC,+JAAO;;;;AAIxB,iEAAe,sKAAc,MAAM;;;;;;;;;;;ACZtB;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,wDAAwD;;AAExD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;;AAEA,kBAAkB,wBAAwB;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gBAAgB,KAAwC,GAAG,sBAAiB,GAAG,CAAI;;AAEnF;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA,qEAAqE,qBAAqB,cAAc;;AAExG;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,yDAAyD;AACzD,IAAI;;AAEJ;;;AAGA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;;AAEA;;AAEA,qBAAqB,6BAA6B;AAClD;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;AC5QA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACQ;AACW;AACrB;AACI;AACD;;AAEP;;AAEtC;AACA,4FAA4F;AAC5F;AACA,0BAA0B;AAC1B,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACe,wBAAwB,sDAAM;AAC7C;AACA;AACA;AACA;AACA,WAAW,8DAAS,EAAE,mDAAU,EAAE,oDAAI,EAAE,wDAAM;AAC9C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,+CAA+C;AAC7D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,4BAA4B,2EAAyB;AACrD;;AAEA,6BAA6B,2EAAyB;AACtD;;AAEA;AACA;;AAEA;AACA;AACA,IAAI,IAAI,mBAAmB;AAC3B,IAAI;;AAEJ;AACA;AACA,IAAI,2EAA0B;AAC9B;;AAEA;AACA;AACA;AACA,GAAG,IAAI,mBAAmB;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,+CAA+C;AAC3D,YAAY,+CAA+C;AAC3D;AACA;AACA;AACA;AACA,uBAAuB,2DAAS;AAChC,uCAAuC,yBAAyB;AAChE;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,2BAA2B,2EAAyB;;AAEpD;AACA,oBAAoB,yEAAwB;AAC5C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,8BAA8B,6BAA6B;;AAE3D;AACA;AACA,KAAK;;AAEL;AACA,GAAG;AACH;AACA;;;;;;;;;;;;;;;;;;;;ACpLA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;;AAEN;AACE;;AAEZ;;AAE5B;AACA;AACA;AACA,uCAAuC,sDAAsD;AAC7F;AACA;AACA;AACA,MAAM,yCAAyC;AAC/C,MAAM,2CAA2C;AACjD;AACA,qFAAqF;AACrF;AACA;AACA;AACA;AACe,oBAAoB,sDAAM;AACzC;AACA;AACA;AACA;AACA,WAAW,mDAAU,EAAE,oDAAW;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,qCAAqC;AACtD;AACA,YAAY,gCAAgC;AAC5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,QAAQ,sEAAsE;AAC9E;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACpEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oCAAoC;AAC/C,aAAa;AACb;AACO;AACP;AACA;AACA;;AAEA;AACA;AACA,wDAAwD,+BAA+B;AACvF;AACA;;AAEA;AACA;;AAEA;AACA,kEAAkE,aAAa;AAC/E;AACA;;AAEA;AACA,qDAAqD,+BAA+B;;AAEpF;AACA;;AAEA;AACA,qBAAqB,0DAAK;;AAE1B;AACA;AACA;AACA,qDAAqD,+BAA+B;;AAEpF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oCAAoC;AAC/C,aAAa;AACb;AACO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,6DAA6D,aAAa;AAC1E;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gEAAgE,mBAAmB;AACnF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,gBAAgB,0DAAK;AACrB;;AAEA,0DAA0D,aAAa;;AAEvE;AACA;AACA;AACA,sDAAsD,wCAAwC;AAC9F;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,oCAAoC;AAC/C,WAAW,4BAA4B;AACvC,aAAa;AACb;AACO;AACP;AACA,sCAAsC,WAAW;AACjD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,oCAAoC;AAC/C,aAAa;AACb;AACO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,oCAAoC;AAC/C,WAAW,4BAA4B;AACvC,WAAW,QAAQ;AACnB,aAAa;AACb;AACO;AACP;AACA,+BAA+B,cAAc,IAAI,WAAW;AAC5D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;AC7SA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACgB;AACR;;AAM9B;;AAEoB;AACQ;AACX;AAKf;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,+EAA+E;AACrF;AACA;AACA;AACA;AACe,gCAAgC,sDAAM;AACrD;AACA;AACA;AACA;AACA,WAAW,qDAAY,EAAE,mDAAU,EAAE,sEAAiB;AACtD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;;AAEA;AACA,8CAA8C,yDAAgB;;AAE9D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,SAAS,KAAK,yEAA2B;AACrE,KAAK;;AAEL;AACA;AACA;AACA,4BAA4B,SAAS;AACrC,KAAK,yEAA2B;AAChC;AACA,KAAK;;AAEL;AACA,SAAS,mEAAsB;AAC/B,SAAS,mEAAsB;AAC/B,SAAS,oEAAuB;;AAEhC;AACA;AACA;AACA,UAAU,sEAAwB;AAClC,0BAA0B,SAAS;AACnC;AACA,yCAAyC,uCAAuC;AAChF;AACA,KAAK;AACL,SAAS,8DAAiB;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ,uFAAyC;AACjD,uBAAuB,8DAAY;;AAEnC;AACA;AACA,0DAA0D,gBAAgB;AAC1E;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;;;;;;;;;;;;;;;;;;;ACnLA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACQ;AACE;AACf;;AAEvC;AACA;AACA,IAAI,gEAAgE;AACpE,IAAI,8DAA8D;AAClE;AACA,8BAA8B,8EAA8E;AAC5G;AACA;AACA;AACe,2BAA2B,sDAAM;AAChD;AACA;AACA;AACA;AACA,WAAW,mDAAU;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,0DAAiB;;AAEpD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL,iCAAiC,2DAAkB;;AAEnD;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;ACnFA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACgB;AACR;;AAK9B;;AAEoB;AACQ;AACX;AAKf;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,gFAAgF;AACtF;AACA;AACA;AACA;AACe,iCAAiC,sDAAM;AACtD;AACA;AACA;AACA;AACA,WAAW,qDAAY,EAAE,mDAAU,EAAE,sEAAiB;AACtD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;;AAEA;AACA,+CAA+C,yDAAgB;;AAE/D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC,KAAK;;AAEL;AACA;AACA;AACA,4BAA4B,SAAS;AACrC,KAAK,0EAA4B;AACjC;AACA,KAAK;;AAEL;AACA,SAAS,mEAAsB;AAC/B,SAAS,mEAAsB;AAC/B,SAAS,oEAAuB;;AAEhC;AACA;AACA;AACA,UAAU,sEAAwB;AAClC,0BAA0B,SAAS;AACnC;AACA,yCAAyC,uCAAuC;AAChF;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ,uFAAyC;AACjD,uBAAuB,8DAAY;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA,MAAM;;AAEN;AACA;AACA,IAAI;AACJ;AACA;;;;;;;;;;;;;;;;;AC5MA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEgD;;AAEhD;AACA,yCAAyC,2CAA2C;AACpF,UAAU,8DAA8D;AACxE,IAAI,gEAAgE;AACpE;AACA;AACA;AACA;AACA;AACA;AACe,gCAAgC,0DAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG,IAAI,mBAAmB;AAC1B;;AAEA;AACA,WAAW,gEAAgE;AAC3E,KAAK;AACL,iBAAiB,4BAA4B;AAC7C;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,6DAA6D;AAC/E;AACA;AACA;AACA,WAAW,uDAAuD;AAClE;;;;;;;;;;;;;;;;;AChEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE6C;;AAE7C;AACA;AACA;AACA;AACA;AACe,+BAA+B,uDAAO;AACrD;AACA;AACA;AACA,YAAY,kCAAkC;AAC9C,YAAY,4BAA4B;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mCAAmC,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;;;;;;;;;;;;;;;;;ACxGA;AACA;AACA;AACA;;AAE6C;AACa;;AAE1D;AACA;AACA;;AAEA;AACA;AACA;AACA,qCAAqC,oDAAoD;AACzF;AACA;AACA;AACA,sBAAsB,qDAAqD;AAC3E;AACA;AACA,qCAAqC,oCAAoC;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ,iDAAiD;AACzD,QAAQ;AACR;AACA,MAAM;AACN;AACA;AACA;AACe,iCAAiC,uDAAO;AACvD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAY,0CAA0C;AACtD,QAAQ,uDAAuD;AAC/D;AACA;AACA;AACA,IAAI,+DAAU;AACd;AACA;;AAEA;AACA;AACA;AACA,YAAY,4CAA4C;AACxD,QAAQ,uDAAuD;AAC/D;AACA;AACA;AACA,IAAI,+DAAU;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,sCAAsC;AAClD;AACA;AACA;AACA,4BAA4B,4DAAO;AACnC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;;AAEA,8BAA8B,6CAA6C;AAC3E,KAAK;AACL,8BAA8B,8CAA8C;AAC5E;AACA,IAAI;AACJ;AACA;;;;;;;;;;;;;;;;;;AC9HA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEoD;;AAEpD;AACA;AACA,IAAI,sFAAsF;AAC1F;AACA;AACA,WAAW,kCAAkC;AAC7C;AACO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI,sFAAsF;AAC1F;AACA;AACA,WAAW,kCAAkC;AAC7C,aAAa;AACb;AACO;AACP;AACA,0BAA0B,+EAAiC;AAC3D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACrDA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,kDAAkD;AAC7D,aAAa;AACb;AACO;AACP,iDAAiD,uBAAuB;AACxE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,kDAAkD;AAC7D,aAAa;AACb;AACO;AACP,mDAAmD,gBAAgB;AACnE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,kCAAkC;AAC7C,WAAW,4BAA4B;AACvC,aAAa;AACb;AACO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,mCAAmC;AAC9C,WAAW,iGAAiG;AAC5G,aAAa;AACb;AACO;AACP,oBAAoB,0DAAK;;AAEzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AC5HA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACE;;AAEY;AACA;;AAE9B;;AAE5B;AACA;AACA;AACA;AACA;AACA,MAAM,6DAA6D;AACnE,MAAM,6DAA6D;AACnE;AACA,qFAAqF;AACrF;AACA;AACA;AACA;AACe,yBAAyB,sDAAM;AAC9C;AACA;AACA;AACA;AACA,WAAW,gEAAiB,EAAE,wDAAM,EAAE,6DAAoB;AAC1D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AC5CA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACyB;AACV;;AAExB;;AAEnC;AACA;AACA;AACA,uCAAuC,sDAAsD;AAC7F;AACA;AACA;AACe,2BAA2B,sDAAM;AAChD;AACA;AACA;AACA;AACA,WAAW,yEAAmB,EAAE,oEAAc;AAC9C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACsB;AACV;;AAEY;;AAE7B;AACa;;AAEpD;AACA;AACA;AACA;AACA;AACA,sBAAsB,0GAA0G;AAChI;AACA;AACA;AACe,kCAAkC,sDAAM;AACvD;AACA;AACA;AACA;AACA,WAAW,mDAAU,EAAE,0DAAiB;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2CAA2C,oBAAoB;AAC/D;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA,KAAK;AACL;;AAEA,iDAAiD,kEAAyB;;AAE1E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,2BAA2B,SAAS;AACpC;AACA;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,2BAA2B,SAAS;AACpC;AACA;AACA;;AAEA;AACA;;AAEA,IAAI,uEAAiB;AACrB;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;;AAEA,WAAW,sEAAgB,+BAA+B,QAAQ;AAClE;AACA,IAAI;AACJ;;AAEA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,WAAW,yBAAyB;;AAEpC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8EAA8E,kBAAkB;AAChG;;AAEA;AACA,6EAA6E,kBAAkB;AAC/F;AACA;;AAEA;AACA,uBAAuB,4DAA4D;AACnF;AACA;AACA,SAAS,oBAAoB;AAC7B;AACA;AACA,YAAY,qCAAqC;AACjD;AACA,cAAc,0CAA0C;AACxD;AACA;AACA;;AAEA,sBAAsB,kEAAgB;AACtC;;AAEA;AACA,aAAa,4DAA4D;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,wBAAwB;AACjC;AACA;AACA,YAAY,qCAAqC;AACjD;AACA,YAAY,qCAAqC;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;;;;;;;;;;;;;;;;;;AC3RA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEmD;AACL;AACM;;AAEpD;AACA;AACA;AACA;AACA;AACe,6BAA6B,sDAAM;AAClD;AACA;AACA;AACA;AACA,WAAW,0DAAiB;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,wDAAU;;AAE9B;AACA,UAAU,6DAAa;AACvB;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA,4CAA4C,2BAA2B;;AAEvE;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,KAAK;;AAEL;AACA,IAAI;AACJ;AACA;;;;;;;;;;;;;;;;;;AC7EA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;;AAEL;;AAEvC;AACA;AACA;AACA;AACA;AACe,gCAAgC,sDAAM;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,mDAAU;AACrB;;AAEA;AACA;AACA;AACA,YAAY,qCAAqC;AACjD,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAY,yCAAyC;AACrD,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,KAAK,0CAA0C;AAC/C;AACA;AACA,YAAY,oCAAoC;AAChD,cAAc,aAAa,gCAAgC,0CAA0C;AACrG;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;ACxFA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE6C;;AAEc;;AAE3D;AACA;AACA;AACA,kCAAkC,yEAAyE;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,2BAA2B;AACvE;AACA;AACA;AACe,wCAAwC,uDAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,gEAAiB;AAC7C;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA,uBAAuB;AACvB,UAAU,qBAAqB;;AAE/B;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACnKA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACE;;AAEY;AACE;;AAEhC;;AAE5B;AACA;AACA;AACA;AACA;AACA,MAAM,+DAA+D;AACrE,MAAM,6DAA6D;AACnE;AACA,qFAAqF;AACrF;AACA;AACA;AACA;AACe,0BAA0B,sDAAM;AAC/C;AACA;AACA;AACA;AACA,WAAW,iEAAkB,EAAE,wDAAM,EAAE,6DAAoB;AAC3D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AC5CA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACJ;AACY;AACI;;AAExD;AACA;AACA;AACA,uCAAuC;AACvC,QAAQ,mHAAmH;AAC3H;AACA;AACA;AACA;AACA,MAAM;AACN,MAAM,2DAA2D;AACjE;AACA;AACA;AACe,0BAA0B,sDAAM;AAC/C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,oDAAW,EAAE,0DAAiB,EAAE,kEAAa;AACxD;AACA;;AAEA;AACA;AACA;AACA,YAAY,4CAA4C;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,QAAQ,sEAAsE;AAC9E;AACA;AACA;;AAEA;AACA,iEAAiE,4CAA4C;AAC7G;AACA;AACA;AACA;AACA;AACA,IAAI,oEAAoE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,gBAAgB;AAC5B;AACA;;AAEA;AACA,+DAA+D,gEAAgE;AAC/H;AACA;AACA;AACA;AACA;AACA,kFAAkF,0CAA0C;AAC5H,oFAAoF,4CAA4C;AAChI;AACA,YAAY,4BAA4B;AACxC;;;;;;;;;;;;;;;;;;;;AC3GA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEmD;AACU;AACM;AACrB;;AAE9C;AACA;AACA;AACA,uCAAuC;AACvC,QAAQ,mHAAmH;AAC3H;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACe,4BAA4B,sDAAM;AACjD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,4BAA4B;AACxC;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA,sBAAsB,gEAAc,+BAA+B,6DAAe;;AAElF;AACA;;AAEA;AACA;AACA,SAAS,2DAAW;AACpB;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,8BAA8B,gEAAoB,iBAAiB,2DAAmB;AACtF;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,IAAI,kBAAkB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,KAAK;AACL,qCAAqC,6CAA6C;AAClF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;ACpLA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEwC;;AAEW;;AAEnD;AACA;AACA,YAAY,4EAA4E;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACe,qCAAqC,kDAAI;AACxD;AACA;AACA;AACA,YAAY,4BAA4B;AACxC,YAAY,QAAQ;AACpB,YAAY,6BAA6B;AACzC,YAAY,QAAQ;AACpB,YAAY,qBAAqB;AACjC;AACA;AACA,mCAAmC;AACnC;;AAEA;;AAEA;AACA,2CAA2C,eAAe;AAC1D;AACA;AACA,cAAc,QAAQ;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA,qEAAqE,eAAe;AACpF;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;;AAEA;AACA,gFAAgF,eAAe;AAC/F;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;;;;;;;;;;;;;;;;;;;;;ACtGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE2C;AACqD;AACf;;AAEnB;;AAEtB;;AAExC;AACA;AACA;AACA,QAAQ,4EAA4E;AACpF;AACA;AACA;AACe,mCAAmC,kDAAI;AACtD;AACA,8CAA8C,2DAA2D;AACzG;AACA,YAAY,4BAA4B;AACxC,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA,UAAU,qCAAqC;;AAE/C;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,0BAA0B,6DAAY;;AAEtC;AACA,yBAAyB,qDAAqD;AAC9E;AACA;AACA,cAAc;AACd;AACA,wBAAwB,iEAAgB;;AAExC;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,yBAAyB,4DAAc;;AAEvC;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA,cAAc;AACd;AACA,0BAA0B,yDAAW;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,iCAAiC,2DAAU;;AAE3C;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI;;AAEJ;AACA;AACA,QAAQ,+DAAsB;AAC9B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;;AAEA,EAAE,+DAAa;AACf;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG,IAAI,mBAAmB;AAC1B;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,wBAAwB;AAC/B,OAAO,wBAAwB;AAC/B;AACA,YAAY,4BAA4B;AACxC;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,+BAA+B,wDAAU;AACzC,+BAA+B,wDAAU;;AAEzC;AACA;AACA,SAAS,2DAAW;AACpB;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA,SAAS,4DAAY;AACrB;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA,WAAW;AACX;;AAEA;AACA,uBAAuB,8BAA8B;AACrD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB,wBAAwB;AAC/C;AACA;AACA;;AAEA;AACA,6DAA6D,wBAAwB;AACrF;AACA;AACA;;;;;;;;;;;;;;;;;;ACpRA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4E;;AAE5E;AACA;AACA,IAAI,4EAA4E;AAChF;AACA,WAAW,kCAAkC;AAC7C;AACA,aAAa,sCAAsC;AACnD;AACO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,EAAE,KAAK;AACP;;AAEA;AACA;AACA;AACA,WAAW,4BAA4B;AACvC;AACA,aAAa;AACb;AACO;AACP;AACA,8BAA8B,8DAAgB,UAAU,oEAAsB;;AAE9E;AACA;AACA,GAAG;AACH;;AAEA;AACA;;;;;;;;;;;;;;;;;;AC1EA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACY;;AAExD;AACA;AACA;AACA,uCAAuC;AACvC,iCAAiC;AACjC;AACA;AACA;AACA;AACA,MAAM,2DAA2D;AACjE;AACA;AACA;AACe,gCAAgC,sDAAM;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,kEAAa;AACxB;AACA;;;;;;;;;;;;;;;;;;;;;ACvCA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACsB;AACA;AACA;;AAEhC;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACe,0BAA0B,sDAAM;AAC/C;AACA;AACA;AACA;AACA,WAAW,uEAAkB,EAAE,uEAAkB,EAAE,uEAAkB;AACrE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,+BAA+B,4CAA4C;AAC3E;AACA;AACA,YAAY,QAAQ;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,+EAA+E;AACnF;AACA;AACA,KAAK,sEAAsE;AAC3E,4CAA4C,2EAA2E;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oEAAoE;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,6CAA6C,gFAAgF;AAC7H,4BAA4B,qEAAqE;AACjG;AACA,IAAI,oFAAoF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,uEAAuE;AACnF;;;;;;;;;;;;;;;;;;;;ACnOA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEmD;AACyD;AAC5C;;AAEV;;AAEtD;AACA,QAAQ,qEAAqB;AAC7B,SAAS,sEAAsB;AAC/B,QAAQ,qEAAqB;AAC7B,WAAW,oEAAoB;AAC/B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,iCAAiC,sDAAM;AACtD;AACA;AACA;AACA;AACA,WAAW,2DAAkB;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,+DAA+D;AAC3E;AACA;AACA;AACA,UAAU,oBAAoB;AAC9B;;AAEA;AACA,sBAAsB,wDAAU;AAChC;AACA;;AAEA;AACA;AACA,yBAAyB,iFAAiF;AAC1G;AACA;AACA;AACA,QAAQ,yFAAyF;AACjG;AACA;AACA,eAAe,+DAA+D;AAC9E;AACA,cAAc,8DAAa;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,qCAAqC,6BAA6B;AAClE,KAAK;;AAEL;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,uEAAuE;AACnF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,gEAAc,UAAU,gEAAkB;AAClE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,KAAK;AACL;AACA;;AAEA,GAAG,mEAAiB;;AAEpB;;AAEA;AACA;AACA,8CAA8C,iCAAiC;AAC/E;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,+DAA+D;AAC3E,YAAY,SAAS;AACrB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,uEAAuE;AACnF,YAAY,gEAAgE;AAC5E,cAAc,gEAAgE;AAC9E;AACA;AACA,8BAA8B,2DAAU;;AAExC;AACA;AACA;AACA;AACA,eAAe,mDAAK;AACpB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;;AAEA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wCAAwC,8EAA8E;AACtH;AACA,aAAa,QAAQ;AACrB,cAAc,QAAQ;AACtB;AACA,IAAI,yEAAyE;AAC7E;AACA,cAAc,QAAQ;AACtB,KAAK,sEAAsE;AAC3E,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB,0BAA0B,sDAAsD;AAChF;AACA,IAAI,0EAA0E;AAC9E;;;;;;;;;;;;;;;;;;;ACpRA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACL;AACe;;AAEtD;AACA;AACA;AACA;AACA,IAAI,sEAAsE;AAC1E;AACA;AACA;AACe,iCAAiC,sDAAM;AACtD;AACA;AACA;AACA;AACA,WAAW,mDAAU;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA,iCAAiC,2DAAkB;;AAEnD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oDAAoD,2BAA2B;AAC/E;;AAEA;AACA,qDAAqD,2BAA2B;AAChF;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,4BAA4B;AACxC;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,WAAW;AACjD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;;;;;;;;;;;;;AC3IA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACQ;;AAEO;;AAE3D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI,sEAAsE;AAC1E;AACA;AACA;AACe,iCAAiC,sDAAM;AACtD;AACA;AACA;AACA;AACA,WAAW,8DAAY;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,gEAAiB;;AAE5C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD,8CAA8C;AAC9F,0CAA0C,8DAAY;;AAEtD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU,8DAAY;AACtB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER,uCAAuC,kBAAkB;AACzD;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA,IAAI;AACJ;AACA;;;;;;;;;;;;;;;;;AC3IA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE6C;;AAE7C;AACA;AACA;AACA;AACA;AACe,iCAAiC,uDAAO;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAsC,eAAe;AACrD;AACA;AACA,sCAAsC,cAAc;AACpD;AACA,YAAY,QAAQ;AACpB,YAAY,aAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;;;;;;;;;;;;;;;;;;ACnEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACmB;AACV;;AAErD;AACA;AACA;AACA,mEAAmE,mDAAmD;AACtH;AACA;AACA,MAAM,kEAAkE;AACxE,MAAM;AACN;AACA;AACA,wBAAwB,uEAAuE;AAC/F;AACA;AACA;AACe,yBAAyB,sDAAM;AAC9C;AACA;AACA;AACA;AACA,WAAW,qEAAiB,EAAE,gEAAY;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,0CAA0C;AACxE;AACA;AACA;AACA,IAAI,iEAAiE;AACrE;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,4DAA4D;AACxE;;AAEA;AACA,QAAQ,4CAA4C;AACpD,IAAI,4EAA4E;AAChF;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,mCAAmC,qBAAqB;AACxD;AACA;AACA;AACA;AACA,WAAW,yEAAyE;AACpF,WAAW,yEAAyE;AACpF;AACA;AACA,0CAA0C,wDAAwD;AAClG;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kFAAkF;AAChG,IAAI,qFAAqF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kFAAkF;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,qFAAqF;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4EAA4E;AACpG;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,kBAAkB,iFAAiF;AACnG;AACA,IAAI,iEAAiE;AACrE;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,qBAAqB;AACrB;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,YAAY,0CAA0C;AACtD;;AAEA;AACA;AACA;AACA,gEAAgE,2DAA2D;AAC3H;AACA,6BAA6B,6EAA6E;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,KAAK;AACzF,IAAI,yEAAyE;AAC7E,IAAI,yDAAyD;AAC7D;AACA,cAAc,QAAQ;AACtB;AACA,0BAA0B,6EAA6E;AACvG;AACA,wBAAwB,+FAA+F;AACvH,qFAAqF,KAAK;AAC1F;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA,aAAa,6EAA6E;AAC1F;AACA,cAAc,QAAQ;AACtB;AACA;AACA,yBAAyB,mDAAmD;AAC5E;AACA;AACA,aAAa,6EAA6E;AAC1F;AACA,cAAc,QAAQ;AACtB,IAAI;AACJ;AACA;AACA;AACA,aAAa,6EAA6E;AAC1F;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA,aAAa,6EAA6E;AAC1F;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA,IAAI,kFAAkF;AACtF;AACA,IAAI,qFAAqF;AACzF;AACA;AACA;AACA;AACA,IAAI,wFAAwF;AAC5F;AACA;AACA;AACA,aAAa,6EAA6E;AAC1F;AACA,aAAa,QAAQ;AACrB;;;;;;;;;;;;;;;;;;AC3RA;AACA;AACA;AACA;;AAE4C;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,4DAA4D;AACvE;AACA,aAAa,UAAU;AACvB;AACO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,4DAA4D;AACvE;AACA,aAAa,UAAU;AACvB;AACO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,0DAAK;;AAEjC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yDAAyD,2BAA2B;AACpF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,6DAA6D;AACxE,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AChGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE6C;;AAE7C;AACA,iDAAiD;AACjD;AACA;AACA;AACA,cAAc,2EAA2E;AACzF;AACA;AACA;AACe,gCAAgC,uDAAO;AACtD;AACA;AACA,KAAK,sEAAsE;AAC3E;AACA,YAAY,kCAAkC;AAC9C,YAAY,4DAA4D;AACxE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA,qCAAqC,gBAAgB;AACrD;AACA;AACA,2CAA2C;AAC3C;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,yDAAyD;AACrE,KAAK,uDAAuD;AAC5D;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,YAAY,oDAAoD;AAChE,KAAK,uDAAuD;AAC5D,YAAY,qCAAqC;AACjD,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACxIA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACQ;AACb;AACX;AACwD;;AAEpF;AACA;AACA,IAAI,oFAAoF;AACxF;AACA;AACA;AACe,gCAAgC,sDAAM;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,mDAAU;AACrB;;AAEA;AACA;AACA;AACA;AACA,UAAU,iDAAiD,EAAE,8CAAK;AAClE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM,qFAAqF;AAC3F,MAAM,iFAAiF;AACvF;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA,yCAAyC,0DAAiB;AAC1D;;AAEA;AACA;AACA,KAAK;AACL,SAAS,kFAAkF;AAC3F;AACA;AACA,YAAY,SAAS;AACrB,YAAY,SAAS;AACrB;AACA;AACA;AACA;;AAEA,+BAA+B,sEAAyB;AACxD,+BAA+B,sEAAyB;;AAExD;AACA;;AAEA;AACA;AACA;AACA,kCAAkC,gCAAgC;;AAElE;AACA,8EAA8E,kBAAkB;AAChG;;AAEA;AACA,mCAAmC,gCAAgC;;AAEnE;AACA,2EAA2E,kBAAkB;AAC7F;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC,mDAAU;AACnD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI;AACJ;AACA;;;;;;;;;;;;;;;;;;;;;;;AC1JA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACyD;AACjD;AACxB;AACmB;;AAEX;;AAEpC;AACA;AACA;AACA,8CAA8C,6CAA6C;AAC3F,0BAA0B,qFAAqF;AAC/G,sDAAsD,8CAA8C;AACpG;AACA;AACA;AACe,2BAA2B,sDAAM;AAChD;AACA;AACA;AACA;AACA,WAAW,0DAAiB;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK,qDAAqD;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8BAA8B,iDAAQ,OAAO,4EAAmC;AAChF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,oDAAoD,kDAAkD;AACtG;AACA;AACA,YAAY,mEAAmE;AAC/E,YAAY,4DAA4D;AACxE;AACA;AACA;;AAEA;AACA;;AAEA,WAAW,4BAA4B;AACvC;AACA,iDAAiD,OAAO;AACxD;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAM;;AAEN;AACA,IAAI,+DAAsB,IAAI,2BAA2B;AACzD;;AAEA,wBAAwB,gEAAc,UAAU,6DAAe;AAC/D;AACA;;AAEA,GAAG,sEAAoB,+BAA+B,4CAA4C;;AAElG;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA,mCAAmC,iDAAQ;;AAE3C;AACA,KAAK;;AAEL;AACA,mCAAmC,iDAAQ;;AAE3C;AACA,KAAK;;AAEL,2FAA2F,iDAAQ;;AAEnG;AACA,8DAA8D,iDAAQ;;AAEtE;AACA,gCAAgC,OAAO;AACvC;AACA,MAAM;AACN;AACA;AACA,KAAK;;AAEL;AACA,6EAA6E,iDAAQ;;AAErF;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,IAAI;AACJ;;AAEA;AACA,kDAAkD,kDAAkD;AACpG;AACA;AACA,YAAY,oDAAoD;AAChE;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,wDAAU;;AAE9B;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,IAAI;AACJ;;AAEA;AACA,uCAAuC,cAAc;AACrD;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX,uEAAuE;AACvE,WAAW,wBAAwB;AACnC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa;AACb;AACA,uBAAuB,MAAM;AAC7B;;AAEA;AACA;AACA,WAAW,kBAAkB;AAC7B,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,WAAW;AACX,aAAa,iEAAiE;AAC9E,IAAI;AACJ;AACA,cAAc,QAAQ;AACtB;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,cAAc,gBAAgB;AAC9B,6CAA6C;AAC7C,4BAA4B,8EAA8E;AAC1G;AACA,cAAc,QAAQ;AACtB;AACA;AACA,aAAa,QAAQ;AACrB;;;;;;;;;;;;;;;;;;AC3SA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE2C;AACM;;AAEjD;AACA;AACA;AACA;AACA;AACA,EAAE,EAAE,qDAAK;;AAET;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iFAAiF;AACjF;AACA;AACA,QAAQ,+DAA+D;AACvE;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0EAA0E;AAC1E,yDAAyD,2EAA2E;AACpI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,2BAA2B,kFAAkF;AAC7G,WAAW,SAAS;AACpB,2BAA2B,qFAAqF;AAChH,WAAW,0CAA0C;AACrD,gEAAgE;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,2BAA2B,kFAAkF;AAC7G;AACA,WAAW,SAAS;AACpB,2BAA2B,qFAAqF;AAChH;AACA,aAAa;AACb;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,+CAA+C;AAC1D,aAAa;AACb;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,8DAA8D;AAC9D,wBAAwB,yDAAyD;AACjF;AACA,WAAW,eAAe;AAC1B;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,oDAAoD;AAC/D,WAAW,2BAA2B;AACtC;AACA;AACA,kCAAkC,4CAA4C;AAC9E,SAAS,sBAAsB;;AAE/B;AACA,sBAAsB,gBAAgB;;AAEtC;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA,OAAO,wEAAwE;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA,GAAG,+DAAU;AACb;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,oDAAoD;AAC/D,WAAW,QAAQ;AACnB;AACA,aAAa;AACb;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,uFAAuF;AAC9F,OAAO;AACP;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA,CAAC,+DAAU;AACX;;AAEA,iEAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;;;;;;;;;;;;;;;;;;;AC7XF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACiD;AACV;;AAEnF;AACA;AACA;AACA,uCAAuC,mDAAmD;AAC1F;AACA;AACA,KAAK;AACL,QAAQ,uFAAuF;AAC/F;AACA;AACA;AACe,mCAAmC,sDAAM;AACxD;AACA;AACA;AACA;AACA,WAAW,yFAA2B,EAAE,oFAAsB;AAC9D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACtCA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE6C;;AAE7C;AACA;AACA;AACA;AACA;AACe,0CAA0C,uDAAO;AAChE;AACA;AACA;AACA;AACA;AACA,aAAa,gBAAgB;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;;;;;;;;;;;;;;;;;;AC3DA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AAC4B;AACjC;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACe,0CAA0C,sDAAM;AAC/D;AACA;AACA;AACA;AACA,WAAW,mDAAU;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wDAAwD,oEAA2B;AACnF;AACA;;;;;;;;;;;;;;;;;;;;ACzCA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEmD;AACmC;;AAEnB;AACqB;;AAExF;AACA;AACA;AACA,wBAAwB,kEAAkE;AAC1F;AACA;AACA;AACe,qCAAqC,sDAAM;AAC1D;AACA;AACA;AACA;AACA,WAAW,+DAAiB;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gCAAgC,mEAAmE;AACnG;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,wDAAU;;AAE9B;AACA;AACA,UAAU,+DAAe;AACzB;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA,IAAI;AACJ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA,mBAAmB,mEAAuB;;AAE1C;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI,4EAA2B;AAC/B;AACA,IAAI;;AAEJ;AACA,EAAE,qEAAmB;AACrB;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA,eAAe,cAAc,QAAQ,gBAAgB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc,uEAAsB;AACpC,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,iBAAiB,cAAc,UAAU,gBAAgB;AACzD;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,6BAA6B,cAAc,4BAA4B,gBAAgB;AACvF;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA,6BAA6B,cAAc,WAAW,gBAAgB;AACtE;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACtOA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAW0B;AAC2C;AAC1B;;AAEK;;AAEhD;AACA;AACoF;;AAEpF;AACA;AACA;AACA;AACA;AACe,sCAAsC,kDAAI;AACzD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,0BAA0B,6DAAY;;AAEtC;AACA,yBAAyB,qDAAqD;AAC9E;AACA;AACA,cAAc;AACd;AACA,wBAAwB,iEAAgB;;AAExC;AACA;AACA;AACA,cAAc,0DAA0D;AACxE;AACA;;AAEA;AACA;AACA;AACA,cAAc,wCAAwC;AACtD;AACA,yDAAyD,2DAAW;AACpE;;AAEA;AACA;AACA;AACA,cAAc,wCAAwC;AACtD;AACA,6DAA6D,4DAAY;;AAEzE;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,yBAAyB,4DAAc;;AAEvC;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA,cAAc;AACd;AACA,0BAA0B,yDAAW;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ,EAAE,6EAA2B;AAC7B;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE,+DAAa,IAAI,aAAa;;AAEhC;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,cAAc,wCAAwC;AACtD;AACA;AACA,qBAAqB,wDAAU;;AAE/B;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,0DAA0D;AACxE;AACA;AACA;AACA,2BAA2B,8DAAgB,eAAe,oEAAsB;;AAEhF;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACjNA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACmB;AACzB;AACD;;AAErC;AACA;AACA;AACA,+BAA+B,0FAA0F;AACzH;AACA;AACA,IAAI;AACJ,iBAAiB,kFAAkF;AACnG;AACA,yBAAyB,kEAAkE;AAC3F;AACA;AACA;AACe,2BAA2B,sDAAM;AAChD;AACA;AACA;AACA;AACA,WAAW,yEAAuB,EAAE,mDAAU;AAC9C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,yEAAuB;AAC7E;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA,+BAA+B,8CAA8C;AAC7E;AACA;AACA;AACA,MAAM,0CAA0C;AAChD,MAAM,6DAA6D;AACnE,MAAM,6CAA6C;AACnD;AACA,qDAAqD,kDAAkD;AACvG;AACA;AACA,MAAM,wFAAwF;AAC9F,MAAM,gHAAgH;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,0FAA0F;AAC9F;AACA,2CAA2C,+EAA+E;AAC1H;AACA,2CAA2C,2DAA2D;AACtG;AACA,YAAY,gBAAgB;AAC5B;;AAEA;AACA;AACA;AACA,WAAW,kFAAkF;AAC7F;AACA,aAAa;AACb;AACA,4BAA4B,qDAAQ;AACpC;;;;;;;;;;;;;;;;;;;;ACtGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACY;AACY;AACF;;AAElE;AACA;AACA;AACA,uCAAuC,uEAAuE;AAC9G;AACA;AACA;AACA,MAAM,qEAAqE;AAC3E,MAAM,2DAA2D;AACjE,MAAM,uEAAuE;AAC7E;AACA;AACA;AACe,0BAA0B,sDAAM;AAC/C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,uEAAkB,EAAE,kEAAa,EAAE,wEAAmB;AACjE;AACA;;AAEA;AACA;AACA;AACA,YAAY,4CAA4C;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,QAAQ,sEAAsE;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,gBAAgB;AAC5B;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;ACpFA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;;AAEQ;;AAEJ;AACY;AACN;AACZ;;AAEH;AACe;AACsB;AAC5B;;AAEhD;AACA;AACA;AACA;AACA,4CAA4C,iEAAiE;AAC7G,gDAAgD,wDAAwD;AACxG;AACA;AACA;AACe,iCAAiC,sDAAM;AACtD;AACA;AACA;AACA;AACA,WAAW,gEAAc,EAAE,0DAAY,EAAE,sEAAiB,EAAE,mDAAU;AACtE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,6BAA6B,mEAAmE;AAChG;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,gEAAc;AAC3D;AACA,qBAAqB,6EAAqB;AAC1C,iCAAiC,2DAAkB;;AAEnD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,eAAe;AACrD,MAAM;AACN,KAAK;AACL,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,oEAAY;AAClC,qBAAqB,SAAS,SAAS,uEAAe,8CAA8C;;AAEpG;AACA;AACA;;AAEA,sBAAsB,8DAAY;;AAElC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA,4CAA4C,kCAAkC;AAC9E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,sCAAsC,qBAAqB;AAC3D;;AAEA;AACA;AACA;AACA,KAAK;AACL,GAAG,IAAI,kBAAkB;AACzB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,yCAAyC;AACrD,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,6CAA6C,gEAAc;AAC3D,2CAA2C,0DAAY;AACvD;AACA;;AAEA,yBAAyB,mBAAmB;AAC5C;AACA,IAAI;;AAEJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS,6DAAY;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA,2BAA2B,mBAAmB;AAC9C;AACA,MAAM;;AAEN;AACA,KAAK;AACL;AACA,2BAA2B,mBAAmB;AAC9C;;AAEA;;AAEA;AACA;AACA,kCAAkC,yDAAyD;AAC3F;AACA;AACA;AACA;AACA,4DAA4D,qBAAqB;AACjF;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,4DAA4D,qBAAqB;AACjF;AACA,YAAY;AACZ;AACA,8CAA8C,sEAAsE;AACpH;AACA;AACA,gBAAgB,QAAQ;AACxB,gBAAgB,QAAQ;AACxB,gBAAgB,qCAAqC;AACrD,eAAe,yDAAyD;AACxE;AACA,oCAAoC,qBAAqB;AACzD,MAAM;;AAEN;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,2BAA2B,mBAAmB;AAC9C;AACA,MAAM;;AAEN;AACA,KAAK;;AAEL;AACA,0BAA0B,mBAAmB;AAC7C;;AAEA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,qCAAqC;AACjD,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA,oBAAoB,cAAc,GAAG,KAAK;;AAE1C;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,8CAA8C;AACzD,aAAa;AACN;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACtcA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAE4C;AACU;;AAET;AACJ;AACE;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACe,kCAAkC,sDAAM;AACvD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,qCAAqC;AACrC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,kCAAkC;AAC9C,YAAY,QAAQ;AACpB,YAAY,mEAAmE;AAC/E;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,6CAA6C,gEAAc;AAC3D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,sDAAsD;AACjE,WAAW,kDAAkD;AAC7D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,sDAAsD;AACjE,WAAW,kDAAkD;AAC7D;AACA;AACA;;AAEA;AACA;AACA,WAAW,oCAAoC;AAC/C,WAAW,QAAQ;AACnB,WAAW,sDAAsD;AACjE,WAAW,kDAAkD;AAC7D;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,sDAAsD;AACjE,WAAW,kDAAkD;AAC7D;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,sDAAsD;AACjE,WAAW,kDAAkD;AAC7D,WAAW,yCAAyC;AACpD,WAAW,8BAA8B;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;AACH;;AAEA;AACA;AACA,WAAW,sDAAsD;AACjE,WAAW,kDAAkD;AAC7D;AACA;AACA;;AAEA;AACA;AACA,WAAW,sDAAsD;AACjE,WAAW,kDAAkD;AAC7D,WAAW,8BAA8B;AACzC;AACA,uDAAuD,yCAAyC;;AAEhG;;AAEA;AACA;AACA,EAAE;AACF;;AAEA,sCAAsC,6CAA6C;AACnF;AACA;AACA,WAAW,kDAAkD;AAC7D,aAAa;AACb;AACA,sDAAsD,2BAA2B;;AAEjF;;AAEA;AACA;;AAEA,qCAAqC,6CAA6C;AAClF;AACA;AACA,WAAW,kDAAkD;AAC7D,aAAa;AACb;AACA,sDAAsD,wCAAwC;;AAE9F;;AAEA;AACA;;AAEA,YAAY,8CAA8C;AAC1D;AACA;AACA;AACA,WAAW,oCAAoC;AAC/C,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,8CAA8C;AAC1D;AACA;AACA,WAAW,oCAAoC;AAC/C,WAAW,kDAAkD;AAC7D,WAAW,QAAQ;AACnB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,oCAAoC;AAC/C,WAAW,oCAAoC;AAC/C,WAAW,kDAAkD;AAC7D,WAAW,yCAAyC;AACpD;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACnSA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEmD;AACS;AACZ;;AAEhD;AACA;AACA;AACA,uCAAuC,uEAAuE;AAC9G;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACe,4BAA4B,sDAAM;AACjD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,sEAAoB;AACxC;AACA;AACA,4BAA4B,6DAAqB;;AAEjD;AACA,oDAAoD,MAAM;AAC1D;AACA,KAAK;;AAEL;AACA;AACA,UAAU,2DAAW;AACrB;AACA,KAAK;;AAEL;;AAEA;AACA;;AAEA;AACA,sCAAsC,uBAAuB;;AAE7D;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACzEA;AACA;AACA;AACA;;AAEsD;AACT;AACC;;AAE9C;AACA;AACA;;AAEA;AACA;AACA;AACA,qCAAqC,sEAAsE;AAC3G;AACA;AACA;AACA,sBAAsB,qDAAqD;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACe,iCAAiC,uDAAO;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,mBAAmB;AAC/B;AACA;AACA,gBAAgB,4DAAO;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA,YAAY,MAAM;AAClB,YAAY,QAAQ;AACpB,YAAY,uCAAuC;AACnD;AACA;AACA;AACA,6CAA6C,gEAAc;AAC3D;AACA;;AAEA;AACA;AACA;AACA;;AAEA,4BAA4B,oCAAoC;AAChE;AACA;;;;;;;;;;;;;;;;;;;ACjHA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAE6C;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B,aAAa;AACb;AACO;AACP;AACA;;AAEA,kCAAkC,6BAA6B;AAC/D;;AAEA;AACA;AACA;AACA,WAAW,oCAAoC;AAC/C,aAAa,gBAAgB;AAC7B;AACA;AACO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,KAAK;AACpC,iDAAiD,iBAAiB;;AAElE;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;;AAEA;AACA;AACA;AACA,WAAW,oCAAoC;AAC/C,WAAW,8BAA8B;AACzC,aAAa;AACb;AACO;AACP;AACA;AACA;;AAEA,4DAA4D;AAC5D;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,MAAM;AACjB,aAAa;AACb;AACA;AACA;AACA,GAAG,wCAAwC;AAC3C,uCAAuC;AACvC,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;AACA,6BAA6B,KAAK;;AAElC,yCAAyC,iBAAiB;AAC1D,GAAG;AACH;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA,gBAAgB,8EAA6B;;AAE7C;AACA,kBAAkB,8EAA6B;;AAE/C;AACA;;AAEA;;AAEA;;AAEA;AACA,IAAI;;AAEJ;;AAEA;AACA,GAAG;AACH;;;;;;;;;;;;;;;;;;;ACxIA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;AACyC;AACX;;AAE1E;AACA;AACA;AACA;AACA;AACe,yBAAyB,sDAAM;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,qCAAqC;AACjD,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,uDAAuD;AACtE;AACA,YAAY,oCAAoC;AAChD,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,uDAAuD;AACtE;AACA,YAAY,oCAAoC;AAChD,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA,+BAA+B,2BAA2B;AAC1D;AACA,YAAY,QAAQ,cAAc;AAClC,wEAAwE,wCAAwC;AAChH,YAAY,0CAA0C;AACtD,SAAS,qDAAqD;AAC9D;AACA;AACA;AACA;AACA;AACA,YAAY,4BAA4B;AACxC;AACA,aAAa,yCAAyC;AACtD;AACA,6BAA6B;AAC7B;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA,YAAY,+FAA+F;AAC3G,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAY,iGAAiG;AAC7G,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sBAAsB,0CAA0C;AAChE,cAAc,6EAA6E;AAC3F;AACA,iBAAiB,oCAAoC;AACrD;AACA;AACA,YAAY,oCAAoC;AAChD,YAAY,kDAAkD;AAC9D,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA,wBAAwB,UAAU,GAAG,OAAO;AAC5C;;AAEA,SAAS,8DAAQ,yBAAyB,sBAAsB;AAChE;;AAEA;AACA;AACA;AACA;AACA,YAAY,oCAAoC;AAChD,cAAc;AACd;AACA;AACA,uDAAuD,8DAAQ;AAC/D;;AAEA;AACA;AACA;AACA,YAAY,qCAAqC;AACjD,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,qCAAqC;AACjD,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,oCAAoC;AAChD,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;;AAEA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,kCAAkC;AAC7C,WAAW,yCAAyC;AACpD,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,0CAA0C;AACrD,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,yCAAyC;AACpD,WAAW,iCAAiC;AAC5C,aAAa;AACb;AACA,wBAAwB,+EAAyB;AACjD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,kCAAkC;AAC7C,WAAW,0CAA0C;AACrD,WAAW,4BAA4B;AACvC;AACA,aAAa,4BAA4B;AACzC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS,uFAAyC;AAClD;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;ACxVA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAE4C;;AAEI;AACV;AAIV;;AAE5B;AACA;AACA;AACA;AACA,gBAAgB,0CAA0C,KAAK,2CAA2C;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,4CAA4C;AACzE,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACe,6BAA6B,sDAAM;AAClD;AACA;AACA;AACA;AACA,WAAW,2DAAY,EAAE,mDAAU;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kCAAkC,gEAAa;AAC/C,oCAAoC,2EAAwB;AAC5D;;AAEA;AACA;AACA;AACA,KAAK,2FAA2F;AAChG;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,wFAAwF,qBAAqB;AAC7G;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL,KAAK;AACL,IAAI;AACJ;AACA;;;;;;;;;;;ACpJA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,GAAG;AAChB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,QAAQ,EAAC;;;;;;;;;;;;;;;;ACpBxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,QAAQ,EAAC;;;;;;;UC9BxB;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEmD;AACR;AACoB;AACiB;AACvB;AAC2B;AAC7B;AACgB;AAChB;AAC0B;AACA;AACA;AAC5B;AACyB;AACV;AACK;AACmC;AACV;AACzC;AACF;AAC0B;AACE;AACZ;AACV","file":"image.js","sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-content .image{clear:both;display:table;margin:.9em auto;min-width:50px;text-align:center}.ck-content .image img{display:block;margin:0 auto;max-width:100%;min-width:100%}.ck-content .image-inline{align-items:flex-start;display:inline-flex;max-width:100%}.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{overflow:hidden;padding-left:inherit;padding-right:inherit;text-overflow:ellipsis;white-space:nowrap}.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}\", \"\",{\"version\":3,\"sources\":[\"webpack://./theme/image.css\"],\"names\":[],\"mappings\":\"AAMC,mBAEC,UAAW,CADX,aAAc,CAOd,gBAAkB,CAGlB,cAAe,CARf,iBAuBD,CAbC,uBAEC,aAAc,CAGd,aAAc,CAGd,cAAe,CAGf,cACD,CAGD,0BAYC,sBAAuB,CANvB,mBAAoB,CAGpB,cAoBD,CAdC,kCACC,YACD,CAGA,gEAGC,WAAY,CACZ,aAAc,CAGd,cACD,CAUD,gEASC,eAAgB,CARhB,oBAAqB,CACrB,qBAAsB,CAQtB,sBAAuB,CAFvB,kBAGD,CAWA,2GACC,SAUD,CAHC,qEACC,YACD,CAOA,0FACC,cACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-content {\\n\\t& .image {\\n\\t\\tdisplay: table;\\n\\t\\tclear: both;\\n\\t\\ttext-align: center;\\n\\n\\t\\t/* Make sure there is some space between the content and the image. Center image by default. */\\n\\t\\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\\n\\t \\tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\\n\\t\\tmargin: 0.9em auto;\\n\\n\\t\\t/* Make sure the caption will be displayed properly (See: https://github.com/ckeditor/ckeditor5/issues/1870). */\\n\\t\\tmin-width: 50px;\\n\\n\\t\\t& img {\\n\\t\\t\\t/* Prevent unnecessary margins caused by line-height (see #44). */\\n\\t\\t\\tdisplay: block;\\n\\n\\t\\t\\t/* Center the image if its width is smaller than the content's width. */\\n\\t\\t\\tmargin: 0 auto;\\n\\n\\t\\t\\t/* Make sure the image never exceeds the size of the parent container (ckeditor/ckeditor5-ui#67). */\\n\\t\\t\\tmax-width: 100%;\\n\\n\\t\\t\\t/* Make sure the image is never smaller than the parent container (See: https://github.com/ckeditor/ckeditor5/issues/9300). */\\n\\t\\t\\tmin-width: 100%\\n\\t\\t}\\n\\t}\\n\\n\\t& .image-inline {\\n\\t\\t/*\\n\\t\\t * Normally, the .image-inline would have \\\"display: inline-block\\\" and \\\"img { width: 100% }\\\" (to follow the wrapper while resizing).\\n\\t\\t * Unfortunately, together with \\\"srcset\\\", it gets automatically stretched up to the width of the editing root.\\n\\t\\t * This strange behavior does not happen with inline-flex.\\n\\t\\t */\\n\\t\\tdisplay: inline-flex;\\n\\n\\t\\t/* While being resized, don't allow the image to exceed the width of the editing root. */\\n\\t\\tmax-width: 100%;\\n\\n\\t\\t/* This is required by Safari to resize images in a sensible way. Without this, the browser breaks the ratio. */\\n\\t\\talign-items: flex-start;\\n\\n\\t\\t/* When the picture is present it must act as a flex container to let the img resize properly */\\n\\t\\t& picture {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t}\\n\\n\\t\\t/* When the picture is present, it must act like a resizable img. */\\n\\t\\t& picture,\\n\\t\\t& img {\\n\\t\\t\\t/* This is necessary for the img to span the entire .image-inline wrapper and to resize properly. */\\n\\t\\t\\tflex-grow: 1;\\n\\t\\t\\tflex-shrink: 1;\\n\\n\\t\\t\\t/* Prevents overflowing the editing root boundaries when an inline image is very wide. */\\n\\t\\t\\tmax-width: 100%;\\n\\t\\t}\\n\\t}\\n}\\n\\n.ck.ck-editor__editable {\\n\\t/*\\n\\t * Inhertit the content styles padding of the <figcaption> in case the integration overrides `text-align: center`\\n\\t * of `.image` (e.g. to the left/right). This ensures the placeholder stays at the padding just like the native\\n\\t * caret does, and not at the edge of <figcaption>.\\n\\t */\\n\\t& .image > figcaption.ck-placeholder::before {\\n\\t\\tpadding-left: inherit;\\n\\t\\tpadding-right: inherit;\\n\\n\\t\\t/*\\n\\t\\t * Make sure the image caption placeholder doesn't overflow the placeholder area.\\n\\t\\t * See https://github.com/ckeditor/ckeditor5/issues/9162.\\n\\t\\t */\\n\\t\\twhite-space: nowrap;\\n\\t\\toverflow: hidden;\\n\\t\\ttext-overflow: ellipsis;\\n\\t}\\n\\n\\n\\t/*\\n\\t * Make sure the selected inline image always stays on top of its siblings.\\n\\t * See https://github.com/ckeditor/ckeditor5/issues/9108.\\n\\t */\\n\\t& .image.ck-widget_selected {\\n\\t\\tz-index: 1;\\n\\t}\\n\\n\\t& .image-inline.ck-widget_selected {\\n\\t\\tz-index: 1;\\n\\n\\t\\t/*\\n\\t\\t * Make sure the native browser selection style is not displayed.\\n\\t\\t * Inline image widgets have their own styles for the selected state and\\n\\t\\t * leaving this up to the browser is asking for a visual collision.\\n\\t\\t */\\n\\t\\t& ::selection {\\n\\t\\t\\tdisplay: none;\\n\\t\\t}\\n\\t}\\n\\n\\t/* The inline image nested in the table should have its original size if not resized.\\n\\tSee https://github.com/ckeditor/ckeditor5/issues/9117. */\\n\\t& td,\\n\\t& th {\\n\\t\\t& .image-inline img {\\n\\t\\t\\tmax-width: none;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--ck-color-image-caption-background:#f7f7f7;--ck-color-image-caption-text:#333;--ck-color-image-caption-highligted-background:#fd0}.ck-content .image>figcaption{background-color:var(--ck-color-image-caption-background);caption-side:bottom;color:var(--ck-color-image-caption-text);display:table-caption;font-size:.75em;outline-offset:-1px;padding:.6em;word-break:break-word}.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)}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./theme/imagecaption.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,2CAAoD,CACpD,kCAA8C,CAC9C,mDACD,CAGA,8BAKC,yDAA0D,CAH1D,mBAAoB,CAEpB,wCAAyC,CAHzC,qBAAsB,CAMtB,eAAgB,CAChB,mBAAoB,CAFpB,YAAa,CAHb,qBAMD,CAGA,qEACC,iDACD,CAEA,sCACC,GACC,oEACD,CAEA,GACC,yDACD,CACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-image-caption-background: hsl(0, 0%, 97%);\\n\\t--ck-color-image-caption-text: hsl(0, 0%, 20%);\\n\\t--ck-color-image-caption-highligted-background: hsl(52deg 100% 50%);\\n}\\n\\n/* Content styles */\\n.ck-content .image > figcaption {\\n\\tdisplay: table-caption;\\n\\tcaption-side: bottom;\\n\\tword-break: break-word;\\n\\tcolor: var(--ck-color-image-caption-text);\\n\\tbackground-color: var(--ck-color-image-caption-background);\\n\\tpadding: .6em;\\n\\tfont-size: .75em;\\n\\toutline-offset: -1px;\\n}\\n\\n/* Editing styles */\\n.ck.ck-editor__editable .image > figcaption.image__caption_highlighted {\\n\\tanimation: ck-image-caption-highlight .6s ease-out;\\n}\\n\\n@keyframes ck-image-caption-highlight {\\n\\t0% {\\n\\t\\tbackground-color: var(--ck-color-image-caption-highligted-background);\\n\\t}\\n\\n\\t100% {\\n\\t\\tbackground-color: var(--ck-color-image-caption-background);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-image-insert__panel{padding:var(--ck-spacing-large)}.ck.ck-image-insert__ck-finder-button{border:1px solid #ccc;border-radius:var(--ck-border-radius);display:block;margin:var(--ck-spacing-standard) auto;width:100%}.ck.ck-splitbutton>.ck-file-dialog-button.ck-button{border:none;margin:0;padding:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://./theme/imageinsert.css\"],\"names\":[],\"mappings\":\"AAKA,2BACC,+BACD,CAEA,sCAIC,qBAAiC,CACjC,qCAAsC,CAJtC,aAAc,CAEd,sCAAuC,CADvC,UAID,CAGA,oDAGC,WAAY,CADZ,QAAS,CADT,SAGD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-image-insert__panel {\\n\\tpadding: var(--ck-spacing-large);\\n}\\n\\n.ck.ck-image-insert__ck-finder-button {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n\\tmargin: var(--ck-spacing-standard) auto;\\n\\tborder: 1px solid hsl(0, 0%, 80%);\\n\\tborder-radius: var(--ck-border-radius);\\n}\\n\\n/* https://github.com/ckeditor/ckeditor5/issues/7986 */\\n.ck.ck-splitbutton > .ck-file-dialog-button.ck-button {\\n\\tpadding: 0;\\n\\tmargin: 0;\\n\\tborder: none;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./theme/imageinsertformrowview.css\"],\"names\":[],\"mappings\":\"AAMC,+BAEC,YACD,CAGD,iBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,6BAmBD,CAhBC,iCACC,WACD,CAEA,kDACC,qCAUD,CARC,sIAEC,sBACD,CAEA,+EACC,0BACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-image-insert-form {\\n\\t&:focus {\\n\\t\\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\\n\\t\\toutline: none;\\n\\t}\\n}\\n\\n.ck.ck-form__row {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tflex-wrap: nowrap;\\n\\tjustify-content: space-between;\\n\\n\\t/* Ignore labels that work as fieldset legends */\\n\\t& > *:not(.ck-label) {\\n\\t\\tflex-grow: 1;\\n\\t}\\n\\n\\t&.ck-image-insert-form__action-row {\\n\\t\\tmargin-top: var(--ck-spacing-standard);\\n\\n\\t\\t& .ck-button-save,\\n\\t\\t& .ck-button-cancel {\\n\\t\\t\\tjustify-content: center;\\n\\t\\t}\\n\\n\\t\\t& .ck-button .ck-button__label {\\n\\t\\t\\tcolor: var(--ck-color-text);\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-content .image.image_resized{box-sizing:border-box;display:block;max-width:100%}.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}\", \"\",{\"version\":3,\"sources\":[\"webpack://./theme/imageresize.css\"],\"names\":[],\"mappings\":\"AAKA,iCAQC,qBAAsB,CADtB,aAAc,CANd,cAkBD,CATC,qCAEC,UACD,CAEA,4CAEC,aACD,CAQC,sHACC,cACD,CAIF,oFACC,uCACD,CAEA,oFACC,sCACD,CAEA,oEACC,SACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-content .image.image_resized {\\n\\tmax-width: 100%;\\n\\t/*\\n\\tThe `<figure>` element for resized images must not use `display:table` as browsers do not support `max-width` for it well.\\n\\tSee https://stackoverflow.com/questions/4019604/chrome-safari-ignoring-max-width-in-table/14420691#14420691 for more.\\n\\tFortunately, since we control the width, there is no risk that the image will look bad.\\n\\t*/\\n\\tdisplay: block;\\n\\tbox-sizing: border-box;\\n\\n\\t& img {\\n\\t\\t/* For resized images it is the `<figure>` element that determines the image width. */\\n\\t\\twidth: 100%;\\n\\t}\\n\\n\\t& > figcaption {\\n\\t\\t/* The `<figure>` element uses `display:block`, so `<figcaption>` also has to. */\\n\\t\\tdisplay: block;\\n\\t}\\n}\\n\\n.ck.ck-editor__editable {\\n\\t/* The resized inline image nested in the table should respect its parent size.\\n\\tSee https://github.com/ckeditor/ckeditor5/issues/9117. */\\n\\t& td,\\n\\t& th {\\n\\t\\t& .image-inline.image_resized img {\\n\\t\\t\\tmax-width: 100%;\\n\\t\\t}\\n\\t}\\n}\\n\\n[dir=\\\"ltr\\\"] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon {\\n\\tmargin-right: var(--ck-spacing-standard);\\n}\\n\\n[dir=\\\"rtl\\\"] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon {\\n\\tmargin-left: var(--ck-spacing-standard);\\n}\\n\\n.ck.ck-dropdown .ck-button.ck-resize-image-button .ck-button__label {\\n\\twidth: 4em;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":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-left:auto;margin-right:0}.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-bottom:var(--ck-inline-image-style-spacing);margin-top: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)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./theme/imagestyle.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,8BAA+B,CAC/B,qEACD,CAMC,qFAEC,oDACD,CAIA,yEAEC,UACD,CAEA,8BACC,WAAY,CACZ,yCAA0C,CAC1C,aACD,CAEA,oCACC,UAAW,CACX,0CACD,CAEA,sCACC,gBAAiB,CACjB,iBACD,CAEA,qCACC,WAAY,CACZ,yCACD,CAEA,2CAEC,gBAAiB,CADjB,cAED,CAEA,0CACC,aAAc,CACd,iBACD,CAGA,6GAGC,YACD,CAGC,mGAGC,kDAAmD,CADnD,+CAED,CAEA,iDACC,iDACD,CAEA,kDACC,gDACD,CAUC,0lBAGC,qDAKD,CAHC,8nBACC,YACD,CAKD,oVAGC,2DACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-image-style-spacing: 1.5em;\\n\\t--ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2);\\n}\\n\\n.ck-content {\\n\\t/* Provides a minimal side margin for the left and right aligned images, so that the user has a visual feedback\\n\\tconfirming successful application of the style if image width exceeds the editor's size.\\n\\tSee https://github.com/ckeditor/ckeditor5/issues/9342 */\\n\\t& .image-style-block-align-left,\\n\\t& .image-style-block-align-right {\\n\\t\\tmax-width: calc(100% - var(--ck-image-style-spacing));\\n\\t}\\n\\n\\t/* Allows displaying multiple floating images in the same line.\\n\\tSee https://github.com/ckeditor/ckeditor5/issues/9183#issuecomment-804988132 */\\n\\t& .image-style-align-left,\\n\\t& .image-style-align-right {\\n\\t\\tclear: none;\\n\\t}\\n\\n\\t& .image-style-side {\\n\\t\\tfloat: right;\\n\\t\\tmargin-left: var(--ck-image-style-spacing);\\n\\t\\tmax-width: 50%;\\n\\t}\\n\\n\\t& .image-style-align-left {\\n\\t\\tfloat: left;\\n\\t\\tmargin-right: var(--ck-image-style-spacing);\\n\\t}\\n\\n\\t& .image-style-align-center {\\n\\t\\tmargin-left: auto;\\n\\t\\tmargin-right: auto;\\n\\t}\\n\\n\\t& .image-style-align-right {\\n\\t\\tfloat: right;\\n\\t\\tmargin-left: var(--ck-image-style-spacing);\\n\\t}\\n\\n\\t& .image-style-block-align-right {\\n\\t\\tmargin-right: 0;\\n\\t\\tmargin-left: auto;\\n\\t}\\n\\n\\t& .image-style-block-align-left {\\n\\t\\tmargin-left: 0;\\n\\t\\tmargin-right: auto;\\n\\t}\\n\\n\\t/* Simulates margin collapsing with the preceding paragraph, which does not work for the floating elements. */\\n\\t& p + .image-style-align-left,\\n\\t& p + .image-style-align-right,\\n\\t& p + .image-style-side {\\n\\t\\tmargin-top: 0;\\n\\t}\\n\\n\\t& .image-inline {\\n\\t\\t&.image-style-align-left,\\n\\t\\t&.image-style-align-right {\\n\\t\\t\\tmargin-top: var(--ck-inline-image-style-spacing);\\n\\t\\t\\tmargin-bottom: var(--ck-inline-image-style-spacing);\\n\\t\\t}\\n\\n\\t\\t&.image-style-align-left {\\n\\t\\t\\tmargin-right: var(--ck-inline-image-style-spacing);\\n\\t\\t}\\n\\n\\t\\t&.image-style-align-right {\\n\\t\\t\\tmargin-left: var(--ck-inline-image-style-spacing);\\n\\t\\t}\\n\\t}\\n}\\n\\n.ck.ck-splitbutton {\\n\\t/* The button should display as a regular drop-down if the action button\\n\\tis forced to fire the same action as the arrow button. */\\n\\t&.ck-splitbutton_flatten {\\n\\t\\t&:hover,\\n\\t\\t&.ck-splitbutton_open {\\n\\t\\t\\t& > .ck-splitbutton__action:not(.ck-disabled),\\n\\t\\t\\t& > .ck-splitbutton__arrow:not(.ck-disabled),\\n\\t\\t\\t& > .ck-splitbutton__arrow:not(.ck-disabled):not(:hover) {\\n\\t\\t\\t\\tbackground-color: var(--ck-color-button-on-background);\\n\\n\\t\\t\\t\\t&::after {\\n\\t\\t\\t\\t\\tdisplay: none;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&.ck-splitbutton_open:hover {\\n\\t\\t\\t& > .ck-splitbutton__action:not(.ck-disabled),\\n\\t\\t\\t& > .ck-splitbutton__arrow:not(.ck-disabled),\\n\\t\\t\\t& > .ck-splitbutton__arrow:not(.ck-disabled):not(:hover) {\\n\\t\\t\\t\\tbackground-color: var(--ck-color-button-on-hover-background);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-image-upload-complete-icon{border-radius:50%;display:block;position:absolute;right:min(var(--ck-spacing-medium),6%);top:min(var(--ck-spacing-medium),6%);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{animation-delay:0ms,3s;animation-duration:.5s,.5s;animation-fill-mode:forwards,forwards;animation-name:ck-upload-complete-icon-show,ck-upload-complete-icon-hide;background:var(--ck-color-image-upload-icon-background);font-size:calc(1px*var(--ck-image-upload-icon-size));height:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size));opacity:0;overflow:hidden;width:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size))}.ck-image-upload-complete-icon:after{animation-delay:.5s;animation-duration:.5s;animation-fill-mode:forwards;animation-name:ck-upload-complete-icon-check;border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);box-sizing:border-box;height:0;left:25%;opacity:0;top:50%;transform:scaleX(-1) rotate(135deg);transform-origin:left top;width:0}@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%{height:0;opacity:1;width:0}33%{height:0;width:.3em}to{height:.45em;opacity:1;width:.3em}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./theme/imageuploadicon.css\",\"webpack://./../ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadicon.css\"],\"names\":[],\"mappings\":\"AAKA,+BAUC,iBAAkB,CATlB,aAAc,CACd,iBAAkB,CAOlB,sCAAwC,CADxC,oCAAsC,CAGtC,SAMD,CAJC,qCACC,UAAW,CACX,iBACD,CChBD,MACC,iCAA8C,CAC9C,+CAA4D,CAG5D,8BAA+B,CAC/B,gCAAiC,CACjC,4DACD,CAEA,+BAWC,sBAA4B,CAN5B,0BAAgC,CADhC,qCAAuC,CADvC,wEAA0E,CAD1E,uDAAwD,CAMxD,oDAAuD,CAWvD,oFAAuF,CAlBvF,SAAU,CAgBV,eAAgB,CAChB,mFA0BD,CAtBC,qCAgBC,mBAAsB,CADtB,sBAAyB,CAEzB,4BAA6B,CAH7B,4CAA6C,CAF7C,sFAAuF,CADvF,oFAAqF,CASrF,qBAAsB,CAdtB,QAAS,CAJT,QAAS,CAGT,SAAU,CADV,OAAQ,CAKR,mCAAoC,CACpC,yBAA0B,CAH1B,OAcD,CAGD,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,yCACC,GAGC,QAAS,CAFT,SAAU,CACV,OAED,CACA,IAEC,QAAS,CADT,UAED,CACA,GAGC,YAAc,CAFd,SAAU,CACV,UAED,CACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-image-upload-complete-icon {\\n\\tdisplay: block;\\n\\tposition: absolute;\\n\\n\\t/*\\n\\t * Smaller images should have the icon closer to the border.\\n\\t * Match the icon position with the linked image indicator brought by the link image feature.\\n\\t */\\n\\ttop: min(var(--ck-spacing-medium), 6%);\\n\\tright: min(var(--ck-spacing-medium), 6%);\\n\\tborder-radius: 50%;\\n\\tz-index: 1;\\n\\n\\t&::after {\\n\\t\\tcontent: \\\"\\\";\\n\\t\\tposition: absolute;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-image-upload-icon: hsl(0, 0%, 100%);\\n\\t--ck-color-image-upload-icon-background: hsl(120, 100%, 27%);\\n\\n\\t/* Match the icon size with the linked image indicator brought by the link image feature. */\\n\\t--ck-image-upload-icon-size: 20;\\n\\t--ck-image-upload-icon-width: 2px;\\n\\t--ck-image-upload-icon-is-visible: clamp(0px, 100% - 50px, 1px);\\n}\\n\\n.ck-image-upload-complete-icon {\\n\\topacity: 0;\\n\\tbackground: var(--ck-color-image-upload-icon-background);\\n\\tanimation-name: ck-upload-complete-icon-show, ck-upload-complete-icon-hide;\\n\\tanimation-fill-mode: forwards, forwards;\\n\\tanimation-duration: 500ms, 500ms;\\n\\n\\t/* To make animation scalable. */\\n\\tfont-size: calc(1px * var(--ck-image-upload-icon-size));\\n\\n\\t/* Hide completed upload icon after 3 seconds. */\\n\\tanimation-delay: 0ms, 3000ms;\\n\\n\\t/*\\n\\t * Use CSS math to simulate container queries.\\n\\t * https://css-tricks.com/the-raven-technique-one-step-closer-to-container-queries/#what-about-showing-and-hiding-things\\n\\t */\\n\\toverflow: hidden;\\n\\twidth: calc(var(--ck-image-upload-icon-is-visible) * var(--ck-image-upload-icon-size));\\n\\theight: calc(var(--ck-image-upload-icon-is-visible) * var(--ck-image-upload-icon-size));\\n\\n\\t/* This is check icon element made from border-width mixed with animations. */\\n\\t&::after {\\n\\t\\t/* Because of border transformation we need to \\\"hard code\\\" left position. */\\n\\t\\tleft: 25%;\\n\\n\\t\\ttop: 50%;\\n\\t\\topacity: 0;\\n\\t\\theight: 0;\\n\\t\\twidth: 0;\\n\\n\\t\\ttransform: scaleX(-1) rotate(135deg);\\n\\t\\ttransform-origin: left top;\\n\\t\\tborder-top: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\\n\\t\\tborder-right: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\\n\\n\\t\\tanimation-name: ck-upload-complete-icon-check;\\n\\t\\tanimation-duration: 500ms;\\n\\t\\tanimation-delay: 500ms;\\n\\t\\tanimation-fill-mode: forwards;\\n\\n\\t\\t/* #1095. While reset is not providing proper box-sizing for pseudoelements, we need to handle it. */\\n\\t\\tbox-sizing: border-box;\\n\\t}\\n}\\n\\n@keyframes ck-upload-complete-icon-show {\\n\\tfrom {\\n\\t\\topacity: 0;\\n\\t}\\n\\n\\tto {\\n\\t\\topacity: 1;\\n\\t}\\n}\\n\\n@keyframes ck-upload-complete-icon-hide {\\n\\tfrom {\\n\\t\\topacity: 1;\\n\\t}\\n\\n\\tto {\\n\\t\\topacity: 0;\\n\\t}\\n}\\n\\n@keyframes ck-upload-complete-icon-check {\\n\\t0% {\\n\\t\\topacity: 1;\\n\\t\\twidth: 0;\\n\\t\\theight: 0;\\n\\t}\\n\\t33% {\\n\\t\\twidth: 0.3em;\\n\\t\\theight: 0;\\n\\t}\\n\\t100% {\\n\\t\\topacity: 1;\\n\\t\\twidth: 0.3em;\\n\\t\\theight: 0.45em;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck .ck-upload-placeholder-loader{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:0}.ck .ck-upload-placeholder-loader:before{content:\\\"\\\";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px;--ck-upload-placeholder-image-aspect-ratio:2.8}.ck .ck-image-upload-placeholder{margin:0;width:100%}.ck .ck-image-upload-placeholder.image-inline{width:calc(var(--ck-upload-placeholder-loader-size)*2*var(--ck-upload-placeholder-image-aspect-ratio))}.ck .ck-image-upload-placeholder img{aspect-ratio:var(--ck-upload-placeholder-image-aspect-ratio)}.ck .ck-upload-placeholder-loader{height:100%;width:100%}.ck .ck-upload-placeholder-loader:before{animation:ck-upload-placeholder-loader 1s linear infinite;border-radius:50%;border-right:2px solid transparent;border-top:3px solid var(--ck-color-upload-placeholder-loader);height:var(--ck-upload-placeholder-loader-size);width:var(--ck-upload-placeholder-loader-size)}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./theme/imageuploadloader.css\",\"webpack://./../ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadloader.css\"],\"names\":[],\"mappings\":\"AAKA,kCAGC,kBAAmB,CADnB,YAAa,CAEb,sBAAuB,CAEvB,MAAO,CALP,iBAAkB,CAIlB,KAOD,CAJC,yCACC,UAAW,CACX,iBACD,CCXD,MACC,4CAAqD,CACrD,wCAAyC,CACzC,8CACD,CAEA,iCAGC,QAAS,CADT,UAgBD,CAbC,8CACC,sGACD,CAEA,qCAOC,4DACD,CAGD,kCAEC,WAAY,CADZ,UAWD,CARC,yCAMC,yDAA0D,CAH1D,iBAAkB,CAElB,kCAAmC,CADnC,8DAA+D,CAF/D,+CAAgD,CADhD,8CAMD,CAGD,wCACC,GACC,uBACD,CACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck .ck-upload-placeholder-loader {\\n\\tposition: absolute;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\n\\t&::before {\\n\\t\\tcontent: '';\\n\\t\\tposition: relative;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-upload-placeholder-loader: hsl(0, 0%, 70%);\\n\\t--ck-upload-placeholder-loader-size: 32px;\\n\\t--ck-upload-placeholder-image-aspect-ratio: 2.8;\\n}\\n\\n.ck .ck-image-upload-placeholder {\\n\\t/* We need to control the full width of the SVG gray background. */\\n\\twidth: 100%;\\n\\tmargin: 0;\\n\\n\\t&.image-inline {\\n\\t\\twidth: calc( 2 * var(--ck-upload-placeholder-loader-size) * var(--ck-upload-placeholder-image-aspect-ratio) );\\n\\t}\\n\\n\\t& img {\\n\\t\\t/*\\n\\t\\t * This is an arbitrary aspect for a 1x1 px GIF to display to the user. Not too tall, not too short.\\n\\t\\t * There's nothing special about this number except that it should make the image placeholder look like\\n\\t\\t * a real image during this short period after the upload started and before the image was read from the\\n\\t\\t * file system (and a rich preview was loaded).\\n\\t\\t */\\n\\t\\taspect-ratio: var(--ck-upload-placeholder-image-aspect-ratio);\\n\\t}\\n}\\n\\n.ck .ck-upload-placeholder-loader {\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\n\\t&::before {\\n\\t\\twidth: var(--ck-upload-placeholder-loader-size);\\n\\t\\theight: var(--ck-upload-placeholder-loader-size);\\n\\t\\tborder-radius: 50%;\\n\\t\\tborder-top: 3px solid var(--ck-color-upload-placeholder-loader);\\n\\t\\tborder-right: 2px solid transparent;\\n\\t\\tanimation: ck-upload-placeholder-loader 1s linear infinite;\\n\\t}\\n}\\n\\n@keyframes ck-upload-placeholder-loader {\\n\\tto {\\n\\t\\ttransform: rotate( 360deg );\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-editor__editable .image,.ck.ck-editor__editable .image-inline{position:relative}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{left:0;position:absolute;top:0}.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:fadeIn .7s}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{background:var(--ck-color-upload-bar-background);height:2px;transition:width .1s;width:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./theme/imageuploadprogress.css\",\"webpack://./../ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadprogress.css\"],\"names\":[],\"mappings\":\"AAMC,qEAEC,iBACD,CAGA,uGAIC,MAAO,CAFP,iBAAkB,CAClB,KAED,CCRC,yFACC,oBACD,CAID,uGAIC,gDAAiD,CAFjD,UAAW,CAGX,oBAAuB,CAFvB,OAGD,CAGD,kBACC,GAAO,SAAY,CACnB,GAAO,SAAY,CACpB\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-editor__editable {\\n\\t& .image,\\n\\t& .image-inline {\\n\\t\\tposition: relative;\\n\\t}\\n\\n\\t/* Upload progress bar. */\\n\\t& .image .ck-progress-bar,\\n\\t& .image-inline .ck-progress-bar {\\n\\t\\tposition: absolute;\\n\\t\\ttop: 0;\\n\\t\\tleft: 0;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-editor__editable {\\n\\t& .image,\\n\\t& .image-inline {\\n\\t\\t/* Showing animation. */\\n\\t\\t&.ck-appear {\\n\\t\\t\\tanimation: fadeIn 700ms;\\n\\t\\t}\\n\\t}\\n\\n\\t/* Upload progress bar. */\\n\\t& .image .ck-progress-bar,\\n\\t& .image-inline .ck-progress-bar {\\n\\t\\theight: 2px;\\n\\t\\twidth: 0;\\n\\t\\tbackground: var(--ck-color-upload-bar-background);\\n\\t\\ttransition: width 100ms;\\n\\t}\\n}\\n\\n@keyframes fadeIn {\\n\\tfrom { opacity: 0; }\\n\\tto { opacity: 1; }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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%}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./theme/textalternativeform.css\",\"webpack://./../ckeditor5-ui/theme/mixins/_rwd.css\"],\"names\":[],\"mappings\":\"AAOA,6BACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,oDACC,oBACD,CAEA,uCACC,YACD,CCZA,oCDCD,6BAcE,cAUF,CARE,oDACC,eACD,CAEA,wCACC,cACD,CCrBD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n\\n.ck.ck-text-alternative-form {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tflex-wrap: nowrap;\\n\\n\\t& .ck-labeled-field-view {\\n\\t\\tdisplay: inline-block;\\n\\t}\\n\\n\\t& .ck-label {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n\\t@mixin ck-media-phone {\\n\\t\\tflex-wrap: wrap;\\n\\n\\t\\t& .ck-labeled-field-view {\\n\\t\\t\\tflex-basis: 100%;\\n\\t\\t}\\n\\n\\t\\t& .ck-button {\\n\\t\\t\\tflex-basis: 50%;\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@define-mixin ck-media-phone {\\n\\t@media screen and (max-width: 600px) {\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-vertical-form .ck-button:after{bottom:-1px;content:\\\"\\\";position:absolute;right:-1px;top:-1px;width:0;z-index:1}.ck-vertical-form .ck-button:focus:after{display:none}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{bottom:-1px;content:\\\"\\\";position:absolute;right:-1px;top:-1px;width:0;z-index:1}.ck.ck-responsive-form .ck-button:focus:after{display:none}}.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-width)*.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:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){border-radius:0;margin-top:var(--ck-spacing-large);padding:var(--ck-spacing-standard)}.ck.ck-responsive-form>.ck-button:last-child:not(:focus),.ck.ck-responsive-form>.ck-button:nth-last-child(2):not(:focus){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}[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)}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../ckeditor5-ui/theme/components/responsive-form/responsiveform.css\",\"webpack://./../ckeditor5-ui/theme/mixins/_rwd.css\",\"webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/responsive-form/responsiveform.css\"],\"names\":[],\"mappings\":\"AAQC,mCAMC,WAAY,CALZ,UAAW,CAEX,iBAAkB,CAClB,UAAW,CACX,QAAS,CAHT,OAAQ,CAKR,SACD,CAEA,yCACC,YACD,CCdA,oCDoBE,wCAMC,WAAY,CALZ,UAAW,CAEX,iBAAkB,CAClB,UAAW,CACX,QAAS,CAHT,OAAQ,CAKR,SACD,CAEA,8CACC,YACD,CC9BF,CCAD,qDACC,kDACD,CAEA,uBACC,+BAmED,CAjEC,6BAEC,YACD,CASC,uGACC,sCACD,CDvBD,oCCMD,uBAqBE,SAAU,CACV,oCA8CF,CA5CE,8CACC,wDAWD,CATC,6DACC,WAAY,CACZ,UACD,CAGA,4EACC,kBACD,CAKA,0DACC,kDACD,CAGD,iGAIC,eAAgB,CADhB,kCAAmC,CADnC,kCAmBD,CAfC,yHACC,gDACD,CARD,0OAeE,aAMF,CAJE,+IACC,kDACD,CDpEH\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n\\n.ck-vertical-form .ck-button {\\n\\t&::after {\\n\\t\\tcontent: \\\"\\\";\\n\\t\\twidth: 0;\\n\\t\\tposition: absolute;\\n\\t\\tright: -1px;\\n\\t\\ttop: -1px;\\n\\t\\tbottom: -1px;\\n\\t\\tz-index: 1;\\n\\t}\\n\\n\\t&:focus::after {\\n\\t\\tdisplay: none;\\n\\t}\\n}\\n\\n.ck.ck-responsive-form {\\n\\t@mixin ck-media-phone {\\n\\t\\t& .ck-button {\\n\\t\\t\\t&::after {\\n\\t\\t\\t\\tcontent: \\\"\\\";\\n\\t\\t\\t\\twidth: 0;\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\tright: -1px;\\n\\t\\t\\t\\ttop: -1px;\\n\\t\\t\\t\\tbottom: -1px;\\n\\t\\t\\t\\tz-index: 1;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&:focus::after {\\n\\t\\t\\t\\tdisplay: none;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@define-mixin ck-media-phone {\\n\\t@media screen and (max-width: 600px) {\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n\\n.ck-vertical-form > .ck-button:nth-last-child(2)::after {\\n\\tborder-right: 1px solid var(--ck-color-base-border);\\n}\\n\\n.ck.ck-responsive-form {\\n\\tpadding: var(--ck-spacing-large);\\n\\n\\t&:focus {\\n\\t\\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\\n\\t\\toutline: none;\\n\\t}\\n\\n\\t@mixin ck-dir ltr {\\n\\t\\t& > :not(:first-child) {\\n\\t\\t\\tmargin-left: var(--ck-spacing-standard);\\n\\t\\t}\\n\\t}\\n\\n\\t@mixin ck-dir rtl {\\n\\t\\t& > :not(:last-child) {\\n\\t\\t\\tmargin-left: var(--ck-spacing-standard);\\n\\t\\t}\\n\\t}\\n\\n\\t@mixin ck-media-phone {\\n\\t\\tpadding: 0;\\n\\t\\twidth: calc(.8 * var(--ck-input-width));\\n\\n\\t\\t& .ck-labeled-field-view {\\n\\t\\t\\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) 0;\\n\\n\\t\\t\\t& .ck-input-text {\\n\\t\\t\\t\\tmin-width: 0;\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t}\\n\\n\\t\\t\\t/* Let the long error messages wrap in the narrow form. */\\n\\t\\t\\t& .ck-labeled-field-view__error {\\n\\t\\t\\t\\twhite-space: normal;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t/* Styles for two last buttons in the form (save&cancel, edit&unlink, etc.). */\\n\\t\\t& > .ck-button:nth-last-child(2) {\\n\\t\\t\\t&::after {\\n\\t\\t\\t\\tborder-right: 1px solid var(--ck-color-base-border);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t& > .ck-button:nth-last-child(1),\\n\\t\\t& > .ck-button:nth-last-child(2) {\\n\\t\\t\\tpadding: var(--ck-spacing-standard);\\n\\t\\t\\tmargin-top: var(--ck-spacing-large);\\n\\t\\t\\tborder-radius: 0;\\n\\n\\t\\t\\t&:not(:focus) {\\n\\t\\t\\t\\tborder-top: 1px solid var(--ck-color-base-border);\\n\\t\\t\\t}\\n\\n\\t\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t\\tmargin-left: 0;\\n\\t\\t\\t}\\n\\n\\t\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t\\tmargin-left: 0;\\n\\n\\t\\t\\t\\t&:last-of-type {\\n\\t\\t\\t\\t\\tborder-right: 1px solid var(--ck-color-base-border);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (cssWithMappingToString) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item);\n\n if (item[2]) {\n return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n }\n\n return content;\n }).join(\"\");\n }; // import a list of modules into the list\n // eslint-disable-next-line func-names\n\n\n list.i = function (modules, mediaQuery, dedupe) {\n if (typeof modules === \"string\") {\n // eslint-disable-next-line no-param-reassign\n modules = [[null, modules, \"\"]];\n }\n\n var alreadyImportedModules = {};\n\n if (dedupe) {\n for (var i = 0; i < this.length; i++) {\n // eslint-disable-next-line prefer-destructuring\n var id = this[i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n\n for (var _i = 0; _i < modules.length; _i++) {\n var item = [].concat(modules[_i]);\n\n if (dedupe && alreadyImportedModules[item[0]]) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (mediaQuery) {\n if (!item[2]) {\n item[2] = mediaQuery;\n } else {\n item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n }\n }\n\n list.push(item);\n }\n };\n\n return list;\n};","\"use strict\";\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _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.\"); }\n\nfunction _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); }\n\nfunction _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; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr && (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; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nmodule.exports = function cssWithMappingToString(item) {\n var _item = _slicedToArray(item, 4),\n content = _item[1],\n cssMapping = _item[3];\n\n if (!cssMapping) {\n return content;\n }\n\n if (typeof btoa === \"function\") {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n var sourceURLs = cssMapping.sources.map(function (source) {\n return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || \"\").concat(source, \" */\");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join(\"\\n\");\n }\n\n return [content].join(\"\\n\");\n};","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./image.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imagecaption.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imageinsert.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imageinsertformrowview.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imageresize.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imagestyle.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imageuploadicon.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imageuploadloader.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imageuploadprogress.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./textalternativeform.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./responsiveform.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","\"use strict\";\n\nvar isOldIE = function isOldIE() {\n var memo;\n return function memorize() {\n if (typeof memo === 'undefined') {\n // Test for IE <= 9 as proposed by Browserhacks\n // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n // Tests for existence of standard globals is to allow style-loader\n // to operate correctly into non-standard environments\n // @see https://github.com/webpack-contrib/style-loader/issues/177\n memo = Boolean(window && document && document.all && !window.atob);\n }\n\n return memo;\n };\n}();\n\nvar getTarget = function getTarget() {\n var memo = {};\n return function memorize(target) {\n if (typeof memo[target] === 'undefined') {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n\n for (var i = 0; i < stylesInDom.length; i++) {\n if (stylesInDom[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n\n return result;\n}\n\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var index = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3]\n };\n\n if (index !== -1) {\n stylesInDom[index].references++;\n stylesInDom[index].updater(obj);\n } else {\n stylesInDom.push({\n identifier: identifier,\n updater: addStyle(obj, options),\n references: 1\n });\n }\n\n identifiers.push(identifier);\n }\n\n return identifiers;\n}\n\nfunction insertStyleElement(options) {\n var style = document.createElement('style');\n var attributes = options.attributes || {};\n\n if (typeof attributes.nonce === 'undefined') {\n var nonce = typeof __webpack_nonce__ !== 'undefined' ? __webpack_nonce__ : null;\n\n if (nonce) {\n attributes.nonce = nonce;\n }\n }\n\n Object.keys(attributes).forEach(function (key) {\n style.setAttribute(key, attributes[key]);\n });\n\n if (typeof options.insert === 'function') {\n options.insert(style);\n } else {\n var target = getTarget(options.insert || 'head');\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n }\n\n return style;\n}\n\nfunction removeStyleElement(style) {\n // istanbul ignore if\n if (style.parentNode === null) {\n return false;\n }\n\n style.parentNode.removeChild(style);\n}\n/* istanbul ignore next */\n\n\nvar replaceText = function replaceText() {\n var textStore = [];\n return function replace(index, replacement) {\n textStore[index] = replacement;\n return textStore.filter(Boolean).join('\\n');\n };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n /* istanbul ignore if */\n\n if (style.styleSheet) {\n style.styleSheet.cssText = replaceText(index, css);\n } else {\n var cssNode = document.createTextNode(css);\n var childNodes = style.childNodes;\n\n if (childNodes[index]) {\n style.removeChild(childNodes[index]);\n }\n\n if (childNodes.length) {\n style.insertBefore(cssNode, childNodes[index]);\n } else {\n style.appendChild(cssNode);\n }\n }\n}\n\nfunction applyToTag(style, options, obj) {\n var css = obj.css;\n var media = obj.media;\n var sourceMap = obj.sourceMap;\n\n if (media) {\n style.setAttribute('media', media);\n } else {\n style.removeAttribute('media');\n }\n\n if (sourceMap && typeof btoa !== 'undefined') {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n while (style.firstChild) {\n style.removeChild(style.firstChild);\n }\n\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n var style;\n var update;\n var remove;\n\n if (options.singleton) {\n var styleIndex = singletonCounter++;\n style = singleton || (singleton = insertStyleElement(options));\n update = applyToSingletonTag.bind(null, style, styleIndex, false);\n remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n } else {\n style = insertStyleElement(options);\n update = applyToTag.bind(null, style, options);\n\n remove = function remove() {\n removeStyleElement(style);\n };\n }\n\n update(obj);\n return function updateStyle(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n return;\n }\n\n update(obj = newObj);\n } else {\n remove();\n }\n };\n}\n\nmodule.exports = function (list, options) {\n options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n // tags it will allow on a page\n\n if (!options.singleton && typeof options.singleton !== 'boolean') {\n options.singleton = isOldIE();\n }\n\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n\n if (Object.prototype.toString.call(newList) !== '[object Array]') {\n return;\n }\n\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDom[index].references--;\n }\n\n var newLastIdentifiers = modulesToDom(newList, options);\n\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n\n var _index = getIndexByIdentifier(_identifier);\n\n if (stylesInDom[_index].references === 0) {\n stylesInDom[_index].updater();\n\n stylesInDom.splice(_index, 1);\n }\n }\n\n lastIdentifiers = newLastIdentifiers;\n };\n};","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/autoimage\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { Clipboard } from 'ckeditor5/src/clipboard';\nimport { LivePosition, LiveRange } from 'ckeditor5/src/engine';\nimport { Undo } from 'ckeditor5/src/undo';\nimport { Delete } from 'ckeditor5/src/typing';\nimport { global } from 'ckeditor5/src/utils';\n\nimport ImageUtils from './imageutils';\n\n// Implements the pattern: http(s)://(www.)example.com/path/to/resource.ext?query=params&maybe=too.\nconst IMAGE_URL_REGEXP = new RegExp( String( /^(http(s)?:\\/\\/)?[\\w-]+\\.[\\w.~:/[\\]@!$&'()*+,;=%-]+/.source +\n\t/\\.(jpg|jpeg|png|gif|ico|webp|JPG|JPEG|PNG|GIF|ICO|WEBP)/.source +\n\t/(\\?[\\w.~:/[\\]@!$&'()*+,;=%-]*)?/.source +\n\t/(#[\\w.~:/[\\]@!$&'()*+,;=%-]*)?$/.source ) );\n\n/**\n * The auto-image plugin. It recognizes image links in the pasted content and embeds\n * them shortly after they are injected into the document.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class AutoImage extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ Clipboard, ImageUtils, Undo, Delete ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'AutoImage';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor ) {\n\t\tsuper( editor );\n\n\t\t/**\n\t\t * The paste–to–embed `setTimeout` ID. Stored as a property to allow\n\t\t * cleaning of the timeout.\n\t\t *\n\t\t * @private\n\t\t * @member {Number} #_timeoutId\n\t\t */\n\t\tthis._timeoutId = null;\n\n\t\t/**\n\t\t * The position where the `<imageBlock>` element will be inserted after the timeout,\n\t\t * determined each time a new content is pasted into the document.\n\t\t *\n\t\t * @private\n\t\t * @member {module:engine/model/liveposition~LivePosition} #_positionToInsert\n\t\t */\n\t\tthis._positionToInsert = null;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst modelDocument = editor.model.document;\n\n\t\t// We need to listen on `Clipboard#inputTransformation` because we need to save positions of selection.\n\t\t// After pasting, the content between those positions will be checked for a URL that could be transformed\n\t\t// into an image.\n\t\tthis.listenTo( editor.plugins.get( 'ClipboardPipeline' ), 'inputTransformation', () => {\n\t\t\tconst firstRange = modelDocument.selection.getFirstRange();\n\n\t\t\tconst leftLivePosition = LivePosition.fromPosition( firstRange.start );\n\t\t\tleftLivePosition.stickiness = 'toPrevious';\n\n\t\t\tconst rightLivePosition = LivePosition.fromPosition( firstRange.end );\n\t\t\trightLivePosition.stickiness = 'toNext';\n\n\t\t\tmodelDocument.once( 'change:data', () => {\n\t\t\t\tthis._embedImageBetweenPositions( leftLivePosition, rightLivePosition );\n\n\t\t\t\tleftLivePosition.detach();\n\t\t\t\trightLivePosition.detach();\n\t\t\t}, { priority: 'high' } );\n\t\t} );\n\n\t\teditor.commands.get( 'undo' ).on( 'execute', () => {\n\t\t\tif ( this._timeoutId ) {\n\t\t\t\tglobal.window.clearTimeout( this._timeoutId );\n\t\t\t\tthis._positionToInsert.detach();\n\n\t\t\t\tthis._timeoutId = null;\n\t\t\t\tthis._positionToInsert = null;\n\t\t\t}\n\t\t}, { priority: 'high' } );\n\t}\n\n\t/**\n\t * Analyzes the part of the document between provided positions in search for a URL representing an image.\n\t * When the URL is found, it is automatically converted into an image.\n\t *\n\t * @protected\n\t * @param {module:engine/model/liveposition~LivePosition} leftPosition Left position of the selection.\n\t * @param {module:engine/model/liveposition~LivePosition} rightPosition Right position of the selection.\n\t */\n\t_embedImageBetweenPositions( leftPosition, rightPosition ) {\n\t\tconst editor = this.editor;\n\t\t// TODO: Use a marker instead of LiveRange & LivePositions.\n\t\tconst urlRange = new LiveRange( leftPosition, rightPosition );\n\t\tconst walker = urlRange.getWalker( { ignoreElementEnd: true } );\n\t\tconst selectionAttributes = Object.fromEntries( editor.model.document.selection.getAttributes() );\n\t\tconst imageUtils = this.editor.plugins.get( 'ImageUtils' );\n\n\t\tlet src = '';\n\n\t\tfor ( const node of walker ) {\n\t\t\tif ( node.item.is( '$textProxy' ) ) {\n\t\t\t\tsrc += node.item.data;\n\t\t\t}\n\t\t}\n\n\t\tsrc = src.trim();\n\n\t\t// If the URL does not match the image URL regexp, let's skip that.\n\t\tif ( !src.match( IMAGE_URL_REGEXP ) ) {\n\t\t\turlRange.detach();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Position will not be available in the `setTimeout` function so let's clone it.\n\t\tthis._positionToInsert = LivePosition.fromPosition( leftPosition );\n\n\t\t// This action mustn't be executed if undo was called between pasting and auto-embedding.\n\t\tthis._timeoutId = global.window.setTimeout( () => {\n\t\t\t// Do nothing if image element cannot be inserted at the current position.\n\t\t\t// See https://github.com/ckeditor/ckeditor5/issues/2763.\n\t\t\t// Condition must be checked after timeout - pasting may take place on an element, replacing it. The final position matters.\n\t\t\tconst imageCommand = editor.commands.get( 'insertImage' );\n\n\t\t\tif ( !imageCommand.isEnabled ) {\n\t\t\t\turlRange.detach();\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\teditor.model.change( writer => {\n\t\t\t\tthis._timeoutId = null;\n\n\t\t\t\twriter.remove( urlRange );\n\t\t\t\turlRange.detach();\n\n\t\t\t\tlet insertionPosition;\n\n\t\t\t\t// Check if the position where the element should be inserted is still valid.\n\t\t\t\t// Otherwise leave it as undefined to use the logic of insertImage().\n\t\t\t\tif ( this._positionToInsert.root.rootName !== '$graveyard' ) {\n\t\t\t\t\tinsertionPosition = this._positionToInsert.toPosition();\n\t\t\t\t}\n\n\t\t\t\timageUtils.insertImage( { ...selectionAttributes, src }, insertionPosition );\n\n\t\t\t\tthis._positionToInsert.detach();\n\t\t\t\tthis._positionToInsert = null;\n\t\t\t} );\n\n\t\t\teditor.plugins.get( 'Delete' ).requestUndoOnBackspace();\n\t\t}, 100 );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/image\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\n\nimport ImageBlock from './imageblock';\nimport ImageInline from './imageinline';\n\nimport '../theme/image.css';\n\n/**\n * The image plugin.\n *\n * For a detailed overview, check the {@glink features/images/images-overview image feature} documentation.\n *\n * This is a \"glue\" plugin which loads the following plugins:\n *\n * * {@link module:image/imageblock~ImageBlock},\n * * {@link module:image/imageinline~ImageInline},\n *\n * Usually, it is used in conjunction with other plugins from this package. See the {@glink api/image package page}\n * for more information.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class Image extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageBlock, ImageInline ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'Image';\n\t}\n}\n\n/**\n * The configuration of the image features. Used by the image features in the `@ckeditor/ckeditor5-image` package.\n *\n * Read more in {@link module:image/image~ImageConfig}.\n *\n * @member {module:image/image~ImageConfig} module:core/editor/editorconfig~EditorConfig#image\n */\n\n/**\n * The configuration of the image features. Used by the image features in the `@ckeditor/ckeditor5-image` package.\n *\n *\t\tClassicEditor\n *\t\t\t.create( editorElement, {\n * \t\t\t\timage: ... // Image feature options.\n *\t\t\t} )\n *\t\t\t.then( ... )\n *\t\t\t.catch( ... );\n *\n * See {@link module:core/editor/editorconfig~EditorConfig all editor options}.\n *\n * @interface ImageConfig\n */\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/image/converters\n */\n\nimport { first } from 'ckeditor5/src/utils';\n\n/**\n * Returns a function that converts the image view representation:\n *\n *\t\t<figure class=\"image\"><img src=\"...\" alt=\"...\"></img></figure>\n *\n * to the model representation:\n *\n *\t\t<imageBlock src=\"...\" alt=\"...\"></imageBlock>\n *\n * The entire content of the `<figure>` element except the first `<img>` is being converted as children\n * of the `<imageBlock>` model element.\n *\n * @protected\n * @param {module:image/imageutils~ImageUtils} imageUtils\n * @returns {Function}\n */\nexport function upcastImageFigure( imageUtils ) {\n\treturn dispatcher => {\n\t\tdispatcher.on( 'element:figure', converter );\n\t};\n\n\tfunction converter( evt, data, conversionApi ) {\n\t\t// Do not convert if this is not an \"image figure\".\n\t\tif ( !conversionApi.consumable.test( data.viewItem, { name: true, classes: 'image' } ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Find an image element inside the figure element.\n\t\tconst viewImage = imageUtils.findViewImgElement( data.viewItem );\n\n\t\t// Do not convert if image element is absent or was already converted.\n\t\tif ( !viewImage || !conversionApi.consumable.test( viewImage, { name: true } ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Consume the figure to prevent other converters from processing it again.\n\t\tconversionApi.consumable.consume( data.viewItem, { name: true, classes: 'image' } );\n\n\t\t// Convert view image to model image.\n\t\tconst conversionResult = conversionApi.convertItem( viewImage, data.modelCursor );\n\n\t\t// Get image element from conversion result.\n\t\tconst modelImage = first( conversionResult.modelRange.getItems() );\n\n\t\t// When image wasn't successfully converted then finish conversion.\n\t\tif ( !modelImage ) {\n\t\t\t// Revert consumed figure so other features can convert it.\n\t\t\tconversionApi.consumable.revert( data.viewItem, { name: true, classes: 'image' } );\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Convert rest of the figure element's children as an image children.\n\t\tconversionApi.convertChildren( data.viewItem, modelImage );\n\n\t\tconversionApi.updateConversionResult( modelImage, data );\n\t}\n}\n\n/**\n * Returns a function that converts the image view representation:\n *\n *\t\t<picture><source ... /><source ... />...<img ... /></picture>\n *\n * to the model representation as the `sources` attribute:\n *\n *\t\t<image[Block|Inline] ... sources=\"...\"></image[Block|Inline]>\n *\n * @protected\n * @param {module:image/imageutils~ImageUtils} imageUtils\n * @returns {Function}\n */\nexport function upcastPicture( imageUtils ) {\n\tconst sourceAttributeNames = [ 'srcset', 'media', 'type', 'sizes' ];\n\n\treturn dispatcher => {\n\t\tdispatcher.on( 'element:picture', converter );\n\t};\n\n\tfunction converter( evt, data, conversionApi ) {\n\t\tconst pictureViewElement = data.viewItem;\n\n\t\t// Do not convert <picture> if already consumed.\n\t\tif ( !conversionApi.consumable.test( pictureViewElement, { name: true } ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst sources = new Map();\n\n\t\t// Collect all <source /> elements attribute values.\n\t\tfor ( const childSourceElement of pictureViewElement.getChildren() ) {\n\t\t\tif ( childSourceElement.is( 'element', 'source' ) ) {\n\t\t\t\tconst attributes = {};\n\n\t\t\t\tfor ( const name of sourceAttributeNames ) {\n\t\t\t\t\tif ( childSourceElement.hasAttribute( name ) ) {\n\t\t\t\t\t\t// Don't collect <source /> attribute if already consumed somewhere else.\n\t\t\t\t\t\tif ( conversionApi.consumable.test( childSourceElement, { attributes: name } ) ) {\n\t\t\t\t\t\t\tattributes[ name ] = childSourceElement.getAttribute( name );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( attributes ).length ) {\n\t\t\t\t\tsources.set( childSourceElement, attributes );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst imgViewElement = imageUtils.findViewImgElement( pictureViewElement );\n\n\t\t// Don't convert when a picture has no <img/> inside (it is broken).\n\t\tif ( !imgViewElement ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet modelImage = data.modelCursor.parent;\n\n\t\t// - In case of an inline image (cursor parent in a <paragraph>), the <img/> must be converted right away\n\t\t// because no converter handled it yet and otherwise there would be no model element to set the sources attribute on.\n\t\t// - In case of a block image, the <figure class=\"image\"> converter (in ImageBlockEditing) converts the\n\t\t// <img/> right away on its own and the modelCursor is already inside an imageBlock and there's nothing special\n\t\t// to do here.\n\t\tif ( !modelImage.is( 'element', 'imageBlock' ) ) {\n\t\t\tconst conversionResult = conversionApi.convertItem( imgViewElement, data.modelCursor );\n\n\t\t\t// Set image range as conversion result.\n\t\t\tdata.modelRange = conversionResult.modelRange;\n\n\t\t\t// Continue conversion where image conversion ends.\n\t\t\tdata.modelCursor = conversionResult.modelCursor;\n\n\t\t\tmodelImage = first( conversionResult.modelRange.getItems() );\n\t\t}\n\n\t\tconversionApi.consumable.consume( pictureViewElement, { name: true } );\n\n\t\t// Consume only these <source/> attributes that were actually collected and will be passed on\n\t\t// to the image model element.\n\t\tfor ( const [ sourceElement, attributes ] of sources ) {\n\t\t\tconversionApi.consumable.consume( sourceElement, { attributes: Object.keys( attributes ) } );\n\t\t}\n\n\t\tif ( sources.size ) {\n\t\t\tconversionApi.writer.setAttribute( 'sources', Array.from( sources.values() ), modelImage );\n\t\t}\n\n\t\t// Convert rest of the <picture> children as an image children. Other converters may want to consume them.\n\t\tconversionApi.convertChildren( pictureViewElement, modelImage );\n\t}\n}\n\n/**\n * Converter used to convert the `srcset` model image attribute to the `srcset`, `sizes` and `width` attributes in the view.\n *\n * @protected\n * @param {module:image/imageutils~ImageUtils} imageUtils\n * @param {'imageBlock'|'imageInline'} imageType The type of the image.\n * @returns {Function}\n */\nexport function downcastSrcsetAttribute( imageUtils, imageType ) {\n\treturn dispatcher => {\n\t\tdispatcher.on( `attribute:srcset:${ imageType }`, converter );\n\t};\n\n\tfunction converter( evt, data, conversionApi ) {\n\t\tif ( !conversionApi.consumable.consume( data.item, evt.name ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst writer = conversionApi.writer;\n\t\tconst element = conversionApi.mapper.toViewElement( data.item );\n\t\tconst img = imageUtils.findViewImgElement( element );\n\n\t\tif ( data.attributeNewValue === null ) {\n\t\t\tconst srcset = data.attributeOldValue;\n\n\t\t\tif ( srcset.data ) {\n\t\t\t\twriter.removeAttribute( 'srcset', img );\n\t\t\t\twriter.removeAttribute( 'sizes', img );\n\n\t\t\t\tif ( srcset.width ) {\n\t\t\t\t\twriter.removeAttribute( 'width', img );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst srcset = data.attributeNewValue;\n\n\t\t\tif ( srcset.data ) {\n\t\t\t\twriter.setAttribute( 'srcset', srcset.data, img );\n\t\t\t\t// Always outputting `100vw`. See https://github.com/ckeditor/ckeditor5-image/issues/2.\n\t\t\t\twriter.setAttribute( 'sizes', '100vw', img );\n\n\t\t\t\tif ( srcset.width ) {\n\t\t\t\t\twriter.setAttribute( 'width', srcset.width, img );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Converts the `source` model attribute to the `<picture><source /><source />...<img /></picture>`\n * view structure.\n *\n * @protected\n * @param {module:image/imageutils~ImageUtils} imageUtils\n * @returns {Function}\n */\nexport function downcastSourcesAttribute( imageUtils ) {\n\treturn dispatcher => {\n\t\tdispatcher.on( 'attribute:sources:imageBlock', converter );\n\t\tdispatcher.on( 'attribute:sources:imageInline', converter );\n\t};\n\n\tfunction converter( evt, data, conversionApi ) {\n\t\tif ( !conversionApi.consumable.consume( data.item, evt.name ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst viewWriter = conversionApi.writer;\n\t\tconst element = conversionApi.mapper.toViewElement( data.item );\n\t\tconst imgElement = imageUtils.findViewImgElement( element );\n\n\t\tif ( data.attributeNewValue && data.attributeNewValue.length ) {\n\t\t\t// Make sure <picture> does not break attribute elements, for instance <a> in linked images.\n\t\t\tconst pictureElement = viewWriter.createContainerElement( 'picture', null,\n\t\t\t\tdata.attributeNewValue.map( sourceAttributes => {\n\t\t\t\t\treturn viewWriter.createEmptyElement( 'source', sourceAttributes );\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\t// Collect all wrapping attribute elements.\n\t\t\tconst attributeElements = [];\n\t\t\tlet viewElement = imgElement.parent;\n\n\t\t\twhile ( viewElement && viewElement.is( 'attributeElement' ) ) {\n\t\t\t\tconst parentElement = viewElement.parent;\n\n\t\t\t\tviewWriter.unwrap( viewWriter.createRangeOn( imgElement ), viewElement );\n\n\t\t\t\tattributeElements.unshift( viewElement );\n\t\t\t\tviewElement = parentElement;\n\t\t\t}\n\n\t\t\t// Insert the picture and move img into it.\n\t\t\tviewWriter.insert( viewWriter.createPositionBefore( imgElement ), pictureElement );\n\t\t\tviewWriter.move( viewWriter.createRangeOn( imgElement ), viewWriter.createPositionAt( pictureElement, 'end' ) );\n\n\t\t\t// Apply collected attribute elements over the new picture element.\n\t\t\tfor ( const attributeElement of attributeElements ) {\n\t\t\t\tviewWriter.wrap( viewWriter.createRangeOn( pictureElement ), attributeElement );\n\t\t\t}\n\t\t}\n\t\t// Both setting \"sources\" to an empty array and removing the attribute should unwrap the <img />.\n\t\t// Unwrap once if the latter followed the former, though.\n\t\telse if ( imgElement.parent.is( 'element', 'picture' ) ) {\n\t\t\tconst pictureElement = imgElement.parent;\n\n\t\t\tviewWriter.move( viewWriter.createRangeOn( imgElement ), viewWriter.createPositionBefore( pictureElement ) );\n\t\t\tviewWriter.remove( pictureElement );\n\t\t}\n\t}\n}\n\n/**\n * Converter used to convert a given image attribute from the model to the view.\n *\n * @protected\n * @param {module:image/imageutils~ImageUtils} imageUtils\n * @param {'imageBlock'|'imageInline'} imageType The type of the image.\n * @param {String} attributeKey The name of the attribute to convert.\n * @returns {Function}\n */\nexport function downcastImageAttribute( imageUtils, imageType, attributeKey ) {\n\treturn dispatcher => {\n\t\tdispatcher.on( `attribute:${ attributeKey }:${ imageType }`, converter );\n\t};\n\n\tfunction converter( evt, data, conversionApi ) {\n\t\tif ( !conversionApi.consumable.consume( data.item, evt.name ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst viewWriter = conversionApi.writer;\n\t\tconst element = conversionApi.mapper.toViewElement( data.item );\n\t\tconst img = imageUtils.findViewImgElement( element );\n\n\t\tviewWriter.setAttribute( data.attributeKey, data.attributeNewValue || '', img );\n\t}\n}\n\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/image/imageblockediting\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { ClipboardPipeline } from 'ckeditor5/src/clipboard';\nimport { UpcastWriter } from 'ckeditor5/src/engine';\n\nimport {\n\tdowncastImageAttribute,\n\tdowncastSrcsetAttribute,\n\tupcastImageFigure\n} from './converters';\n\nimport ImageEditing from './imageediting';\nimport ImageTypeCommand from './imagetypecommand';\nimport ImageUtils from '../imageutils';\nimport {\n\tgetImgViewElementMatcher,\n\tcreateBlockImageViewElement,\n\tdetermineImageTypeForInsertionAtSelection\n} from '../image/utils';\n\n/**\n * The image block plugin.\n *\n * It registers:\n *\n * * `<imageBlock>` as a block element in the document schema, and allows `alt`, `src` and `srcset` attributes.\n * * converters for editing and data pipelines.,\n * * {@link module:image/image/imagetypecommand~ImageTypeCommand `'imageTypeBlock'`} command that converts inline images into\n * block images.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageBlockEditing extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageEditing, ImageUtils, ClipboardPipeline ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageBlockEditing';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst schema = editor.model.schema;\n\n\t\t// Converters 'alt' and 'srcset' are added in 'ImageEditing' plugin.\n\t\tschema.register( 'imageBlock', {\n\t\t\tinheritAllFrom: '$blockObject',\n\t\t\tallowAttributes: [ 'alt', 'src', 'srcset' ]\n\t\t} );\n\n\t\tthis._setupConversion();\n\n\t\tif ( editor.plugins.has( 'ImageInlineEditing' ) ) {\n\t\t\teditor.commands.add( 'imageTypeBlock', new ImageTypeCommand( this.editor, 'imageBlock' ) );\n\n\t\t\tthis._setupClipboardIntegration();\n\t\t}\n\t}\n\n\t/**\n\t * Configures conversion pipelines to support upcasting and downcasting\n\t * block images (block image widgets) and their attributes.\n\t *\n\t * @private\n\t */\n\t_setupConversion() {\n\t\tconst editor = this.editor;\n\t\tconst t = editor.t;\n\t\tconst conversion = editor.conversion;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\n\t\tconversion.for( 'dataDowncast' )\n\t\t\t.elementToStructure( {\n\t\t\t\tmodel: 'imageBlock',\n\t\t\t\tview: ( modelElement, { writer } ) => createBlockImageViewElement( writer )\n\t\t\t} );\n\n\t\tconversion.for( 'editingDowncast' )\n\t\t\t.elementToStructure( {\n\t\t\t\tmodel: 'imageBlock',\n\t\t\t\tview: ( modelElement, { writer } ) => imageUtils.toImageWidget(\n\t\t\t\t\tcreateBlockImageViewElement( writer ), writer, t( 'image widget' )\n\t\t\t\t)\n\t\t\t} );\n\n\t\tconversion.for( 'downcast' )\n\t\t\t.add( downcastImageAttribute( imageUtils, 'imageBlock', 'src' ) )\n\t\t\t.add( downcastImageAttribute( imageUtils, 'imageBlock', 'alt' ) )\n\t\t\t.add( downcastSrcsetAttribute( imageUtils, 'imageBlock' ) );\n\n\t\t// More image related upcasts are in 'ImageEditing' plugin.\n\t\tconversion.for( 'upcast' )\n\t\t\t.elementToElement( {\n\t\t\t\tview: getImgViewElementMatcher( editor, 'imageBlock' ),\n\t\t\t\tmodel: ( viewImage, { writer } ) => writer.createElement(\n\t\t\t\t\t'imageBlock',\n\t\t\t\t\tviewImage.hasAttribute( 'src' ) ? { src: viewImage.getAttribute( 'src' ) } : null\n\t\t\t\t)\n\t\t\t} )\n\t\t\t.add( upcastImageFigure( imageUtils ) );\n\t}\n\n\t/**\n\t * Integrates the plugin with the clipboard pipeline.\n\t *\n\t * Idea is that the feature should recognize the user's intent when an **inline** image is\n\t * pasted or dropped. If such an image is pasted/dropped:\n\t *\n\t * * into an empty block (e.g. an empty paragraph),\n\t * * on another object (e.g. some block widget).\n\t *\n\t * it gets converted into a block image on the fly. We assume this is the user's intent\n\t * if they decided to put their image there.\n\t *\n\t * See the `ImageInlineEditing` for the similar integration that works in the opposite direction.\n\t *\n\t * @private\n\t */\n\t_setupClipboardIntegration() {\n\t\tconst editor = this.editor;\n\t\tconst model = editor.model;\n\t\tconst editingView = editor.editing.view;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\n\t\tthis.listenTo( editor.plugins.get( 'ClipboardPipeline' ), 'inputTransformation', ( evt, data ) => {\n\t\t\tconst docFragmentChildren = Array.from( data.content.getChildren() );\n\t\t\tlet modelRange;\n\n\t\t\t// Make sure only <img> elements are dropped or pasted. Otherwise, if there some other HTML\n\t\t\t// mixed up, this should be handled as a regular paste.\n\t\t\tif ( !docFragmentChildren.every( imageUtils.isInlineImageView ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// When drag and dropping, data.targetRanges specifies where to drop because\n\t\t\t// this is usually a different place than the current model selection (the user\n\t\t\t// uses a drop marker to specify the drop location).\n\t\t\tif ( data.targetRanges ) {\n\t\t\t\tmodelRange = editor.editing.mapper.toModelRange( data.targetRanges[ 0 ] );\n\t\t\t}\n\t\t\t// Pasting, however, always occurs at the current model selection.\n\t\t\telse {\n\t\t\t\tmodelRange = model.document.selection.getFirstRange();\n\t\t\t}\n\n\t\t\tconst selection = model.createSelection( modelRange );\n\n\t\t\t// Convert inline images into block images only when the currently selected block is empty\n\t\t\t// (e.g. an empty paragraph) or some object is selected (to replace it).\n\t\t\tif ( determineImageTypeForInsertionAtSelection( model.schema, selection ) === 'imageBlock' ) {\n\t\t\t\tconst writer = new UpcastWriter( editingView.document );\n\n\t\t\t\t// Wrap <img ... /> -> <figure class=\"image\"><img .../></figure>\n\t\t\t\tconst blockViewImages = docFragmentChildren.map(\n\t\t\t\t\tinlineViewImage => writer.createElement( 'figure', { class: 'image' }, inlineViewImage )\n\t\t\t\t);\n\n\t\t\t\tdata.content = writer.createDocumentFragment( blockViewImages );\n\t\t\t}\n\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/image/imageediting\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport ImageLoadObserver from './imageloadobserver';\nimport InsertImageCommand from './insertimagecommand';\nimport ImageUtils from '../imageutils';\n\n/**\n * The image engine plugin. This module loads common code shared between\n * {@link module:image/image/imageinlineediting~ImageInlineEditing} and\n * {@link module:image/image/imageblockediting~ImageBlockEditing} plugins.\n *\n * This plugin registers the {@link module:image/image/insertimagecommand~InsertImageCommand 'insertImage'} command.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageEditing extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageUtils ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageEditing';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst conversion = editor.conversion;\n\n\t\t// See https://github.com/ckeditor/ckeditor5-image/issues/142.\n\t\teditor.editing.view.addObserver( ImageLoadObserver );\n\n\t\tconversion.for( 'upcast' )\n\t\t\t.attributeToAttribute( {\n\t\t\t\tview: {\n\t\t\t\t\tname: 'img',\n\t\t\t\t\tkey: 'alt'\n\t\t\t\t},\n\t\t\t\tmodel: 'alt'\n\t\t\t} )\n\t\t\t.attributeToAttribute( {\n\t\t\t\tview: {\n\t\t\t\t\tname: 'img',\n\t\t\t\t\tkey: 'srcset'\n\t\t\t\t},\n\t\t\t\tmodel: {\n\t\t\t\t\tkey: 'srcset',\n\t\t\t\t\tvalue: viewImage => {\n\t\t\t\t\t\tconst value = {\n\t\t\t\t\t\t\tdata: viewImage.getAttribute( 'srcset' )\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif ( viewImage.hasAttribute( 'width' ) ) {\n\t\t\t\t\t\t\tvalue.width = viewImage.getAttribute( 'width' );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\tconst insertImageCommand = new InsertImageCommand( editor );\n\n\t\t// Register `insertImage` command and add `imageInsert` command as an alias for backward compatibility.\n\t\teditor.commands.add( 'insertImage', insertImageCommand );\n\t\teditor.commands.add( 'imageInsert', insertImageCommand );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/image/imageinlineediting\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { ClipboardPipeline } from 'ckeditor5/src/clipboard';\nimport { UpcastWriter } from 'ckeditor5/src/engine';\n\nimport {\n\tdowncastImageAttribute,\n\tdowncastSrcsetAttribute\n} from './converters';\n\nimport ImageEditing from './imageediting';\nimport ImageTypeCommand from './imagetypecommand';\nimport ImageUtils from '../imageutils';\nimport {\n\tgetImgViewElementMatcher,\n\tcreateInlineImageViewElement,\n\tdetermineImageTypeForInsertionAtSelection\n} from '../image/utils';\n\n/**\n * The image inline plugin.\n *\n * It registers:\n *\n * * `<imageInline>` as an inline element in the document schema, and allows `alt`, `src` and `srcset` attributes.\n * * converters for editing and data pipelines.\n * * {@link module:image/image/imagetypecommand~ImageTypeCommand `'imageTypeInline'`} command that converts block images into\n * inline images.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageInlineEditing extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageEditing, ImageUtils, ClipboardPipeline ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageInlineEditing';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst schema = editor.model.schema;\n\n\t\t// Converters 'alt' and 'srcset' are added in 'ImageEditing' plugin.\n\t\tschema.register( 'imageInline', {\n\t\t\tinheritAllFrom: '$inlineObject',\n\t\t\tallowAttributes: [ 'alt', 'src', 'srcset' ]\n\t\t} );\n\n\t\t// Disallow inline images in captions (for now). This is the best spot to do that because\n\t\t// independent packages can introduce captions (ImageCaption, TableCaption, etc.) so better this\n\t\t// be future-proof.\n\t\tschema.addChildCheck( ( context, childDefinition ) => {\n\t\t\tif ( context.endsWith( 'caption' ) && childDefinition.name === 'imageInline' ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\n\t\tthis._setupConversion();\n\n\t\tif ( editor.plugins.has( 'ImageBlockEditing' ) ) {\n\t\t\teditor.commands.add( 'imageTypeInline', new ImageTypeCommand( this.editor, 'imageInline' ) );\n\n\t\t\tthis._setupClipboardIntegration();\n\t\t}\n\t}\n\n\t/**\n\t * Configures conversion pipelines to support upcasting and downcasting\n\t * inline images (inline image widgets) and their attributes.\n\t *\n\t * @private\n\t */\n\t_setupConversion() {\n\t\tconst editor = this.editor;\n\t\tconst t = editor.t;\n\t\tconst conversion = editor.conversion;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\n\t\tconversion.for( 'dataDowncast' )\n\t\t\t.elementToElement( {\n\t\t\t\tmodel: 'imageInline',\n\t\t\t\tview: ( modelElement, { writer } ) => writer.createEmptyElement( 'img' )\n\t\t\t} );\n\n\t\tconversion.for( 'editingDowncast' )\n\t\t\t.elementToStructure( {\n\t\t\t\tmodel: 'imageInline',\n\t\t\t\tview: ( modelElement, { writer } ) => imageUtils.toImageWidget(\n\t\t\t\t\tcreateInlineImageViewElement( writer ), writer, t( 'image widget' )\n\t\t\t\t)\n\t\t\t} );\n\n\t\tconversion.for( 'downcast' )\n\t\t\t.add( downcastImageAttribute( imageUtils, 'imageInline', 'src' ) )\n\t\t\t.add( downcastImageAttribute( imageUtils, 'imageInline', 'alt' ) )\n\t\t\t.add( downcastSrcsetAttribute( imageUtils, 'imageInline' ) );\n\n\t\t// More image related upcasts are in 'ImageEditing' plugin.\n\t\tconversion.for( 'upcast' )\n\t\t\t.elementToElement( {\n\t\t\t\tview: getImgViewElementMatcher( editor, 'imageInline' ),\n\t\t\t\tmodel: ( viewImage, { writer } ) => writer.createElement(\n\t\t\t\t\t'imageInline',\n\t\t\t\t\tviewImage.hasAttribute( 'src' ) ? { src: viewImage.getAttribute( 'src' ) } : null\n\t\t\t\t)\n\t\t\t} );\n\t}\n\n\t/**\n\t * Integrates the plugin with the clipboard pipeline.\n\t *\n\t * Idea is that the feature should recognize the user's intent when an **block** image is\n\t * pasted or dropped. If such an image is pasted/dropped into a non-empty block\n\t * (e.g. a paragraph with some text) it gets converted into an inline image on the fly.\n\t *\n\t * We assume this is the user's intent if they decided to put their image there.\n\t *\n\t * **Note**: If a block image has a caption, it will not be converted to an inline image\n\t * to avoid the confusion. Captions are added on purpose and they should never be lost\n\t * in the clipboard pipeline.\n\t *\n\t * See the `ImageBlockEditing` for the similar integration that works in the opposite direction.\n\t *\n\t * @private\n\t */\n\t_setupClipboardIntegration() {\n\t\tconst editor = this.editor;\n\t\tconst model = editor.model;\n\t\tconst editingView = editor.editing.view;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\n\t\tthis.listenTo( editor.plugins.get( 'ClipboardPipeline' ), 'inputTransformation', ( evt, data ) => {\n\t\t\tconst docFragmentChildren = Array.from( data.content.getChildren() );\n\t\t\tlet modelRange;\n\n\t\t\t// Make sure only <figure class=\"image\"></figure> elements are dropped or pasted. Otherwise, if there some other HTML\n\t\t\t// mixed up, this should be handled as a regular paste.\n\t\t\tif ( !docFragmentChildren.every( imageUtils.isBlockImageView ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// When drag and dropping, data.targetRanges specifies where to drop because\n\t\t\t// this is usually a different place than the current model selection (the user\n\t\t\t// uses a drop marker to specify the drop location).\n\t\t\tif ( data.targetRanges ) {\n\t\t\t\tmodelRange = editor.editing.mapper.toModelRange( data.targetRanges[ 0 ] );\n\t\t\t}\n\t\t\t// Pasting, however, always occurs at the current model selection.\n\t\t\telse {\n\t\t\t\tmodelRange = model.document.selection.getFirstRange();\n\t\t\t}\n\n\t\t\tconst selection = model.createSelection( modelRange );\n\n\t\t\t// Convert block images into inline images only when pasting or dropping into non-empty blocks\n\t\t\t// and when the block is not an object (e.g. pasting to replace another widget).\n\t\t\tif ( determineImageTypeForInsertionAtSelection( model.schema, selection ) === 'imageInline' ) {\n\t\t\t\tconst writer = new UpcastWriter( editingView.document );\n\n\t\t\t\t// Unwrap <figure class=\"image\"><img .../></figure> -> <img ... />\n\t\t\t\t// but <figure class=\"image\"><img .../><figcaption>...</figcaption></figure> -> stays the same\n\t\t\t\tconst inlineViewImages = docFragmentChildren.map( blockViewImage => {\n\t\t\t\t\t// If there's just one child, it can be either <img /> or <a><img></a>.\n\t\t\t\t\t// If there are other children than <img>, this means that the block image\n\t\t\t\t\t// has a caption or some other features and this kind of image should be\n\t\t\t\t\t// pasted/dropped without modifications.\n\t\t\t\t\tif ( blockViewImage.childCount === 1 ) {\n\t\t\t\t\t\t// Pass the attributes which are present only in the <figure> to the <img>\n\t\t\t\t\t\t// (e.g. the style=\"width:10%\" attribute applied by the ImageResize plugin).\n\t\t\t\t\t\tArray.from( blockViewImage.getAttributes() )\n\t\t\t\t\t\t\t.forEach( attribute => writer.setAttribute(\n\t\t\t\t\t\t\t\t...attribute,\n\t\t\t\t\t\t\t\timageUtils.findViewImgElement( blockViewImage )\n\t\t\t\t\t\t\t) );\n\n\t\t\t\t\t\treturn blockViewImage.getChild( 0 );\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn blockViewImage;\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tdata.content = writer.createDocumentFragment( inlineViewImages );\n\t\t\t}\n\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/image/imageloadobserver\n */\n\nimport { Observer } from 'ckeditor5/src/engine';\n\n/**\n * Observes all new images added to the {@link module:engine/view/document~Document},\n * fires {@link module:engine/view/document~Document#event:imageLoaded} and\n * {@link module:engine/view/document~Document#event:layoutChanged} event every time when the new image\n * has been loaded.\n *\n * **Note:** This event is not fired for images that has been added to the document and rendered as `complete` (already loaded).\n *\n * @extends module:engine/view/observer/observer~Observer\n */\nexport default class ImageLoadObserver extends Observer {\n\t/**\n\t * @inheritDoc\n\t */\n\tobserve( domRoot ) {\n\t\tthis.listenTo( domRoot, 'load', ( event, domEvent ) => {\n\t\t\tconst domElement = domEvent.target;\n\n\t\t\tif ( this.checkShouldIgnoreEventFromTarget( domElement ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( domElement.tagName == 'IMG' ) {\n\t\t\t\tthis._fireEvents( domEvent );\n\t\t\t}\n\t\t\t// Use capture phase for better performance (#4504).\n\t\t}, { useCapture: true } );\n\t}\n\n\t/**\n\t * Fires {@link module:engine/view/document~Document#event:layoutChanged} and\n\t * {@link module:engine/view/document~Document#event:imageLoaded}\n\t * if observer {@link #isEnabled is enabled}.\n\t *\n\t * @protected\n\t * @param {Event} domEvent The DOM event.\n\t */\n\t_fireEvents( domEvent ) {\n\t\tif ( this.isEnabled ) {\n\t\t\tthis.document.fire( 'layoutChanged' );\n\t\t\tthis.document.fire( 'imageLoaded', domEvent );\n\t\t}\n\t}\n}\n\n/**\n * Fired when an <img/> DOM element has been loaded in the DOM root.\n *\n * Introduced by {@link module:image/image/imageloadobserver~ImageLoadObserver}.\n *\n * @see module:image/image/imageloadobserver~ImageLoadObserver\n * @event module:engine/view/document~Document#event:imageLoaded\n * @param {module:engine/view/observer/domeventdata~DomEventData} data Event data.\n */\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/image/imagetypecommand\n */\n\nimport { Command } from 'ckeditor5/src/core';\n\n/**\n * The image type command. It changes the type of a selected image, depending on the configuration.\n *\n * @extends module:core/command~Command\n */\nexport default class ImageTypeCommand extends Command {\n\t/**\n\t * @inheritDoc\n\t *\n\t * @param {module:core/editor/editor~Editor} editor\n\t * @param {'imageBlock'|'imageInline'} modelElementName Model element name the command converts to.\n\t */\n\tconstructor( editor, modelElementName ) {\n\t\tsuper( editor );\n\n\t\t/**\n\t\t * Model element name the command converts to.\n\t\t *\n\t\t * @readonly\n\t\t * @private\n\t\t * @member {'imageBlock'|'imageInline'}\n\t\t */\n\t\tthis._modelElementName = modelElementName;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\trefresh() {\n\t\tconst editor = this.editor;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst element = imageUtils.getClosestSelectedImageElement( this.editor.model.document.selection );\n\n\t\tif ( this._modelElementName === 'imageBlock' ) {\n\t\t\tthis.isEnabled = imageUtils.isInlineImage( element );\n\t\t} else {\n\t\t\tthis.isEnabled = imageUtils.isBlockImage( element );\n\t\t}\n\t}\n\n\t/**\n\t * Executes the command and changes the type of a selected image.\n\t *\n\t * @fires execute\n\t * @returns {Object|null} An object containing references to old and new model image elements\n\t * (for before and after the change) so external integrations can hook into the decorated\n\t * `execute` event and handle this change. `null` if the type change failed.\n\t */\n\texecute() {\n\t\tconst editor = this.editor;\n\t\tconst model = this.editor.model;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst oldElement = imageUtils.getClosestSelectedImageElement( model.document.selection );\n\t\tconst attributes = Object.fromEntries( oldElement.getAttributes() );\n\n\t\t// Don't change image type if \"src\" is missing (a broken image), unless there's \"uploadId\" set.\n\t\t// This state may happen during image upload (before it finishes) and it should be possible to change type\n\t\t// of the image in the meantime.\n\t\tif ( !attributes.src && !attributes.uploadId ) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn model.change( writer => {\n\t\t\t// Get all markers that contain the old image element.\n\t\t\tconst markers = Array.from( model.markers )\n\t\t\t\t.filter( marker => marker.getRange().containsItem( oldElement ) );\n\n\t\t\tconst newElement = imageUtils.insertImage( attributes, model.createSelection( oldElement, 'on' ), this._modelElementName );\n\n\t\t\tif ( !newElement ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst newElementRange = writer.createRangeOn( newElement );\n\n\t\t\t// Expand the previously intersecting markers' ranges to include the new image element.\n\t\t\tfor ( const marker of markers ) {\n\t\t\t\tconst markerRange = marker.getRange();\n\n\t\t\t\t// Join the survived part of the old marker range with the new element range\n\t\t\t\t// (loosely because there could be some new paragraph or the existing one might got split).\n\t\t\t\tconst range = markerRange.root.rootName != '$graveyard' ?\n\t\t\t\t\tmarkerRange.getJoined( newElementRange, true ) : newElementRange;\n\n\t\t\t\twriter.updateMarker( marker, { range } );\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\toldElement,\n\t\t\t\tnewElement\n\t\t\t};\n\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\nimport { Command } from 'ckeditor5/src/core';\nimport { logWarning, toArray } from 'ckeditor5/src/utils';\n\n/**\n * @module image/image/insertimagecommand\n */\n\n/**\n * Insert image command.\n *\n * The command is registered by the {@link module:image/image/imageediting~ImageEditing} plugin as `insertImage`\n * and it is also available via aliased `imageInsert` name.\n *\n * In order to insert an image at the current selection position\n * (according to the {@link module:widget/utils~findOptimalInsertionRange} algorithm),\n * execute the command and specify the image source:\n *\n *\t\teditor.execute( 'insertImage', { source: 'http://url.to.the/image' } );\n *\n * It is also possible to insert multiple images at once:\n *\n *\t\teditor.execute( 'insertImage', {\n *\t\t\tsource: [\n *\t\t\t\t'path/to/image.jpg',\n *\t\t\t\t'path/to/other-image.jpg'\n *\t\t\t]\n *\t\t} );\n *\n * If you want to take the full control over the process, you can specify individual model attributes:\n *\n *\t\teditor.execute( 'insertImage', {\n *\t\t\tsource: [\n *\t\t\t\t{ src: 'path/to/image.jpg', alt: 'First alt text' },\n *\t\t\t\t{ src: 'path/to/other-image.jpg', alt: 'Second alt text', customAttribute: 'My attribute value' }\n *\t\t\t]\n *\t\t} );\n *\n * @extends module:core/command~Command\n */\nexport default class InsertImageCommand extends Command {\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor ) {\n\t\tsuper( editor );\n\n\t\tconst configImageInsertType = editor.config.get( 'image.insert.type' );\n\n\t\tif ( !editor.plugins.has( 'ImageBlockEditing' ) ) {\n\t\t\tif ( configImageInsertType === 'block' ) {\n\t\t\t\t/**\n\t\t\t\t * The {@link module:image/imageblock~ImageBlock} plugin must be enabled to allow inserting block images. See\n\t\t\t\t * {@link module:image/imageinsert~ImageInsertConfig#type} to learn more.\n\t\t\t\t *\n\t\t\t\t * @error image-block-plugin-required\n\t\t\t\t */\n\t\t\t\tlogWarning( 'image-block-plugin-required' );\n\t\t\t}\n\t\t}\n\n\t\tif ( !editor.plugins.has( 'ImageInlineEditing' ) ) {\n\t\t\tif ( configImageInsertType === 'inline' ) {\n\t\t\t\t/**\n\t\t\t\t * The {@link module:image/imageinline~ImageInline} plugin must be enabled to allow inserting inline images. See\n\t\t\t\t * {@link module:image/imageinsert~ImageInsertConfig#type} to learn more.\n\t\t\t\t *\n\t\t\t\t * @error image-inline-plugin-required\n\t\t\t\t */\n\t\t\t\tlogWarning( 'image-inline-plugin-required' );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\trefresh() {\n\t\tthis.isEnabled = this.editor.plugins.get( 'ImageUtils' ).isImageAllowed();\n\t}\n\n\t/**\n\t * Executes the command.\n\t *\n\t * @fires execute\n\t * @param {Object} options Options for the executed command.\n\t * @param {String|Array.<String>|Array.<Object>} options.source The image source or an array of image sources to insert.\n\t * See the documentation of the command to learn more about accepted formats.\n\t */\n\texecute( options ) {\n\t\tconst sourceDefinitions = toArray( options.source );\n\t\tconst selection = this.editor.model.document.selection;\n\t\tconst imageUtils = this.editor.plugins.get( 'ImageUtils' );\n\n\t\t// In case of multiple images, each image (starting from the 2nd) will be inserted at a position that\n\t\t// follows the previous one. That will move the selection and, to stay on the safe side and make sure\n\t\t// all images inherit the same selection attributes, they are collected beforehand.\n\t\t//\n\t\t// Applying these attributes ensures, for instance, that inserting an (inline) image into a link does\n\t\t// not split that link but preserves its continuity.\n\t\t//\n\t\t// Note: Selection attributes that do not make sense for images will be filtered out by insertImage() anyway.\n\t\tconst selectionAttributes = Object.fromEntries( selection.getAttributes() );\n\n\t\tsourceDefinitions.forEach( ( sourceDefinition, index ) => {\n\t\t\tconst selectedElement = selection.getSelectedElement();\n\n\t\t\tif ( typeof sourceDefinition === 'string' ) {\n\t\t\t\tsourceDefinition = { src: sourceDefinition };\n\t\t\t}\n\n\t\t\t// Inserting of an inline image replace the selected element and make a selection on the inserted image.\n\t\t\t// Therefore inserting multiple inline images requires creating position after each element.\n\t\t\tif ( index && selectedElement && imageUtils.isImage( selectedElement ) ) {\n\t\t\t\tconst position = this.editor.model.createPositionAfter( selectedElement );\n\n\t\t\t\timageUtils.insertImage( { ...sourceDefinition, ...selectionAttributes }, position );\n\t\t\t} else {\n\t\t\t\timageUtils.insertImage( { ...sourceDefinition, ...selectionAttributes } );\n\t\t\t}\n\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/image/ui/utils\n */\n\nimport { BalloonPanelView } from 'ckeditor5/src/ui';\n\n/**\n * A helper utility that positions the\n * {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon contextual balloon} instance\n * with respect to the image in the editor content, if one is selected.\n *\n * @param {module:core/editor/editor~Editor} editor The editor instance.\n */\nexport function repositionContextualBalloon( editor ) {\n\tconst balloon = editor.plugins.get( 'ContextualBalloon' );\n\n\tif ( editor.plugins.get( 'ImageUtils' ).getClosestSelectedImageWidget( editor.editing.view.document.selection ) ) {\n\t\tconst position = getBalloonPositionData( editor );\n\n\t\tballoon.updatePosition( position );\n\t}\n}\n\n/**\n * Returns the positioning options that control the geometry of the\n * {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon contextual balloon} with respect\n * to the selected element in the editor content.\n *\n * @param {module:core/editor/editor~Editor} editor The editor instance.\n * @returns {module:utils/dom/position~Options}\n */\nexport function getBalloonPositionData( editor ) {\n\tconst editingView = editor.editing.view;\n\tconst defaultPositions = BalloonPanelView.defaultPositions;\n\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\n\treturn {\n\t\ttarget: editingView.domConverter.mapViewToDom( imageUtils.getClosestSelectedImageWidget( editingView.document.selection ) ),\n\t\tpositions: [\n\t\t\tdefaultPositions.northArrowSouth,\n\t\t\tdefaultPositions.northArrowSouthWest,\n\t\t\tdefaultPositions.northArrowSouthEast,\n\t\t\tdefaultPositions.southArrowNorth,\n\t\t\tdefaultPositions.southArrowNorthWest,\n\t\t\tdefaultPositions.southArrowNorthEast,\n\t\t\tdefaultPositions.viewportStickyNorth\n\t\t]\n\t};\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/image/utils\n */\n\nimport { first } from 'ckeditor5/src/utils';\n\n/**\n * Creates a view element representing the inline image.\n *\n *\t\t<span class=\"image-inline\"><img></img></span>\n *\n * Note that `alt` and `src` attributes are converted separately, so they are not included.\n *\n * @protected\n * @param {module:engine/view/downcastwriter~DowncastWriter} writer\n * @returns {module:engine/view/containerelement~ContainerElement}\n */\nexport function createInlineImageViewElement( writer ) {\n\treturn writer.createContainerElement( 'span', { class: 'image-inline' },\n\t\twriter.createEmptyElement( 'img' )\n\t);\n}\n\n/**\n * Creates a view element representing the block image.\n *\n *\t\t<figure class=\"image\"><img></img></figure>\n *\n * Note that `alt` and `src` attributes are converted separately, so they are not included.\n *\n * @protected\n * @param {module:engine/view/downcastwriter~DowncastWriter} writer\n * @returns {module:engine/view/containerelement~ContainerElement}\n */\nexport function createBlockImageViewElement( writer ) {\n\treturn writer.createContainerElement( 'figure', { class: 'image' }, [\n\t\twriter.createEmptyElement( 'img' ),\n\t\twriter.createSlot()\n\t] );\n}\n\n/**\n * A function returning a `MatcherPattern` for a particular type of View images.\n *\n * @protected\n * @param {module:core/editor/editor~Editor} editor\n * @param {'imageBlock'|'imageInline'} matchImageType The type of created image.\n * @returns {module:engine/view/matcher~MatcherPattern}\n */\nexport function getImgViewElementMatcher( editor, matchImageType ) {\n\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\tconst areBothImagePluginsLoaded = editor.plugins.has( 'ImageInlineEditing' ) && editor.plugins.has( 'ImageBlockEditing' );\n\n\treturn element => {\n\t\t// Check if the matched view element is an <img>.\n\t\tif ( !imageUtils.isInlineImageView( element ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// If just one of the plugins is loaded (block or inline), it will match all kinds of images.\n\t\tif ( !areBothImagePluginsLoaded ) {\n\t\t\treturn getPositiveMatchPattern( element );\n\t\t}\n\n\t\t// The <img> can be standalone, wrapped in <figure>...</figure> (ImageBlock plugin) or\n\t\t// wrapped in <figure><a>...</a></figure> (LinkImage plugin).\n\t\tconst imageType = element.findAncestor( imageUtils.isBlockImageView ) ? 'imageBlock' : 'imageInline';\n\n\t\tif ( imageType !== matchImageType ) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn getPositiveMatchPattern( element );\n\t};\n\n\tfunction getPositiveMatchPattern( element ) {\n\t\tconst pattern = {\n\t\t\tname: true\n\t\t};\n\n\t\t// This will trigger src consumption (See https://github.com/ckeditor/ckeditor5/issues/11530).\n\t\tif ( element.hasAttribute( 'src' ) ) {\n\t\t\tpattern.attributes = [ 'src' ];\n\t\t}\n\n\t\treturn pattern;\n\t}\n}\n\n/**\n * Considering the current model selection, it returns the name of the model image element\n * (`'imageBlock'` or `'imageInline'`) that will make most sense from the UX perspective if a new\n * image was inserted (also: uploaded, dropped, pasted) at that selection.\n *\n * The assumption is that inserting images into empty blocks or on other block widgets should\n * produce block images. Inline images should be inserted in other cases, e.g. in paragraphs\n * that already contain some text.\n *\n * @protected\n * @param {module:engine/model/schema~Schema} schema\n * @param {module:engine/model/selection~Selection|module:engine/model/documentselection~DocumentSelection} selection\n * @returns {'imageBlock'|'imageInline'}\n */\nexport function determineImageTypeForInsertionAtSelection( schema, selection ) {\n\tconst firstBlock = first( selection.getSelectedBlocks() );\n\n\t// Insert a block image if the selection is not in/on block elements or it's on a block widget.\n\tif ( !firstBlock || schema.isObject( firstBlock ) ) {\n\t\treturn 'imageBlock';\n\t}\n\n\t// A block image should also be inserted into an empty block element\n\t// (that is not an empty list item so the list won't get split).\n\tif ( firstBlock.isEmpty && firstBlock.name != 'listItem' ) {\n\t\treturn 'imageBlock';\n\t}\n\n\t// Otherwise insert an inline image.\n\treturn 'imageInline';\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageblock\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { Widget } from 'ckeditor5/src/widget';\n\nimport ImageTextAlternative from './imagetextalternative';\nimport ImageBlockEditing from './image/imageblockediting';\n\nimport '../theme/image.css';\n\n/**\n * The image inline plugin.\n *\n * This is a \"glue\" plugin which loads the following plugins:\n *\n * * {@link module:image/image/imageblockediting~ImageBlockEditing},\n * * {@link module:image/imagetextalternative~ImageTextAlternative}.\n *\n * Usually, it is used in conjunction with other plugins from this package. See the {@glink api/image package page}\n * for more information.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageBlock extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageBlockEditing, Widget, ImageTextAlternative ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageBlock';\n\t}\n}\n\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagecaption\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport ImageCaptionEditing from './imagecaption/imagecaptionediting';\nimport ImageCaptionUI from './imagecaption/imagecaptionui';\n\nimport '../theme/imagecaption.css';\n\n/**\n * The image caption plugin.\n *\n * For a detailed overview, check the {@glink features/images/images-captions image caption} documentation.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageCaption extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageCaptionEditing, ImageCaptionUI ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageCaption';\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagecaption/imagecaptionediting\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { Element, enablePlaceholder } from 'ckeditor5/src/engine';\nimport { toWidgetEditable } from 'ckeditor5/src/widget';\n\nimport ToggleImageCaptionCommand from './toggleimagecaptioncommand';\n\nimport ImageUtils from '../imageutils';\nimport ImageCaptionUtils from './imagecaptionutils';\n\n/**\n * The image caption engine plugin. It is responsible for:\n *\n * * registering converters for the caption element,\n * * registering converters for the caption model attribute,\n * * registering the {@link module:image/imagecaption/toggleimagecaptioncommand~ToggleImageCaptionCommand `toggleImageCaption`} command.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageCaptionEditing extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageUtils, ImageCaptionUtils ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageCaptionEditing';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor ) {\n\t\tsuper( editor );\n\n\t\t/**\n\t\t * A map that keeps saved JSONified image captions and image model elements they are\n\t\t * associated with.\n\t\t *\n\t\t * To learn more about this system, see {@link #_saveCaption}.\n\t\t *\n\t\t * @member {WeakMap.<module:engine/model/element~Element,Object>}\n\t\t */\n\t\tthis._savedCaptionsMap = new WeakMap();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst schema = editor.model.schema;\n\n\t\t// Schema configuration.\n\t\tif ( !schema.isRegistered( 'caption' ) ) {\n\t\t\tschema.register( 'caption', {\n\t\t\t\tallowIn: 'imageBlock',\n\t\t\t\tallowContentOf: '$block',\n\t\t\t\tisLimit: true\n\t\t\t} );\n\t\t} else {\n\t\t\tschema.extend( 'caption', {\n\t\t\t\tallowIn: 'imageBlock'\n\t\t\t} );\n\t\t}\n\n\t\teditor.commands.add( 'toggleImageCaption', new ToggleImageCaptionCommand( this.editor ) );\n\n\t\tthis._setupConversion();\n\t\tthis._setupImageTypeCommandsIntegration();\n\t\tthis._registerCaptionReconversion();\n\t}\n\n\t/**\n\t * Configures conversion pipelines to support upcasting and downcasting\n\t * image captions.\n\t *\n\t * @private\n\t */\n\t_setupConversion() {\n\t\tconst editor = this.editor;\n\t\tconst view = editor.editing.view;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst imageCaptionUtils = editor.plugins.get( 'ImageCaptionUtils' );\n\t\tconst t = editor.t;\n\n\t\t// View -> model converter for the data pipeline.\n\t\teditor.conversion.for( 'upcast' ).elementToElement( {\n\t\t\tview: element => imageCaptionUtils.matchImageCaptionViewElement( element ),\n\t\t\tmodel: 'caption'\n\t\t} );\n\n\t\t// Model -> view converter for the data pipeline.\n\t\teditor.conversion.for( 'dataDowncast' ).elementToElement( {\n\t\t\tmodel: 'caption',\n\t\t\tview: ( modelElement, { writer } ) => {\n\t\t\t\tif ( !imageUtils.isBlockImage( modelElement.parent ) ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn writer.createContainerElement( 'figcaption' );\n\t\t\t}\n\t\t} );\n\n\t\t// Model -> view converter for the editing pipeline.\n\t\teditor.conversion.for( 'editingDowncast' ).elementToElement( {\n\t\t\tmodel: 'caption',\n\t\t\tview: ( modelElement, { writer } ) => {\n\t\t\t\tif ( !imageUtils.isBlockImage( modelElement.parent ) ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst figcaptionElement = writer.createEditableElement( 'figcaption' );\n\t\t\t\twriter.setCustomProperty( 'imageCaption', true, figcaptionElement );\n\n\t\t\t\tenablePlaceholder( {\n\t\t\t\t\tview,\n\t\t\t\t\telement: figcaptionElement,\n\t\t\t\t\ttext: t( 'Enter image caption' ),\n\t\t\t\t\tkeepOnFocus: true\n\t\t\t\t} );\n\n\t\t\t\tconst imageAlt = modelElement.parent.getAttribute( 'alt' );\n\t\t\t\tconst label = imageAlt ? t( 'Caption for image: %0', [ imageAlt ] ) : t( 'Caption for the image' );\n\n\t\t\t\treturn toWidgetEditable( figcaptionElement, writer, { label } );\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * Integrates with {@link module:image/image/imagetypecommand~ImageTypeCommand image type commands}\n\t * to make sure the caption is preserved when the type of an image changes so it can be restored\n\t * in the future if the user decides they want their caption back.\n\t *\n\t * @private\n\t */\n\t_setupImageTypeCommandsIntegration() {\n\t\tconst editor = this.editor;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst imageCaptionUtils = editor.plugins.get( 'ImageCaptionUtils' );\n\t\tconst imageTypeInlineCommand = editor.commands.get( 'imageTypeInline' );\n\t\tconst imageTypeBlockCommand = editor.commands.get( 'imageTypeBlock' );\n\n\t\tconst handleImageTypeChange = evt => {\n\t\t\t// The image type command execution can be unsuccessful.\n\t\t\tif ( !evt.return ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { oldElement, newElement } = evt.return;\n\n\t\t\t/* istanbul ignore if: paranoid check */\n\t\t\tif ( !oldElement ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( imageUtils.isBlockImage( oldElement ) ) {\n\t\t\t\tconst oldCaptionElement = imageCaptionUtils.getCaptionFromImageModelElement( oldElement );\n\n\t\t\t\t// If the old element was a captioned block image (the caption was visible),\n\t\t\t\t// simply save it so it can be restored.\n\t\t\t\tif ( oldCaptionElement ) {\n\t\t\t\t\tthis._saveCaption( newElement, oldCaptionElement );\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst savedOldElementCaption = this._getSavedCaption( oldElement );\n\n\t\t\t// If either:\n\t\t\t//\n\t\t\t// * the block image didn't have a visible caption,\n\t\t\t// * the block image caption was hidden (and already saved),\n\t\t\t// * the inline image was passed\n\t\t\t//\n\t\t\t// just try to \"pass\" the saved caption from the old image to the new image\n\t\t\t// so it can be retrieved in the future if the user wants it back.\n\t\t\tif ( savedOldElementCaption ) {\n\t\t\t\t// Note: Since we're writing to a WeakMap, we don't bother with removing the\n\t\t\t\t// [ oldElement, savedOldElementCaption ] pair from it.\n\t\t\t\tthis._saveCaption( newElement, savedOldElementCaption );\n\t\t\t}\n\t\t};\n\n\t\t// Presence of the commands depends on the Image(Inline|Block)Editing plugins loaded in the editor.\n\t\tif ( imageTypeInlineCommand ) {\n\t\t\tthis.listenTo( imageTypeInlineCommand, 'execute', handleImageTypeChange, { priority: 'low' } );\n\t\t}\n\n\t\tif ( imageTypeBlockCommand ) {\n\t\t\tthis.listenTo( imageTypeBlockCommand, 'execute', handleImageTypeChange, { priority: 'low' } );\n\t\t}\n\t}\n\n\t/**\n\t * Returns the saved {@link module:engine/model/element~Element#toJSON JSONified} caption\n\t * of an image model element.\n\t *\n\t * See {@link #_saveCaption}.\n\t *\n\t * @protected\n\t * @param {module:engine/model/element~Element} imageModelElement The model element the\n\t * caption should be returned for.\n\t * @returns {module:engine/model/element~Element|null} The model caption element or `null` if there is none.\n\t */\n\t_getSavedCaption( imageModelElement ) {\n\t\tconst jsonObject = this._savedCaptionsMap.get( imageModelElement );\n\n\t\treturn jsonObject ? Element.fromJSON( jsonObject ) : null;\n\t}\n\n\t/**\n\t * Saves a {@link module:engine/model/element~Element#toJSON JSONified} caption for\n\t * an image element to allow restoring it in the future.\n\t *\n\t * A caption is saved every time it gets hidden and/or the type of an image changes. The\n\t * user should be able to restore it on demand.\n\t *\n\t * **Note**: The caption cannot be stored in the image model element attribute because,\n\t * for instance, when the model state propagates to collaborators, the attribute would get\n\t * lost (mainly because it does not convert to anything when the caption is hidden) and\n\t * the states of collaborators' models would de-synchronize causing numerous issues.\n\t *\n\t * See {@link #_getSavedCaption}.\n\t *\n\t * @protected\n\t * @param {module:engine/model/element~Element} imageModelElement The model element the\n\t * caption is saved for.\n\t * @param {module:engine/model/element~Element} caption The caption model element to be saved.\n\t */\n\t_saveCaption( imageModelElement, caption ) {\n\t\tthis._savedCaptionsMap.set( imageModelElement, caption.toJSON() );\n\t}\n\n\t/**\n\t * Reconverts image caption when image alt attribute changes.\n\t * The change of alt attribute is reflected in caption's aria-label attribute.\n\t *\n\t * @private\n\t */\n\t_registerCaptionReconversion() {\n\t\tconst editor = this.editor;\n\t\tconst model = editor.model;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst imageCaptionUtils = editor.plugins.get( 'ImageCaptionUtils' );\n\n\t\tmodel.document.on( 'change:data', () => {\n\t\t\tconst changes = model.document.differ.getChanges();\n\n\t\t\tfor ( const change of changes ) {\n\t\t\t\tif ( change.attributeKey !== 'alt' ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst image = change.range.start.nodeAfter;\n\n\t\t\t\tif ( imageUtils.isBlockImage( image ) ) {\n\t\t\t\t\tconst caption = imageCaptionUtils.getCaptionFromImageModelElement( image );\n\n\t\t\t\t\tif ( !caption ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\teditor.editing.reconvertItem( caption );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagecaption/imagecaptionui\n */\n\nimport { Plugin, icons } from 'ckeditor5/src/core';\nimport { ButtonView } from 'ckeditor5/src/ui';\nimport ImageCaptionUtils from './imagecaptionutils';\n\n/**\n * The image caption UI plugin. It introduces the `'toggleImageCaption'` UI button.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageCaptionUI extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageCaptionUtils ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageCaptionUI';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst editingView = editor.editing.view;\n\t\tconst imageCaptionUtils = editor.plugins.get( 'ImageCaptionUtils' );\n\t\tconst t = editor.t;\n\n\t\teditor.ui.componentFactory.add( 'toggleImageCaption', locale => {\n\t\t\tconst command = editor.commands.get( 'toggleImageCaption' );\n\t\t\tconst view = new ButtonView( locale );\n\n\t\t\tview.set( {\n\t\t\t\ticon: icons.caption,\n\t\t\t\ttooltip: true,\n\t\t\t\tisToggleable: true\n\t\t\t} );\n\n\t\t\tview.bind( 'isOn', 'isEnabled' ).to( command, 'value', 'isEnabled' );\n\t\t\tview.bind( 'label' ).to( command, 'value', value => value ? t( 'Toggle caption off' ) : t( 'Toggle caption on' ) );\n\n\t\t\tthis.listenTo( view, 'execute', () => {\n\t\t\t\teditor.execute( 'toggleImageCaption', { focusCaptionOnShow: true } );\n\n\t\t\t\t// Scroll to the selection and highlight the caption if the caption showed up.\n\t\t\t\tconst modelCaptionElement = imageCaptionUtils.getCaptionFromModelSelection( editor.model.document.selection );\n\n\t\t\t\tif ( modelCaptionElement ) {\n\t\t\t\t\tconst figcaptionElement = editor.editing.mapper.toViewElement( modelCaptionElement );\n\n\t\t\t\t\teditingView.scrollToTheSelection();\n\n\t\t\t\t\teditingView.change( writer => {\n\t\t\t\t\t\twriter.addClass( 'image__caption_highlighted', figcaptionElement );\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\teditor.editing.view.focus();\n\t\t\t} );\n\n\t\t\treturn view;\n\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagecaptionutils/utils\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\n\nimport ImageUtils from '../imageutils';\n\n/**\n * The image caption utilities plugin.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageCaptionUtils extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageCaptionUtils';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageUtils ];\n\t}\n\n\t/**\n\t * Returns the caption model element from a given image element. Returns `null` if no caption is found.\n\t *\n\t * @param {module:engine/model/element~Element} imageModelElement\n\t * @returns {module:engine/model/element~Element|null}\n\t */\n\tgetCaptionFromImageModelElement( imageModelElement ) {\n\t\tfor ( const node of imageModelElement.getChildren() ) {\n\t\t\tif ( !!node && node.is( 'element', 'caption' ) ) {\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Returns the caption model element for a model selection. Returns `null` if the selection has no caption element ancestor.\n\t *\n\t * @param {module:engine/model/selection~Selection} selection\n\t * @returns {module:engine/model/element~Element|null}\n\t */\n\tgetCaptionFromModelSelection( selection ) {\n\t\tconst imageUtils = this.editor.plugins.get( 'ImageUtils' );\n\t\tconst captionElement = selection.getFirstPosition().findAncestor( 'caption' );\n\n\t\tif ( !captionElement ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( imageUtils.isBlockImage( captionElement.parent ) ) {\n\t\t\treturn captionElement;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * {@link module:engine/view/matcher~Matcher} pattern. Checks if a given element is a `<figcaption>` element that is placed\n\t * inside the image `<figure>` element.\n\t *\n\t * @param {module:engine/view/element~Element} element\n\t * @returns {Object|null} Returns the object accepted by {@link module:engine/view/matcher~Matcher} or `null` if the element\n\t * cannot be matched.\n\t */\n\tmatchImageCaptionViewElement( element ) {\n\t\tconst imageUtils = this.editor.plugins.get( 'ImageUtils' );\n\n\t\t// Convert only captions for images.\n\t\tif ( element.name == 'figcaption' && imageUtils.isBlockImageView( element.parent ) ) {\n\t\t\treturn { name: true };\n\t\t}\n\n\t\treturn null;\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagecaption/toggleimagecaptioncommand\n */\n\nimport { Command } from 'ckeditor5/src/core';\n\nimport ImageBlockEditing from '../image/imageblockediting';\n\n/**\n * The toggle image caption command.\n *\n * This command is registered by {@link module:image/imagecaption/imagecaptionediting~ImageCaptionEditing} as the\n * `'toggleImageCaption'` editor command.\n *\n * Executing this command:\n *\n * * either adds or removes the image caption of a selected image (depending on whether the caption is present or not),\n * * removes the image caption if the selection is anchored in one.\n *\n *\t\t// Toggle the presence of the caption.\n *\t\teditor.execute( 'toggleImageCaption' );\n *\n * **Note**: Upon executing this command, the selection will be set on the image if previously anchored in the caption element.\n *\n * **Note**: You can move the selection to the caption right away as it shows up upon executing this command by using\n * the `focusCaptionOnShow` option:\n *\n *\t\teditor.execute( 'toggleImageCaption', { focusCaptionOnShow: true } );\n *\n * @extends module:core/command~Command\n */\nexport default class ToggleImageCaptionCommand extends Command {\n\t/**\n\t * @inheritDoc\n\t */\n\trefresh() {\n\t\tconst editor = this.editor;\n\t\tconst imageCaptionUtils = editor.plugins.get( 'ImageCaptionUtils' );\n\n\t\t// Only block images can get captions.\n\t\tif ( !editor.plugins.has( ImageBlockEditing ) ) {\n\t\t\tthis.isEnabled = false;\n\t\t\tthis.value = false;\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst selection = editor.model.document.selection;\n\t\tconst selectedElement = selection.getSelectedElement();\n\n\t\tif ( !selectedElement ) {\n\t\t\tconst ancestorCaptionElement = imageCaptionUtils.getCaptionFromModelSelection( selection );\n\n\t\t\tthis.isEnabled = !!ancestorCaptionElement;\n\t\t\tthis.value = !!ancestorCaptionElement;\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Block images support captions by default but the command should also be enabled for inline\n\t\t// images because toggling the caption when one is selected should convert it into a block image.\n\t\tthis.isEnabled = this.editor.plugins.get( 'ImageUtils' ).isImage( selectedElement );\n\n\t\tif ( !this.isEnabled ) {\n\t\t\tthis.value = false;\n\t\t} else {\n\t\t\tthis.value = !!imageCaptionUtils.getCaptionFromImageModelElement( selectedElement );\n\t\t}\n\t}\n\n\t/**\n\t * Executes the command.\n\t *\n\t *\t\teditor.execute( 'toggleImageCaption' );\n\t *\n\t * @param {Object} [options] Options for the executed command.\n\t * @param {String} [options.focusCaptionOnShow] When true and the caption shows up, the selection will be moved into it straight away.\n\t * @fires execute\n\t */\n\texecute( options = {} ) {\n\t\tconst { focusCaptionOnShow } = options;\n\n\t\tthis.editor.model.change( writer => {\n\t\t\tif ( this.value ) {\n\t\t\t\tthis._hideImageCaption( writer );\n\t\t\t} else {\n\t\t\t\tthis._showImageCaption( writer, focusCaptionOnShow );\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * Shows the caption of the `<imageBlock>` or `<imageInline>`. Also:\n\t *\n\t * * it converts `<imageInline>` to `<imageBlock>` to show the caption,\n\t * * it attempts to restore the caption content from the `ImageCaptionEditing` caption registry,\n\t * * it moves the selection to the caption right away, it the `focusCaptionOnShow` option was set.\n\t *\n\t * @private\n\t * @param {module:engine/model/writer~Writer} writer\n\t */\n\t_showImageCaption( writer, focusCaptionOnShow ) {\n\t\tconst model = this.editor.model;\n\t\tconst selection = model.document.selection;\n\t\tconst imageCaptionEditing = this.editor.plugins.get( 'ImageCaptionEditing' );\n\n\t\tlet selectedImage = selection.getSelectedElement();\n\n\t\tconst savedCaption = imageCaptionEditing._getSavedCaption( selectedImage );\n\n\t\t// Convert imageInline -> image first.\n\t\tif ( this.editor.plugins.get( 'ImageUtils' ).isInlineImage( selectedImage ) ) {\n\t\t\tthis.editor.execute( 'imageTypeBlock' );\n\n\t\t\t// Executing the command created a new model element. Let's pick it again.\n\t\t\tselectedImage = selection.getSelectedElement();\n\t\t}\n\n\t\t// Try restoring the caption from the ImageCaptionEditing plugin storage.\n\t\tconst newCaptionElement = savedCaption || writer.createElement( 'caption' );\n\n\t\twriter.append( newCaptionElement, selectedImage );\n\n\t\tif ( focusCaptionOnShow ) {\n\t\t\twriter.setSelection( newCaptionElement, 'in' );\n\t\t}\n\t}\n\n\t/**\n\t * Hides the caption of a selected image (or an image caption the selection is anchored to).\n\t *\n\t * The content of the caption is stored in the `ImageCaptionEditing` caption registry to make this\n\t * a reversible action.\n\t *\n\t * @private\n\t * @param {module:engine/model/writer~Writer} writer\n\t */\n\t_hideImageCaption( writer ) {\n\t\tconst editor = this.editor;\n\t\tconst selection = editor.model.document.selection;\n\t\tconst imageCaptionEditing = editor.plugins.get( 'ImageCaptionEditing' );\n\t\tconst imageCaptionUtils = editor.plugins.get( 'ImageCaptionUtils' );\n\t\tlet selectedImage = selection.getSelectedElement();\n\t\tlet captionElement;\n\n\t\tif ( selectedImage ) {\n\t\t\tcaptionElement = imageCaptionUtils.getCaptionFromImageModelElement( selectedImage );\n\t\t} else {\n\t\t\tcaptionElement = imageCaptionUtils.getCaptionFromModelSelection( selection );\n\t\t\tselectedImage = captionElement.parent;\n\t\t}\n\n\t\t// Store the caption content so it can be restored quickly if the user changes their mind even if they toggle image<->imageInline.\n\t\timageCaptionEditing._saveCaption( selectedImage, captionElement );\n\n\t\twriter.setSelection( selectedImage, 'on' );\n\t\twriter.remove( captionElement );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageinline\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { Widget } from 'ckeditor5/src/widget';\n\nimport ImageTextAlternative from './imagetextalternative';\nimport ImageInlineEditing from './image/imageinlineediting';\n\nimport '../theme/image.css';\n\n/**\n * The image inline plugin.\n *\n * This is a \"glue\" plugin which loads the following plugins:\n *\n * * {@link module:image/image/imageinlineediting~ImageInlineEditing},\n * * {@link module:image/imagetextalternative~ImageTextAlternative}.\n *\n * Usually, it is used in conjunction with other plugins from this package. See the {@glink api/image package page}\n * for more information.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageInline extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageInlineEditing, Widget, ImageTextAlternative ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageInline';\n\t}\n}\n\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageinsert\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport ImageUpload from './imageupload';\nimport ImageInsertViaUrl from './imageinsertviaurl';\nimport ImageInsertUI from './imageinsert/imageinsertui';\n\n/**\n * The image insert plugin.\n *\n * For a detailed overview, check the {@glink features/images/image-upload/image-upload Image upload feature}\n * and {@glink features/images/image-upload/images-inserting#inserting-images-via-source-url Insert images via source URL} documentation.\n *\n * This plugin does not do anything directly, but it loads a set of specific plugins\n * to enable image uploading or inserting via implemented integrations:\n *\n * * {@link module:image/imageupload~ImageUpload}\n * * {@link module:image/imageinsert/imageinsertui~ImageInsertUI},\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageInsert extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageInsert';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageUpload, ImageInsertViaUrl, ImageInsertUI ];\n\t}\n}\n\n/**\n * The image insert configuration.\n *\n * @member {module:image/imageinsert~ImageInsertConfig} module:image/image~ImageConfig#insert\n */\n\n/**\n * The configuration of the image insert dropdown panel view. Used by the image insert feature in the `@ckeditor/ckeditor5-image` package.\n *\n *\t\tClassicEditor\n *\t\t\t.create( editorElement, {\n * \t\t\t\timage: {\n * \t\t\t\t\tinsert: {\n *\t\t\t\t\t\t... // settings for \"insertImage\" view goes here\n * \t\t\t\t\t}\n * \t\t\t\t}\n *\t\t\t} )\n *\t\t\t.then( ... )\n *\t\t\t.catch( ... );\n *\n * See {@link module:core/editor/editorconfig~EditorConfig all editor options}.\n *\n * @interface module:image/imageinsert~ImageInsertConfig\n */\n\n/**\n * The image insert panel view configuration contains a list of {@link module:image/imageinsert~ImageInsert} integrations.\n *\n * The option accepts string tokens.\n * * for predefined integrations, we have two special strings: `insertImageViaUrl` and `openCKFinder`.\n * The former adds the **Insert image via URL** feature, while the latter adds the built-in **CKFinder** integration.\n * * for custom integrations, each string should be a name of the component registered in the\n * {@link module:ui/componentfactory~ComponentFactory component factory}.\n * If you have a plugin `PluginX` that registers `pluginXButton` component, then the integration token\n * in that case should be `pluginXButton`.\n *\n *\t\t// Add `insertImageViaUrl`, `openCKFinder` and custom `pluginXButton` integrations.\n *\t\tconst imageInsertConfig = {\n *\t\t\tinsert: {\n *\t\t\t\tintegrations: [\n *\t\t\t\t\t'insertImageViaUrl',\n *\t\t\t\t\t'openCKFinder',\n *\t\t\t\t\t'pluginXButton'\n *\t\t\t\t]\n *\t\t\t}\n *\t\t};\n *\n * @protected\n * @member {Array.<String>} module:image/imageinsert~ImageInsertConfig#integrations\n * @default [ 'insertImageViaUrl' ]\n */\n\n/**\n * This options allows to override the image type used by the {@link module:image/image/insertimagecommand~InsertImageCommand} when the user\n * inserts new images into the editor content. By default, this option is unset which means the editor will choose the optimal image type\n * based on the context of the insertion (e.g. the current selection and availability of plugins)\n *\n * Available options are:\n *\n * * `'block'` – all images inserted into the editor will be block (requires the {@link module:image/imageblock~ImageBlock} plugin),\n * * `'inline'` – all images inserted into the editor will be inline (requires the {@link module:image/imageinline~ImageInline} plugin).\n *\n * @member {'inline'|'block'|undefined} module:image/imageinsert~ImageInsertConfig#type\n */\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageinsert/imageinsertui\n */\n\nimport { Plugin, icons } from 'ckeditor5/src/core';\nimport ImageInsertPanelView from './ui/imageinsertpanelview';\nimport { SplitButtonView, createDropdown } from 'ckeditor5/src/ui';\nimport { prepareIntegrations } from './utils';\n\n/**\n * The image insert dropdown plugin.\n *\n * For a detailed overview, check the {@glink features/images/image-upload/image-upload Image upload feature}\n * and {@glink features/images/image-upload/images-inserting#inserting-images-via-source-url Insert images via source URL} documentation.\n *\n * Adds the `'insertImage'` dropdown to the {@link module:ui/componentfactory~ComponentFactory UI component factory}\n * and also the `imageInsert` dropdown as an alias for backward compatibility.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageInsertUI extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageInsertUI';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst componentCreator = locale => {\n\t\t\treturn this._createDropdownView( locale );\n\t\t};\n\n\t\t// Register `insertImage` dropdown and add `imageInsert` dropdown as an alias for backward compatibility.\n\t\teditor.ui.componentFactory.add( 'insertImage', componentCreator );\n\t\teditor.ui.componentFactory.add( 'imageInsert', componentCreator );\n\t}\n\n\t/**\n\t * Creates the dropdown view.\n\t *\n\t * @param {module:utils/locale~Locale} locale The localization services instance.\n\t *\n\t * @private\n\t * @returns {module:ui/dropdown/dropdownview~DropdownView}\n\t */\n\t_createDropdownView( locale ) {\n\t\tconst editor = this.editor;\n\t\tconst t = locale.t;\n\n\t\tconst uploadImageCommand = editor.commands.get( 'uploadImage' );\n\t\tconst insertImageCommand = editor.commands.get( 'insertImage' );\n\n\t\t/**\n\t\t * The dropdown view responsible for displaying the image insert UI.\n\t\t *\n\t\t * @member {module:ui/dropdown/dropdownview~DropdownView}\n\t\t */\n\t\tthis.dropdownView = createDropdown( locale, uploadImageCommand ? SplitButtonView : undefined );\n\n\t\tconst buttonView = this.dropdownView.buttonView;\n\t\tconst panelView = this.dropdownView.panelView;\n\n\t\tbuttonView.set( {\n\t\t\tlabel: t( 'Insert image' ),\n\t\t\ticon: icons.image,\n\t\t\ttooltip: true\n\t\t} );\n\n\t\tpanelView.extendTemplate( {\n\t\t\tattributes: {\n\t\t\t\tclass: 'ck-image-insert__panel'\n\t\t\t}\n\t\t} );\n\n\t\tif ( uploadImageCommand ) {\n\t\t\tconst splitButtonView = this.dropdownView.buttonView;\n\n\t\t\tsplitButtonView.actionView = editor.ui.componentFactory.create( 'uploadImage' );\n\t\t\t// After we replaced action button with `uploadImage` component,\n\t\t\t// we have lost a proper styling and some minor visual quirks have appeared.\n\t\t\t// Brining back original split button classes helps fix the button styling\n\t\t\t// See https://github.com/ckeditor/ckeditor5/issues/7986.\n\t\t\tsplitButtonView.actionView.extendTemplate( {\n\t\t\t\tattributes: {\n\t\t\t\t\tclass: 'ck ck-button ck-splitbutton__action'\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this._setUpDropdown( uploadImageCommand || insertImageCommand );\n\t}\n\n\t/**\n\t * Sets up the dropdown view.\n\t *\n\t * @param {module:core/command~Command} command An uploadImage or insertImage command.\n\t *\n\t * @private\n\t * @returns {module:ui/dropdown/dropdownview~DropdownView}\n\t */\n\t_setUpDropdown( command ) {\n\t\tconst editor = this.editor;\n\t\tconst t = editor.t;\n\t\tconst imageInsertView = new ImageInsertPanelView( editor.locale, prepareIntegrations( editor ) );\n\t\tconst insertButtonView = imageInsertView.insertButtonView;\n\t\tconst insertImageViaUrlForm = imageInsertView.getIntegration( 'insertImageViaUrl' );\n\t\tconst dropdownView = this.dropdownView;\n\t\tconst panelView = dropdownView.panelView;\n\t\tconst imageUtils = this.editor.plugins.get( 'ImageUtils' );\n\n\t\tdropdownView.bind( 'isEnabled' ).to( command );\n\n\t\t// Defer the children injection to improve initial performance.\n\t\t// See https://github.com/ckeditor/ckeditor5/pull/8019#discussion_r484069652.\n\t\tdropdownView.once( 'change:isOpen', () => {\n\t\t\tpanelView.children.add( imageInsertView );\n\t\t} );\n\n\t\tdropdownView.on( 'change:isOpen', () => {\n\t\t\tconst selectedElement = editor.model.document.selection.getSelectedElement();\n\n\t\t\tif ( dropdownView.isOpen ) {\n\t\t\t\tif ( imageUtils.isImage( selectedElement ) ) {\n\t\t\t\t\timageInsertView.imageURLInputValue = selectedElement.getAttribute( 'src' );\n\t\t\t\t\tinsertButtonView.label = t( 'Update' );\n\t\t\t\t\tinsertImageViaUrlForm.label = t( 'Update image URL' );\n\t\t\t\t} else {\n\t\t\t\t\timageInsertView.imageURLInputValue = '';\n\t\t\t\t\tinsertButtonView.label = t( 'Insert' );\n\t\t\t\t\tinsertImageViaUrlForm.label = t( 'Insert image via URL' );\n\t\t\t\t}\n\t\t\t}\n\t\t// Note: Use the low priority to make sure the following listener starts working after the\n\t\t// default action of the drop-down is executed (i.e. the panel showed up). Otherwise, the\n\t\t// invisible form/input cannot be focused/selected.\n\t\t}, { priority: 'low' } );\n\n\t\timageInsertView.delegate( 'submit', 'cancel' ).to( dropdownView );\n\t\tthis.delegate( 'cancel' ).to( dropdownView );\n\n\t\tdropdownView.on( 'submit', () => {\n\t\t\tclosePanel();\n\t\t\tonSubmit();\n\t\t} );\n\n\t\tdropdownView.on( 'cancel', () => {\n\t\t\tclosePanel();\n\t\t} );\n\n\t\tfunction onSubmit() {\n\t\t\tconst selectedElement = editor.model.document.selection.getSelectedElement();\n\n\t\t\tif ( imageUtils.isImage( selectedElement ) ) {\n\t\t\t\teditor.model.change( writer => {\n\t\t\t\t\twriter.setAttribute( 'src', imageInsertView.imageURLInputValue, selectedElement );\n\t\t\t\t\twriter.removeAttribute( 'srcset', selectedElement );\n\t\t\t\t\twriter.removeAttribute( 'sizes', selectedElement );\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\teditor.execute( 'insertImage', { source: imageInsertView.imageURLInputValue } );\n\t\t\t}\n\t\t}\n\n\t\tfunction closePanel() {\n\t\t\teditor.editing.view.focus();\n\t\t\tdropdownView.isOpen = false;\n\t\t}\n\n\t\treturn dropdownView;\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageinsert/ui/imageinsertformrowview\n */\n\nimport { View } from 'ckeditor5/src/ui';\n\nimport '../../../theme/imageinsertformrowview.css';\n\n/**\n * The class representing a single row in a complex form,\n * used by {@link module:image/imageinsert/ui/imageinsertpanelview~ImageInsertPanelView}.\n *\n * **Note**: For now this class is private. When more use cases appear (beyond `ckeditor5-table` and `ckeditor5-image`),\n * it will become a component in `ckeditor5-ui`.\n *\n * @private\n * @extends module:ui/view~View\n */\nexport default class ImageUploadFormRowView extends View {\n\t/**\n\t * Creates an instance of the form row class.\n\t *\n\t * @param {module:utils/locale~Locale} locale The locale instance.\n\t * @param {Object} options\n\t * @param {Array.<module:ui/view~View>} [options.children]\n\t * @param {String} [options.class]\n\t * @param {module:ui/view~View} [options.labelView] When passed, the row gets the `group` and `aria-labelledby`\n\t * DOM attributes and gets described by the label.\n\t */\n\tconstructor( locale, options = {} ) {\n\t\tsuper( locale );\n\n\t\tconst bind = this.bindTemplate;\n\n\t\t/**\n\t\t * An additional CSS class added to the {@link #element}.\n\t\t *\n\t\t * @observable\n\t\t * @member {String} #class\n\t\t */\n\t\tthis.set( 'class', options.class || null );\n\n\t\t/**\n\t\t * A collection of row items (buttons, dropdowns, etc.).\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:ui/viewcollection~ViewCollection}\n\t\t */\n\t\tthis.children = this.createCollection();\n\n\t\tif ( options.children ) {\n\t\t\toptions.children.forEach( child => this.children.add( child ) );\n\t\t}\n\n\t\t/**\n\t\t * The role property reflected by the `role` DOM attribute of the {@link #element}.\n\t\t *\n\t\t * **Note**: Used only when a `labelView` is passed to constructor `options`.\n\t\t *\n\t\t * @private\n\t\t * @observable\n\t\t * @member {String} #role\n\t\t */\n\t\tthis.set( '_role', null );\n\n\t\t/**\n\t\t * The ARIA property reflected by the `aria-labelledby` DOM attribute of the {@link #element}.\n\t\t *\n\t\t * **Note**: Used only when a `labelView` is passed to constructor `options`.\n\t\t *\n\t\t * @private\n\t\t * @observable\n\t\t * @member {String} #ariaLabelledBy\n\t\t */\n\t\tthis.set( '_ariaLabelledBy', null );\n\n\t\tif ( options.labelView ) {\n\t\t\tthis.set( {\n\t\t\t\t_role: 'group',\n\t\t\t\t_ariaLabelledBy: options.labelView.id\n\t\t\t} );\n\t\t}\n\n\t\tthis.setTemplate( {\n\t\t\ttag: 'div',\n\t\t\tattributes: {\n\t\t\t\tclass: [\n\t\t\t\t\t'ck',\n\t\t\t\t\t'ck-form__row',\n\t\t\t\t\tbind.to( 'class' )\n\t\t\t\t],\n\t\t\t\trole: bind.to( '_role' ),\n\t\t\t\t'aria-labelledby': bind.to( '_ariaLabelledBy' )\n\t\t\t},\n\t\t\tchildren: this.children\n\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageinsert/ui/imageinsertpanelview\n */\n\nimport { icons } from 'ckeditor5/src/core';\nimport { ButtonView, View, ViewCollection, submitHandler, FocusCycler } from 'ckeditor5/src/ui';\nimport { Collection, FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';\n\nimport ImageInsertFormRowView from './imageinsertformrowview';\n\nimport '../../../theme/imageinsert.css';\n\n/**\n * The insert an image via URL view controller class.\n *\n * See {@link module:image/imageinsert/ui/imageinsertpanelview~ImageInsertPanelView}.\n *\n * @extends module:ui/view~View\n */\nexport default class ImageInsertPanelView extends View {\n\t/**\n\t * Creates a view for the dropdown panel of {@link module:image/imageinsert/imageinsertui~ImageInsertUI}.\n\t *\n\t * @param {module:utils/locale~Locale} [locale] The localization services instance.\n\t * @param {Object} [integrations] An integrations object that contains\n\t * components (or tokens for components) to be shown in the panel view.\n\t */\n\tconstructor( locale, integrations ) {\n\t\tsuper( locale );\n\n\t\tconst { insertButtonView, cancelButtonView } = this._createActionButtons( locale );\n\n\t\t/**\n\t\t * The \"insert/update\" button view.\n\t\t *\n\t\t * @member {module:ui/button/buttonview~ButtonView}\n\t\t */\n\t\tthis.insertButtonView = insertButtonView;\n\n\t\t/**\n\t\t * The \"cancel\" button view.\n\t\t *\n\t\t * @member {module:ui/button/buttonview~ButtonView}\n\t\t */\n\t\tthis.cancelButtonView = cancelButtonView;\n\n\t\t/**\n\t\t * The value of the URL input.\n\t\t *\n\t\t * @member {String} #imageURLInputValue\n\t\t * @observable\n\t\t */\n\t\tthis.set( 'imageURLInputValue', '' );\n\n\t\t/**\n\t\t * Tracks information about DOM focus in the form.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:utils/focustracker~FocusTracker}\n\t\t */\n\t\tthis.focusTracker = new FocusTracker();\n\n\t\t/**\n\t\t * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:utils/keystrokehandler~KeystrokeHandler}\n\t\t */\n\t\tthis.keystrokes = new KeystrokeHandler();\n\n\t\t/**\n\t\t * A collection of views that can be focused in the form.\n\t\t *\n\t\t * @readonly\n\t\t * @protected\n\t\t * @member {module:ui/viewcollection~ViewCollection}\n\t\t */\n\t\tthis._focusables = new ViewCollection();\n\n\t\t/**\n\t\t * Helps cycling over {@link #_focusables} in the form.\n\t\t *\n\t\t * @readonly\n\t\t * @protected\n\t\t * @member {module:ui/focuscycler~FocusCycler}\n\t\t */\n\t\tthis._focusCycler = new FocusCycler( {\n\t\t\tfocusables: this._focusables,\n\t\t\tfocusTracker: this.focusTracker,\n\t\t\tkeystrokeHandler: this.keystrokes,\n\t\t\tactions: {\n\t\t\t\t// Navigate form fields backwards using the Shift + Tab keystroke.\n\t\t\t\tfocusPrevious: 'shift + tab',\n\n\t\t\t\t// Navigate form fields forwards using the Tab key.\n\t\t\t\tfocusNext: 'tab'\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * A collection of the defined integrations for inserting the images.\n\t\t *\n\t\t * @private\n\t\t * @member {module:utils/collection~Collection}\n\t\t */\n\t\tthis.set( '_integrations', new Collection() );\n\n\t\tif ( integrations ) {\n\t\t\tfor ( const [ integration, integrationView ] of Object.entries( integrations ) ) {\n\t\t\t\tif ( integration === 'insertImageViaUrl' ) {\n\t\t\t\t\tintegrationView.fieldView.bind( 'value' ).to( this, 'imageURLInputValue', value => value || '' );\n\n\t\t\t\t\tintegrationView.fieldView.on( 'input', () => {\n\t\t\t\t\t\tthis.imageURLInputValue = integrationView.fieldView.element.value.trim();\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tintegrationView.name = integration;\n\n\t\t\t\tthis._integrations.add( integrationView );\n\t\t\t}\n\t\t}\n\n\t\tthis.setTemplate( {\n\t\t\ttag: 'form',\n\n\t\t\tattributes: {\n\t\t\t\tclass: [\n\t\t\t\t\t'ck',\n\t\t\t\t\t'ck-image-insert-form'\n\t\t\t\t],\n\n\t\t\t\ttabindex: '-1'\n\t\t\t},\n\n\t\t\tchildren: [\n\t\t\t\t...this._integrations,\n\t\t\t\tnew ImageInsertFormRowView( locale, {\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\tthis.insertButtonView,\n\t\t\t\t\t\tthis.cancelButtonView\n\t\t\t\t\t],\n\t\t\t\t\tclass: 'ck-image-insert-form__action-row'\n\t\t\t\t} )\n\t\t\t]\n\t\t} );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\trender() {\n\t\tsuper.render();\n\n\t\tsubmitHandler( {\n\t\t\tview: this\n\t\t} );\n\n\t\tconst childViews = [\n\t\t\t...this._integrations,\n\t\t\tthis.insertButtonView,\n\t\t\tthis.cancelButtonView\n\t\t];\n\n\t\tchildViews.forEach( v => {\n\t\t\t// Register the view as focusable.\n\t\t\tthis._focusables.add( v );\n\n\t\t\t// Register the view in the focus tracker.\n\t\t\tthis.focusTracker.add( v.element );\n\t\t} );\n\n\t\t// Start listening for the keystrokes coming from #element.\n\t\tthis.keystrokes.listenTo( this.element );\n\n\t\tconst stopPropagation = data => data.stopPropagation();\n\n\t\t// Since the form is in the dropdown panel which is a child of the toolbar, the toolbar's\n\t\t// keystroke handler would take over the key management in the URL input. We need to prevent\n\t\t// this ASAP. Otherwise, the basic caret movement using the arrow keys will be impossible.\n\t\tthis.keystrokes.set( 'arrowright', stopPropagation );\n\t\tthis.keystrokes.set( 'arrowleft', stopPropagation );\n\t\tthis.keystrokes.set( 'arrowup', stopPropagation );\n\t\tthis.keystrokes.set( 'arrowdown', stopPropagation );\n\n\t\t// Intercept the \"selectstart\" event, which is blocked by default because of the default behavior\n\t\t// of the DropdownView#panelView.\n\t\t// TODO: blocking \"selectstart\" in the #panelView should be configurable per–drop–down instance.\n\t\tthis.listenTo( childViews[ 0 ].element, 'selectstart', ( evt, domEvt ) => {\n\t\t\tdomEvt.stopPropagation();\n\t\t}, { priority: 'high' } );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tdestroy() {\n\t\tsuper.destroy();\n\n\t\tthis.focusTracker.destroy();\n\t\tthis.keystrokes.destroy();\n\t}\n\n\t/**\n\t * Returns a view of the integration.\n\t *\n\t * @param {String} name The name of the integration.\n\t * @returns {module:ui/view~View}\n\t */\n\tgetIntegration( name ) {\n\t\treturn this._integrations.find( integration => integration.name === name );\n\t}\n\n\t/**\n\t * Creates the following form controls:\n\t *\n\t * * {@link #insertButtonView},\n\t * * {@link #cancelButtonView}.\n\t *\n\t * @param {module:utils/locale~Locale} locale The localization services instance.\n\t *\n\t * @private\n\t * @returns {Object.<String,module:ui/view~View>}\n\t */\n\t_createActionButtons( locale ) {\n\t\tconst t = locale.t;\n\t\tconst insertButtonView = new ButtonView( locale );\n\t\tconst cancelButtonView = new ButtonView( locale );\n\n\t\tinsertButtonView.set( {\n\t\t\tlabel: t( 'Insert' ),\n\t\t\ticon: icons.check,\n\t\t\tclass: 'ck-button-save',\n\t\t\ttype: 'submit',\n\t\t\twithText: true,\n\t\t\tisEnabled: this.imageURLInputValue\n\t\t} );\n\n\t\tcancelButtonView.set( {\n\t\t\tlabel: t( 'Cancel' ),\n\t\t\ticon: icons.cancel,\n\t\t\tclass: 'ck-button-cancel',\n\t\t\twithText: true\n\t\t} );\n\n\t\tinsertButtonView.bind( 'isEnabled' ).to( this, 'imageURLInputValue', value => !!value );\n\t\tinsertButtonView.delegate( 'execute' ).to( this, 'submit' );\n\t\tcancelButtonView.delegate( 'execute' ).to( this, 'cancel' );\n\n\t\treturn { insertButtonView, cancelButtonView };\n\t}\n\n\t/**\n\t * Focuses the first {@link #_focusables focusable} in the form.\n\t */\n\tfocus() {\n\t\tthis._focusCycler.focusFirst();\n\t}\n}\n\n/**\n * Fired when the form view is submitted (when one of the children triggered the submit event),\n * e.g. by a click on {@link #insertButtonView}.\n *\n * @event submit\n */\n\n/**\n * Fired when the form view is canceled, e.g. by a click on {@link #cancelButtonView}.\n *\n * @event cancel\n */\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageinsert/utils\n */\n\nimport { LabeledFieldView, createLabeledInputText } from 'ckeditor5/src/ui';\n\n/**\n * Creates integrations object that will be passed to the\n * {@link module:image/imageinsert/ui/imageinsertpanelview~ImageInsertPanelView}.\n *\n * @param {module:core/editor/editor~Editor} editor Editor instance.\n *\n * @returns {Object.<String, module:ui/view~View>} Integrations object.\n */\nexport function prepareIntegrations( editor ) {\n\tconst panelItems = editor.config.get( 'image.insert.integrations' );\n\tconst imageInsertUIPlugin = editor.plugins.get( 'ImageInsertUI' );\n\n\tconst PREDEFINED_INTEGRATIONS = {\n\t\t'insertImageViaUrl': createLabeledInputView( editor.locale )\n\t};\n\n\tif ( !panelItems ) {\n\t\treturn PREDEFINED_INTEGRATIONS;\n\t}\n\n\t// Prepares ckfinder component for the `openCKFinder` integration token.\n\tif ( panelItems.find( item => item === 'openCKFinder' ) && editor.ui.componentFactory.has( 'ckfinder' ) ) {\n\t\tconst ckFinderButton = editor.ui.componentFactory.create( 'ckfinder' );\n\t\tckFinderButton.set( {\n\t\t\twithText: true,\n\t\t\tclass: 'ck-image-insert__ck-finder-button'\n\t\t} );\n\n\t\t// We want to close the dropdown panel view when user clicks the ckFinderButton.\n\t\tckFinderButton.delegate( 'execute' ).to( imageInsertUIPlugin, 'cancel' );\n\n\t\tPREDEFINED_INTEGRATIONS.openCKFinder = ckFinderButton;\n\t}\n\n\t// Creates integrations object of valid views to pass it to the ImageInsertPanelView.\n\treturn panelItems.reduce( ( object, key ) => {\n\t\tif ( PREDEFINED_INTEGRATIONS[ key ] ) {\n\t\t\tobject[ key ] = PREDEFINED_INTEGRATIONS[ key ];\n\t\t} else if ( editor.ui.componentFactory.has( key ) ) {\n\t\t\tobject[ key ] = editor.ui.componentFactory.create( key );\n\t\t}\n\n\t\treturn object;\n\t}, {} );\n}\n\n/**\n * Creates labeled field view.\n *\n * @param {module:utils/locale~Locale} locale The localization services instance.\n *\n * @returns {module:ui/labeledfield/labeledfieldview~LabeledFieldView}\n */\nexport function createLabeledInputView( locale ) {\n\tconst t = locale.t;\n\tconst labeledInputView = new LabeledFieldView( locale, createLabeledInputText );\n\n\tlabeledInputView.set( {\n\t\tlabel: t( 'Insert image via URL' )\n\t} );\n\tlabeledInputView.fieldView.placeholder = 'https://example.com/image.png';\n\n\treturn labeledInputView;\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageinsertviaurl\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport ImageInsertUI from './imageinsert/imageinsertui';\n\n/**\n * The image insert via URL plugin.\n *\n * For a detailed overview, check the {@glink features/images/image-upload/images-inserting#inserting-images-via-source-url\n * Insert images via source URL} documentation.\n *\n * This plugin does not do anything directly, but it loads a set of specific plugins\n * to enable image inserting via implemented integrations:\n *\n * * {@link module:image/imageinsert/imageinsertui~ImageInsertUI},\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageInsertViaUrl extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageInsertViaUrl';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageInsertUI ];\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageresize\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport ImageResizeButtons from './imageresize/imageresizebuttons';\nimport ImageResizeEditing from './imageresize/imageresizeediting';\nimport ImageResizeHandles from './imageresize/imageresizehandles';\n\nimport '../theme/imageresize.css';\n\n/**\n * The image resize plugin.\n *\n * It adds a possibility to resize each image using handles.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageResize extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageResizeEditing, ImageResizeHandles, ImageResizeButtons ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageResize';\n\t}\n}\n\n/**\n * The available options are `'px'` or `'%'`.\n *\n * Determines the size unit applied to the resized image.\n *\n *\t\tClassicEditor\n *\t\t\t.create( editorElement, {\n *\t\t\t\timage: {\n *\t\t\t\t\tresizeUnit: 'px'\n *\t\t\t\t}\n *\t\t\t} )\n *\t\t\t.then( ... )\n *\t\t\t.catch( ... );\n *\n *\n * This option is used by the {@link module:image/imageresize~ImageResize} feature.\n *\n * @default '%'\n * @member {String} module:image/image~ImageConfig#resizeUnit\n */\n\n/**\n * The image resize options.\n *\n * Each option should have at least these two properties:\n *\n * * name: The name of the UI component registered in the global\n * {@link module:core/editor/editorui~EditorUI#componentFactory component factory} of the editor,\n * representing the button a user can click to change the size of an image,\n * * value: An actual image width applied when a user clicks the mentioned button\n * ({@link module:image/imageresize/resizeimagecommand~ResizeImageCommand} gets executed).\n * The value property is combined with the {@link module:image/image~ImageConfig#resizeUnit `config.image.resizeUnit`} (`%` by default).\n * For instance: `value: '50'` and `resizeUnit: '%'` will render as `'50%'` in the UI.\n *\n * **Resetting the image size**\n *\n * If you want to set an option that will reset image to its original size, you need to pass a `null` value\n * to one of the options. The `:original` token is not mandatory, you can call it anything you wish, but it must reflect\n * in the standalone buttons configuration for the image toolbar.\n *\n *\t\tClassicEditor\n *\t\t\t.create( editorElement, {\n *\t\t\t\timage: {\n *\t\t\t\t\tresizeUnit: \"%\",\n *\t\t\t\t\tresizeOptions: [ {\n *\t\t\t\t\t\tname: 'resizeImage:original',\n *\t\t\t\t\t\tvalue: null\n *\t\t\t\t\t},\n *\t\t\t\t\t{\n *\t\t\t\t\t\tname: 'resizeImage:50',\n *\t\t\t\t\t\tvalue: '50'\n *\t\t\t\t\t},\n *\t\t\t\t\t{\n *\t\t\t\t\t\tname: 'resizeImage:75',\n *\t\t\t\t\t\tvalue: '75'\n *\t\t\t\t\t} ]\n *\t\t\t\t}\n *\t\t\t} )\n *\t\t\t.then( ... )\n *\t\t\t.catch( ... );\n *\n * **Resizing images using a dropdown**\n *\n * With resize options defined, you can decide whether you want to display them as a dropdown or as standalone buttons.\n * For the dropdown, you need to pass only the `resizeImage` token to the\n{@link module:image/image~ImageConfig#toolbar `config.image.toolbar`}. The dropdown contains all defined options by default:\n *\n *\t\tClassicEditor\n *\t\t\t.create( editorElement, {\n *\t\t\t\timage: {\n *\t\t\t\t\tresizeUnit: \"%\",\n *\t\t\t\t\tresizeOptions: [ {\n *\t\t\t\t\t\tname: 'resizeImage:original',\n *\t\t\t\t\t\tvalue: null\n *\t\t\t\t\t},\n *\t\t\t\t\t{\n *\t\t\t\t\t\tname: 'resizeImage:50',\n *\t\t\t\t\t\tvalue: '50'\n *\t\t\t\t\t},\n *\t\t\t\t\t{\n *\t\t\t\t\t\tname: 'resizeImage:75',\n *\t\t\t\t\t\tvalue: '75'\n *\t\t\t\t\t} ],\n *\t\t\t\t\ttoolbar: [ 'resizeImage', ... ],\n *\t\t\t\t}\n *\t\t\t} )\n *\t\t\t.then( ... )\n *\t\t\t.catch( ... );\n *\n * **Resizing images using individual buttons**\n *\n * If you want to have separate buttons for {@link module:image/imageresize/imageresizebuttons~ImageResizeOption each option},\n * pass their names to the {@link module:image/image~ImageConfig#toolbar `config.image.toolbar`} instead. Please keep in mind\n * that this time **you must define the additional\n * {@link module:image/imageresize/imageresizebuttons~ImageResizeOption `icon` property}**:\n *\n *\t\tClassicEditor\n *\t\t\t.create( editorElement, {\n *\t\t\t\timage: {\n *\t\t\t\t\tresizeUnit: \"%\",\n *\t\t\t\t\tresizeOptions: [ {\n *\t\t\t\t\t\tname: 'resizeImage:original',\n *\t\t\t\t\t\tvalue: null,\n *\t\t\t\t\t\ticon: 'original'\n *\t\t\t\t\t},\n *\t\t\t\t\t{\n *\t\t\t\t\t\tname: 'resizeImage:25',\n *\t\t\t\t\t\tvalue: '25',\n *\t\t\t\t\t\ticon: 'small'\n *\t\t\t\t\t},\n *\t\t\t\t\t{\n *\t\t\t\t\t\tname: 'resizeImage:50',\n *\t\t\t\t\t\tvalue: '50',\n *\t\t\t\t\t\ticon: 'medium'\n *\t\t\t\t\t},\n *\t\t\t\t\t{\n *\t\t\t\t\t\tname: 'resizeImage:75',\n *\t\t\t\t\t\tvalue: '75',\n *\t\t\t\t\t\ticon: 'large'\n *\t\t\t\t\t} ],\n *\t\t\t\t\ttoolbar: [ 'resizeImage:25', 'resizeImage:50', 'resizeImage:75', 'resizeImage:original', ... ],\n *\t\t\t\t}\n *\t\t\t} )\n *\t\t\t.then( ... )\n *\t\t\t.catch( ... );\n *\n * **Customizing resize button labels**\n *\n * You can set your own label for each resize button. To do that, add the `label` property like in the example below.\n *\n * * When using the **dropdown**, the labels are displayed on the list of all options when you open the dropdown.\n * * When using **standalone buttons**, the labels will are displayed as tooltips when a user hovers over the button.\n *\n *\t\tClassicEditor\n *\t\t\t.create( editorElement, {\n *\t\t\t\timage: {\n *\t\t\t\t\tresizeUnit: \"%\",\n *\t\t\t\t\tresizeOptions: [ {\n *\t\t\t\t\t\tname: 'resizeImage:original',\n *\t\t\t\t\t\tvalue: null,\n *\t\t\t\t\t\tlabel: 'Original size'\n *\t\t\t\t\t\t// Note: add the \"icon\" property if you're configuring a standalone button.\n *\t\t\t\t\t},\n *\t\t\t\t\t{\n *\t\t\t\t\t\tname: 'resizeImage:50',\n *\t\t\t\t\t\tvalue: '50',\n *\t\t\t\t\t\tlabel: 'Medium size'\n *\t\t\t\t\t\t// Note: add the \"icon\" property if you're configuring a standalone button.\n *\t\t\t\t\t},\n *\t\t\t\t\t{\n *\t\t\t\t\t\tname: 'resizeImage:75',\n *\t\t\t\t\t\tvalue: '75',\n *\t\t\t\t\t\tlabel: 'Large size'\n *\t\t\t\t\t\t// Note: add the \"icon\" property if you're configuring a standalone button.\n *\t\t\t\t\t} ]\n *\t\t\t\t}\n *\t\t\t} )\n *\t\t\t.then( ... )\n *\t\t\t.catch( ... );\n *\n * **Default value**\n *\n * The following configuration is used by default:\n *\n *\t\tresizeOptions = [\n *\t\t\t{\n *\t\t\t\tname: 'resizeImage:original',\n *\t\t\t\tvalue: null,\n *\t\t\t\ticon: 'original'\n *\t\t\t},\n *\t\t\t{\n *\t\t\t\tname: 'resizeImage:25',\n *\t\t\t\tvalue: '25',\n *\t\t\t\ticon: 'small'\n *\t\t\t},\n *\t\t\t{\n *\t\t\t\tname: 'resizeImage:50',\n *\t\t\t\tvalue: '50',\n *\t\t\t\ticon: 'medium'\n *\t\t\t},\n *\t\t\t{\n *\t\t\t\tname: 'resizeImage:75',\n *\t\t\t\tvalue: '75',\n *\t\t\t\ticon: 'large'\n *\t\t\t}\n *\t\t];\n *\n * @member {Array.<module:image/imageresize/imageresizebuttons~ImageResizeOption>} module:image/image~ImageConfig#resizeOptions\n */\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageresize/imageresizebuttons\n */\n\nimport { Plugin, icons } from 'ckeditor5/src/core';\nimport { ButtonView, DropdownButtonView, Model, createDropdown, addListToDropdown } from 'ckeditor5/src/ui';\nimport { CKEditorError, Collection } from 'ckeditor5/src/utils';\n\nimport ImageResizeEditing from './imageresizeediting';\n\nconst RESIZE_ICONS = {\n\tsmall: icons.objectSizeSmall,\n\tmedium: icons.objectSizeMedium,\n\tlarge: icons.objectSizeLarge,\n\toriginal: icons.objectSizeFull\n};\n\n/**\n * The image resize buttons plugin.\n *\n * It adds a possibility to resize images using the toolbar dropdown or individual buttons, depending on the plugin configuration.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageResizeButtons extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageResizeEditing ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageResizeButtons';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor ) {\n\t\tsuper( editor );\n\n\t\t/**\n\t\t * The resize unit.\n\t\t *\n\t\t * @readonly\n\t\t * @private\n\t\t * @type {module:image/image~ImageConfig#resizeUnit}\n\t\t * @default '%'\n\t\t */\n\t\tthis._resizeUnit = editor.config.get( 'image.resizeUnit' );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst options = editor.config.get( 'image.resizeOptions' );\n\t\tconst command = editor.commands.get( 'resizeImage' );\n\n\t\tthis.bind( 'isEnabled' ).to( command );\n\n\t\tfor ( const option of options ) {\n\t\t\tthis._registerImageResizeButton( option );\n\t\t}\n\n\t\tthis._registerImageResizeDropdown( options );\n\t}\n\n\t/**\n\t * A helper function that creates a standalone button component for the plugin.\n\t *\n\t * @private\n\t * @param {module:image/imageresize/imageresizebuttons~ImageResizeOption} resizeOption A model of the resize option.\n\t */\n\t_registerImageResizeButton( option ) {\n\t\tconst editor = this.editor;\n\t\tconst { name, value, icon } = option;\n\t\tconst optionValueWithUnit = value ? value + this._resizeUnit : null;\n\n\t\teditor.ui.componentFactory.add( name, locale => {\n\t\t\tconst button = new ButtonView( locale );\n\t\t\tconst command = editor.commands.get( 'resizeImage' );\n\t\t\tconst labelText = this._getOptionLabelValue( option, true );\n\n\t\t\tif ( !RESIZE_ICONS[ icon ] ) {\n\t\t\t\t/**\n\t\t\t\t * When configuring {@link module:image/image~ImageConfig#resizeOptions `config.image.resizeOptions`} for standalone\n\t\t\t\t * buttons, a valid `icon` token must be set for each option.\n\t\t\t\t *\n\t\t\t\t * See all valid options described in the\n\t\t\t\t * {@link module:image/imageresize/imageresizebuttons~ImageResizeOption plugin configuration}.\n\t\t\t\t *\n\t\t\t\t * @error imageresizebuttons-missing-icon\n\t\t\t\t * @param {module:image/imageresize/imageresizebuttons~ImageResizeOption} option Invalid image resize option.\n\t\t\t\t*/\n\t\t\t\tthrow new CKEditorError(\n\t\t\t\t\t'imageresizebuttons-missing-icon',\n\t\t\t\t\teditor,\n\t\t\t\t\toption\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tbutton.set( {\n\t\t\t\t// Use the `label` property for a verbose description (because of ARIA).\n\t\t\t\tlabel: labelText,\n\t\t\t\ticon: RESIZE_ICONS[ icon ],\n\t\t\t\ttooltip: labelText,\n\t\t\t\tisToggleable: true\n\t\t\t} );\n\n\t\t\t// Bind button to the command.\n\t\t\tbutton.bind( 'isEnabled' ).to( this );\n\t\t\tbutton.bind( 'isOn' ).to( command, 'value', getIsOnButtonCallback( optionValueWithUnit ) );\n\n\t\t\tthis.listenTo( button, 'execute', () => {\n\t\t\t\teditor.execute( 'resizeImage', { width: optionValueWithUnit } );\n\t\t\t} );\n\n\t\t\treturn button;\n\t\t} );\n\t}\n\n\t/**\n\t * A helper function that creates a dropdown component for the plugin containing all the resize options defined in\n\t * the editor configuration.\n\t *\n\t * @private\n\t * @param {Array.<module:image/imageresize/imageresizebuttons~ImageResizeOption>} options An array of configured options.\n\t */\n\t_registerImageResizeDropdown( options ) {\n\t\tconst editor = this.editor;\n\t\tconst t = editor.t;\n\t\tconst originalSizeOption = options.find( option => !option.value );\n\n\t\tconst componentCreator = locale => {\n\t\t\tconst command = editor.commands.get( 'resizeImage' );\n\t\t\tconst dropdownView = createDropdown( locale, DropdownButtonView );\n\t\t\tconst dropdownButton = dropdownView.buttonView;\n\n\t\t\tdropdownButton.set( {\n\t\t\t\ttooltip: t( 'Resize image' ),\n\t\t\t\tcommandValue: originalSizeOption.value,\n\t\t\t\ticon: RESIZE_ICONS.medium,\n\t\t\t\tisToggleable: true,\n\t\t\t\tlabel: this._getOptionLabelValue( originalSizeOption ),\n\t\t\t\twithText: true,\n\t\t\t\tclass: 'ck-resize-image-button'\n\t\t\t} );\n\n\t\t\tdropdownButton.bind( 'label' ).to( command, 'value', commandValue => {\n\t\t\t\tif ( commandValue && commandValue.width ) {\n\t\t\t\t\treturn commandValue.width;\n\t\t\t\t} else {\n\t\t\t\t\treturn this._getOptionLabelValue( originalSizeOption );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tdropdownView.bind( 'isOn' ).to( command );\n\t\t\tdropdownView.bind( 'isEnabled' ).to( this );\n\n\t\t\taddListToDropdown( dropdownView, this._getResizeDropdownListItemDefinitions( options, command ) );\n\n\t\t\tdropdownView.listView.ariaLabel = t( 'Image resize list' );\n\n\t\t\t// Execute command when an item from the dropdown is selected.\n\t\t\tthis.listenTo( dropdownView, 'execute', evt => {\n\t\t\t\teditor.execute( evt.source.commandName, { width: evt.source.commandValue } );\n\t\t\t\teditor.editing.view.focus();\n\t\t\t} );\n\n\t\t\treturn dropdownView;\n\t\t};\n\n\t\t// Register `resizeImage` dropdown and add `imageResize` dropdown as an alias for backward compatibility.\n\t\teditor.ui.componentFactory.add( 'resizeImage', componentCreator );\n\t\teditor.ui.componentFactory.add( 'imageResize', componentCreator );\n\t}\n\n\t/**\n\t * A helper function for creating an option label value string.\n\t *\n\t * @private\n\t * @param {module:image/imageresize/imageresizebuttons~ImageResizeOption} option A resize option object.\n\t * @param {Boolean} [forTooltip] An optional flag for creating a tooltip label.\n\t * @returns {String} A user-defined label combined from the numeric value and the resize unit or the default label\n\t * for reset options (`Original`).\n\t */\n\t_getOptionLabelValue( option, forTooltip ) {\n\t\tconst t = this.editor.t;\n\n\t\tif ( option.label ) {\n\t\t\treturn option.label;\n\t\t} else if ( forTooltip ) {\n\t\t\tif ( option.value ) {\n\t\t\t\treturn t( 'Resize image to %0', option.value + this._resizeUnit );\n\t\t\t} else {\n\t\t\t\treturn t( 'Resize image to the original size' );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( option.value ) {\n\t\t\t\treturn option.value + this._resizeUnit;\n\t\t\t} else {\n\t\t\t\treturn t( 'Original' );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * A helper function that parses the resize options and returns list item definitions ready for use in the dropdown.\n\t *\n\t * @private\n\t * @param {Array.<module:image/imageresize/imageresizebuttons~ImageResizeOption>} options The resize options.\n\t * @param {module:image/imageresize/resizeimagecommand~ResizeImageCommand} command The resize image command.\n\t * @returns {Iterable.<module:ui/dropdown/utils~ListDropdownItemDefinition>} Dropdown item definitions.\n\t */\n\t_getResizeDropdownListItemDefinitions( options, command ) {\n\t\tconst itemDefinitions = new Collection();\n\n\t\toptions.map( option => {\n\t\t\tconst optionValueWithUnit = option.value ? option.value + this._resizeUnit : null;\n\t\t\tconst definition = {\n\t\t\t\ttype: 'button',\n\t\t\t\tmodel: new Model( {\n\t\t\t\t\tcommandName: 'resizeImage',\n\t\t\t\t\tcommandValue: optionValueWithUnit,\n\t\t\t\t\tlabel: this._getOptionLabelValue( option ),\n\t\t\t\t\twithText: true,\n\t\t\t\t\ticon: null\n\t\t\t\t} )\n\t\t\t};\n\n\t\t\tdefinition.model.bind( 'isOn' ).to( command, 'value', getIsOnButtonCallback( optionValueWithUnit ) );\n\n\t\t\titemDefinitions.add( definition );\n\t\t} );\n\n\t\treturn itemDefinitions;\n\t}\n}\n\n// A helper function for setting the `isOn` state of buttons in value bindings.\nfunction getIsOnButtonCallback( value ) {\n\treturn commandValue => {\n\t\tif ( value === null && commandValue === value ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn commandValue && commandValue.width === value;\n\t};\n}\n\n/**\n * The image resize option used in the {@link module:image/image~ImageConfig#resizeOptions image resize configuration}.\n *\n * @typedef {Object} module:image/imageresize/imageresizebuttons~ImageResizeOption\n * @property {String} name The name of the UI component that changes the image size.\n * * If you configure the feature using individual resize buttons, you can refer to this name in the\n * {@link module:image/image~ImageConfig#toolbar image toolbar configuration}.\n * * If you configure the feature using the resize dropdown, this name will be used for a list item in the dropdown.\n * @property {String} value The value of the resize option without the unit\n * ({@link module:image/image~ImageConfig#resizeUnit configured separately}). `null` resets an image to its original size.\n * @property {String} [icon] An icon used by an individual resize button (see the `name` property to learn more).\n * Available icons are: `'small'`, `'medium'`, `'large'`, `'original'`.\n * @property {String} [label] An option label displayed in the dropdown or, if the feature is configured using\n * individual buttons, a {@link module:ui/button/buttonview~ButtonView#tooltip} and an ARIA attribute of a button.\n * If not specified, the label is generated automatically based on the `value` option and the\n * {@link module:image/image~ImageConfig#resizeUnit `config.image.resizeUnit`}.\n */\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageresize/imageresizeediting\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport ImageUtils from '../imageutils';\nimport ResizeImageCommand from './resizeimagecommand';\n\n/**\n * The image resize editing feature.\n *\n * It adds the ability to resize each image using handles or manually by\n * {@link module:image/imageresize/imageresizebuttons~ImageResizeButtons} buttons.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageResizeEditing extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageUtils ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageResizeEditing';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor ) {\n\t\tsuper( editor );\n\n\t\teditor.config.define( 'image', {\n\t\t\tresizeUnit: '%',\n\t\t\tresizeOptions: [ {\n\t\t\t\tname: 'resizeImage:original',\n\t\t\t\tvalue: null,\n\t\t\t\ticon: 'original'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'resizeImage:25',\n\t\t\t\tvalue: '25',\n\t\t\t\ticon: 'small'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'resizeImage:50',\n\t\t\t\tvalue: '50',\n\t\t\t\ticon: 'medium'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'resizeImage:75',\n\t\t\t\tvalue: '75',\n\t\t\t\ticon: 'large'\n\t\t\t} ]\n\t\t} );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst resizeImageCommand = new ResizeImageCommand( editor );\n\n\t\tthis._registerSchema();\n\t\tthis._registerConverters( 'imageBlock' );\n\t\tthis._registerConverters( 'imageInline' );\n\n\t\t// Register `resizeImage` command and add `imageResize` command as an alias for backward compatibility.\n\t\teditor.commands.add( 'resizeImage', resizeImageCommand );\n\t\teditor.commands.add( 'imageResize', resizeImageCommand );\n\t}\n\n\t/**\n\t * @private\n\t */\n\t_registerSchema() {\n\t\tif ( this.editor.plugins.has( 'ImageBlockEditing' ) ) {\n\t\t\tthis.editor.model.schema.extend( 'imageBlock', { allowAttributes: 'width' } );\n\t\t}\n\n\t\tif ( this.editor.plugins.has( 'ImageInlineEditing' ) ) {\n\t\t\tthis.editor.model.schema.extend( 'imageInline', { allowAttributes: 'width' } );\n\t\t}\n\t}\n\n\t/**\n\t * Registers image resize converters.\n\t *\n\t * @private\n\t * @param {'imageBlock'|'imageInline'} imageType The type of the image.\n\t */\n\t_registerConverters( imageType ) {\n\t\tconst editor = this.editor;\n\n\t\t// Dedicated converter to propagate image's attribute to the img tag.\n\t\teditor.conversion.for( 'downcast' ).add( dispatcher =>\n\t\t\tdispatcher.on( `attribute:width:${ imageType }`, ( evt, data, conversionApi ) => {\n\t\t\t\tif ( !conversionApi.consumable.consume( data.item, evt.name ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst viewWriter = conversionApi.writer;\n\t\t\t\tconst figure = conversionApi.mapper.toViewElement( data.item );\n\n\t\t\t\tif ( data.attributeNewValue !== null ) {\n\t\t\t\t\tviewWriter.setStyle( 'width', data.attributeNewValue, figure );\n\t\t\t\t\tviewWriter.addClass( 'image_resized', figure );\n\t\t\t\t} else {\n\t\t\t\t\tviewWriter.removeStyle( 'width', figure );\n\t\t\t\t\tviewWriter.removeClass( 'image_resized', figure );\n\t\t\t\t}\n\t\t\t} )\n\t\t);\n\n\t\teditor.conversion.for( 'upcast' )\n\t\t\t.attributeToAttribute( {\n\t\t\t\tview: {\n\t\t\t\t\tname: imageType === 'imageBlock' ? 'figure' : 'img',\n\t\t\t\t\tstyles: {\n\t\t\t\t\t\twidth: /.+/\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tmodel: {\n\t\t\t\t\tkey: 'width',\n\t\t\t\t\tvalue: viewElement => viewElement.getStyle( 'width' )\n\t\t\t\t}\n\t\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageresize/imageresizehandles\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { WidgetResize } from 'ckeditor5/src/widget';\n\nimport ImageLoadObserver from '../image/imageloadobserver';\n\nconst RESIZABLE_IMAGES_CSS_SELECTOR =\n\t'figure.image.ck-widget > img,' +\n\t'figure.image.ck-widget > picture > img,' +\n\t'figure.image.ck-widget > a > img,' +\n\t'figure.image.ck-widget > a > picture > img,' +\n\t'span.image-inline.ck-widget > img,' +\n\t'span.image-inline.ck-widget > picture > img';\n\nconst IMAGE_WIDGETS_CLASSES_MATCH_REGEXP = /(image|image-inline)/;\n\nconst RESIZED_IMAGE_CLASS = 'image_resized';\n\n/**\n * The image resize by handles feature.\n *\n * It adds the ability to resize each image using handles or manually by\n * {@link module:image/imageresize/imageresizebuttons~ImageResizeButtons} buttons.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageResizeHandles extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ WidgetResize ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageResizeHandles';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst command = this.editor.commands.get( 'resizeImage' );\n\t\tthis.bind( 'isEnabled' ).to( command );\n\n\t\tthis._setupResizerCreator();\n\t}\n\n\t/**\n\t * Attaches the listeners responsible for creating a resizer for each image, except for images inside the HTML embed preview.\n\t *\n\t * @private\n\t */\n\t_setupResizerCreator() {\n\t\tconst editor = this.editor;\n\t\tconst editingView = editor.editing.view;\n\n\t\teditingView.addObserver( ImageLoadObserver );\n\n\t\tthis.listenTo( editingView.document, 'imageLoaded', ( evt, domEvent ) => {\n\t\t\t// The resizer must be attached only to images loaded by the `ImageInsert`, `ImageUpload` or `LinkImage` plugins.\n\t\t\tif ( !domEvent.target.matches( RESIZABLE_IMAGES_CSS_SELECTOR ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst domConverter = editor.editing.view.domConverter;\n\t\t\tconst imageView = domConverter.domToView( domEvent.target );\n\t\t\tconst widgetView = imageView.findAncestor( { classes: IMAGE_WIDGETS_CLASSES_MATCH_REGEXP } );\n\t\t\tlet resizer = this.editor.plugins.get( WidgetResize ).getResizerByViewElement( widgetView );\n\n\t\t\tif ( resizer ) {\n\t\t\t\t// There are rare cases when the image will be triggered multiple times for the same widget, e.g. when\n\t\t\t\t// the image's source was changed after upload (https://github.com/ckeditor/ckeditor5/pull/8108#issuecomment-708302992).\n\t\t\t\tresizer.redraw();\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst mapper = editor.editing.mapper;\n\t\t\tconst imageModel = mapper.toModelElement( widgetView );\n\n\t\t\tresizer = editor.plugins\n\t\t\t\t.get( WidgetResize )\n\t\t\t\t.attachTo( {\n\t\t\t\t\tunit: editor.config.get( 'image.resizeUnit' ),\n\n\t\t\t\t\tmodelElement: imageModel,\n\t\t\t\t\tviewElement: widgetView,\n\t\t\t\t\teditor,\n\n\t\t\t\t\tgetHandleHost( domWidgetElement ) {\n\t\t\t\t\t\treturn domWidgetElement.querySelector( 'img' );\n\t\t\t\t\t},\n\t\t\t\t\tgetResizeHost() {\n\t\t\t\t\t\t// Return the model image element parent to avoid setting an inline element (<a>/<span>) as a resize host.\n\t\t\t\t\t\treturn domConverter.mapViewToDom( mapper.toViewElement( imageModel.parent ) );\n\t\t\t\t\t},\n\t\t\t\t\t// TODO consider other positions.\n\t\t\t\t\tisCentered() {\n\t\t\t\t\t\tconst imageStyle = imageModel.getAttribute( 'imageStyle' );\n\n\t\t\t\t\t\treturn !imageStyle || imageStyle == 'block' || imageStyle == 'alignCenter';\n\t\t\t\t\t},\n\n\t\t\t\t\tonCommit( newValue ) {\n\t\t\t\t\t\t// Get rid of the CSS class in case the command execution that follows is unsuccessful\n\t\t\t\t\t\t// (e.g. Track Changes can override it and the new dimensions will not apply). Otherwise,\n\t\t\t\t\t\t// the presence of the class and the absence of the width style will cause it to take 100%\n\t\t\t\t\t\t// of the horizontal space.\n\t\t\t\t\t\teditingView.change( writer => {\n\t\t\t\t\t\t\twriter.removeClass( RESIZED_IMAGE_CLASS, widgetView );\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\teditor.execute( 'resizeImage', { width: newValue } );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\tresizer.on( 'updateSize', () => {\n\t\t\t\tif ( !widgetView.hasClass( RESIZED_IMAGE_CLASS ) ) {\n\t\t\t\t\teditingView.change( writer => {\n\t\t\t\t\t\twriter.addClass( RESIZED_IMAGE_CLASS, widgetView );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tresizer.bind( 'isEnabled' ).to( this );\n\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageresize/resizeimagecommand\n */\n\nimport { Command } from 'ckeditor5/src/core';\n\n/**\n * The resize image command. Currently, it only supports the width attribute.\n *\n * @extends module:core/command~Command\n */\nexport default class ResizeImageCommand extends Command {\n\t/**\n\t * @inheritDoc\n\t */\n\trefresh() {\n\t\tconst editor = this.editor;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst element = imageUtils.getClosestSelectedImageElement( editor.model.document.selection );\n\n\t\tthis.isEnabled = !!element;\n\n\t\tif ( !element || !element.hasAttribute( 'width' ) ) {\n\t\t\tthis.value = null;\n\t\t} else {\n\t\t\tthis.value = {\n\t\t\t\twidth: element.getAttribute( 'width' ),\n\t\t\t\theight: null\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Executes the command.\n\t *\n\t *\t\t// Sets the width to 50%:\n\t *\t\teditor.execute( 'resizeImage', { width: '50%' } );\n\t *\n\t *\t\t// Removes the width attribute:\n\t *\t\teditor.execute( 'resizeImage', { width: null } );\n\t *\n\t * @param {Object} options\n\t * @param {String|null} options.width The new width of the image.\n\t * @fires execute\n\t */\n\texecute( options ) {\n\t\tconst editor = this.editor;\n\t\tconst model = editor.model;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst imageElement = imageUtils.getClosestSelectedImageElement( model.document.selection );\n\n\t\tthis.value = {\n\t\t\twidth: options.width,\n\t\t\theight: null\n\t\t};\n\n\t\tif ( imageElement ) {\n\t\t\tmodel.change( writer => {\n\t\t\t\twriter.setAttribute( 'width', options.width, imageElement );\n\t\t\t} );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagestyle\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport ImageStyleEditing from './imagestyle/imagestyleediting';\nimport ImageStyleUI from './imagestyle/imagestyleui';\n\n/**\n * The image style plugin.\n *\n * For a detailed overview of the image styles feature, check the {@glink features/images/images-styles documentation}.\n *\n * This is a \"glue\" plugin which loads the following plugins:\n * * {@link module:image/imagestyle/imagestyleediting~ImageStyleEditing},\n * * {@link module:image/imagestyle/imagestyleui~ImageStyleUI}\n *\n * It provides a default configuration, which can be extended or overwritten.\n * Read more about the {@link module:image/image~ImageConfig#styles image styles configuration}.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageStyle extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageStyleEditing, ImageStyleUI ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageStyle';\n\t}\n}\n\n/**\n * The configuration for the {@link module:image/imagestyle~ImageStyle} plugin that should be provided\n * while creating the editor instance.\n *\n * A detailed information about the default configuration and customization can be found in\n * {@link module:image/image~ImageConfig#styles `ImageConfig#styles`}.\n *\n * @interface ImageStyleConfig\n */\n\n/**\n * A list of the image style options.\n *\n * @member {Array.<module:image/imagestyle~ImageStyleOptionDefinition>} module:image/imagestyle~ImageStyleConfig#options\n */\n\n/**\n * The {@link module:image/imagestyle `ImageStyle`} plugin requires a list of the\n * {@link module:image/imagestyle~ImageStyleConfig#options image style options} to work properly.\n * The default configuration is provided (listed below) and can be customized while creating the editor instance.\n *\n * # **Command**\n *\n * The {@link module:image/imagestyle/imagestylecommand~ImageStyleCommand `imageStyleCommand`}\n * is configured based on the defined options,\n * so you can change the style of the selected image by executing the following command:\n *\n *\t\teditor.execute( 'imageStyle' { value: 'alignLeft' } );\n *\n * # **Buttons**\n *\n * All of the image style options provided in the configuration are registered\n * in the {@link module:ui/componentfactory~ComponentFactory UI components factory} with the \"imageStyle:\" prefixes and can be used\n * in the {@link module:image/image~ImageConfig#toolbar image toolbar configuration}. The buttons available by default depending\n * on the loaded plugins are listed in the next section.\n *\n * Read more about styling images in the {@glink features/images/images-styles Image styles guide}.\n *\n * # **Default options and buttons**\n *\n * If the custom configuration is not provided, the default configuration will be used depending on the loaded\n * image editing plugins.\n *\n * * If both {@link module:image/image/imageblockediting~ImageBlockEditing `ImageBlockEditing`} and\n * {@link module:image/image/imageinlineediting~ImageInlineEditing `ImageInlineEditing`} plugins are loaded\n * (which is usually the default editor configuration), the following options will be available for the toolbar\n * configuration. These options will be registered as the buttons with the \"imageStyle:\" prefixes.\n *\n *\t\tconst imageDefaultConfig = {\n *\t\t\tstyles: {\n *\t\t\t\toptions: [\n *\t\t\t\t\t'inline', 'alignLeft', 'alignRight',\n *\t\t\t\t\t'alignCenter', 'alignBlockLeft', 'alignBlockRight',\n *\t\t\t\t\t'block', 'side'\n *\t\t\t\t]\n *\t\t\t}\n *\t\t};\n *\n * * If only the {@link module:image/image/imageblockediting~ImageBlockEditing `ImageBlockEditing`} plugin is loaded,\n * the following buttons (options) and groups will be available for the toolbar configuration.\n * These options will be registered as the buttons with the \"imageStyle:\" prefixes.\n *\n *\t\tconst imageDefaultConfig = {\n *\t\t\tstyles: {\n *\t\t\t\toptions: [ 'block', 'side' ]\n *\t\t\t}\n *\t\t};\n *\n * * If only the {@link module:image/image/imageinlineediting~ImageInlineEditing `ImageInlineEditing`} plugin is loaded,\n * the following buttons (options) and groups will available for the toolbar configuration.\n * These options will be registered as the buttons with the \"imageStyle:\" prefixes.\n *\n *\t\tconst imageDefaultConfig = {\n *\t\t\tstyles: {\n *\t\t\t\toptions: [ 'inline', 'alignLeft', 'alignRight' ]\n *\t\t\t}\n *\t\t};\n *\n * Read more about the {@link module:image/imagestyle/utils~DEFAULT_OPTIONS default styling options}.\n *\n * # **Custom configuration**\n *\n * The image styles configuration can be customized in several ways:\n *\n * * Any of the {@link module:image/imagestyle/utils~DEFAULT_OPTIONS default styling options}\n * can be loaded by the reference to its name as follows:\n *\n *\t\tClassicEditor\n *\t\t\t.create( editorElement, {\n *\t\t\t\timage: {\n *\t\t\t\t\tstyles: {\n *\t\t\t\t\t\toptions: [ 'alignLeft', 'alignRight' ]\n *\t\t\t\t\t}\n *\t\t\t\t}\n *\t\t\t} );\n *\n * * Each of the {@link module:image/imagestyle/utils~DEFAULT_OPTIONS default image style options} can be customized,\n * e.g. to change the `icon`, `title` or CSS `className` of the style. The feature also provides several\n * {@link module:image/imagestyle/utils~DEFAULT_ICONS default icons} to choose from.\n *\n *\t\timport customIcon from 'custom-icon.svg';\n *\n *\t\t// ...\n *\n *\t\tClassicEditor.create( editorElement, { image:\n *\t\t\tstyles: {\n *\t\t\t\toptions: {\n *\t\t\t\t\t// This will only customize the icon of the \"block\" style.\n *\t\t\t\t\t// Note: 'right' is one of default icons provided by the feature.\n *\t\t\t\t\t{\n *\t\t\t\t\t\tname: 'block',\n *\t\t\t\t\t\ticon: 'right'\n *\t\t\t\t\t},\n *\n *\t\t\t\t\t// This will customize the icon, title and CSS class of the default \"side\" style.\n *\t\t\t\t\t{\n *\t\t\t\t\t\tname: 'side',\n *\t\t\t\t\t\ticon: customIcon,\n *\t\t\t\t\t\ttitle: 'My side style',\n *\t\t\t\t\t\tclassName: 'custom-side-image'\n *\t\t\t\t\t}\n *\t\t\t\t}\n *\t\t\t}\n *\t\t} );\n *\n * * If none of the {@link module:image/imagestyle/utils~DEFAULT_OPTIONS default image style options}\n * works for the integration, it is possible to define independent custom styles, too.\n *\n * See the documentation about the image style {@link module:image/imagestyle~ImageStyleOptionDefinition options}\n * to define the custom image style configuration properly.\n *\n *\t\timport redIcon from 'red-icon.svg';\n *\t\timport blueIcon from 'blue-icon.svg';\n *\n *\t\t// ...\n *\n *\t\tClassicEditor.create( editorElement, { image:\n *\t\t\tstyles: {\n *\t\t\t\t// A list of completely custom styling options.\n *\t\t\t\toptions: [\n *\t\t\t\t\t{\n *\t\t\t\t\t\tname: 'regular',\n *\t\t\t\t\t\tmodelElements: [ 'imageBlock', 'imageInline' ],\n *\t\t\t\t\t\ttitle: 'Regular image',\n *\t\t\t\t\t\ticon: 'full',\n *\t\t\t\t\t\tisDefault: true\n *\t\t\t\t\t}, {\n *\t\t\t\t\t\tname: 'blue',\n *\t\t\t\t\t\tmodelElements: [ 'imageInline' ],\n *\t\t\t\t\t\ttitle: 'Blue image',\n *\t\t\t\t\t\ticon: blueIcon,\n *\t\t\t\t\t\tclassName: 'image-blue'\n *\t\t\t\t\t}, {\n *\t\t\t\t\t\tname: 'red',\n *\t\t\t\t\t\tmodelElements: [ 'imageBlock' ],\n *\t\t\t\t\t\ttitle: 'Red image',\n *\t\t\t\t\t\ticon: redIcon,\n *\t\t\t\t\t\tclassName: 'image-red'\n *\t\t\t\t\t}\n *\t\t\t\t]\n *\t\t\t}\n *\t\t} );\n *\n * @member {module:image/imagestyle~ImageStyleConfig} module:image/image~ImageConfig#styles\n */\n\n/**\n * The image styling option definition descriptor.\n *\n * This definition should be implemented in the `Image` plugin {@link module:image/image~ImageConfig#styles configuration} for:\n *\n * * customizing one of the {@link module:image/imagestyle/utils~DEFAULT_OPTIONS default styling options} by providing the proper name\n * of the default style and the properties that should be overridden,\n * * or defining a completely custom styling option by providing a custom name and implementing the following properties.\n *\n *\t\timport fullSizeIcon from 'path/to/icon.svg';\n *\n *\t\tconst imageStyleOptionDefinition = {\n *\t\t\tname: 'fullSize',\n *\t\t\ticon: fullSizeIcon,\n *\t\t\ttitle: 'Full size image',\n *\t\t\tclassName: 'image-full-size',\n *\t\t\tmodelElements: [ 'imageBlock', 'imageInline' ]\n *\t\t}\n *\n * The styling option will be registered as the button under the name `'imageStyle:{name}'` in the\n * {@link module:ui/componentfactory~ComponentFactory UI components factory} (this functionality is provided by the\n * {@link module:image/imagestyle/imagestyleui~ImageStyleUI} plugin).\n *\n * @property {String} name The unique name of the styling option. It will be used to:\n *\n * * refer to one of the {@link module:image/imagestyle/utils~DEFAULT_OPTIONS default styling options} or define the custom style,\n * * store the chosen style in the model by setting the `imageStyle` attribute of the model image element,\n * * as a value of the {@link module:image/imagestyle/imagestylecommand~ImageStyleCommand#execute `imageStyle` command},\n * * when registering a button for the style in the following manner: (`'imageStyle:{name}'`).\n *\n * @property {Boolean} [isDefault] When set, the style will be used as the default one for the model elements\n * listed in the `modelElements` property. A default style does not apply any CSS class to the view element.\n *\n * If this property is not defined, its value is inherited\n * from the {@link module:image/imagestyle/utils~DEFAULT_OPTIONS default styling options} addressed in the name property.\n *\n * @property {String} icon One of the following to be used when creating the styles's button:\n *\n * * an SVG icon source (as an XML string),\n * * one of the keys in {@link module:image/imagestyle/utils~DEFAULT_ICONS} to use one of default icons provided by the plugin.\n *\n * If this property is not defined, its value is inherited\n * from the {@link module:image/imagestyle/utils~DEFAULT_OPTIONS default styling options} addressed in the name property.\n *\n * @property {String} title The styles's title. Setting `title` to one of\n * {@link module:image/imagestyle/imagestyleui~ImageStyleUI#localizedDefaultStylesTitles}\n * will automatically translate it to the language of the editor.\n *\n * If this property is not defined, its value is inherited\n * from the {@link module:image/imagestyle/utils~DEFAULT_OPTIONS default styling options} addressed in the name property.\n *\n * @property {String} [className] The CSS class used to represent the style in the view.\n * It should be used only for the non-default styles.\n *\n * If this property is not defined, its value is inherited\n * from the {@link module:image/imagestyle/utils~DEFAULT_OPTIONS default styling options} addressed in the name property.\n *\n * @property {Array.<String>} modelElements The list of the names of the model elements that are supported by the style.\n * The possible values are:\n * * `[ 'imageBlock' ]` if the style can be applied to the image type introduced by the\n * {@link module:image/image/imageblockediting~ImageBlockEditing `ImageBlockEditing`} plugin,\n * * `[ 'imageInline' ]` if the style can be applied to the image type introduced by the\n * {@link module:image/image/imageinlineediting~ImageInlineEditing `ImageInlineEditing`} plugin,\n * * `[ 'imageInline', 'imageBlock' ]` if the style can be applied to both image types introduced by the plugins mentioned above.\n *\n * This property determines which model element names work with the style. If the model element name of the currently selected\n * image is different, upon executing the\n * {@link module:image/imagestyle/imagestylecommand~ImageStyleCommand#execute `imageStyle`} command the image type (model element name)\n * will automatically change.\n *\n * If this property is not defined, its value is inherited\n * from the {@link module:image/imagestyle/utils~DEFAULT_OPTIONS default styling options} addressed in the name property.\n *\n * @typedef {Object} module:image/imagestyle~ImageStyleOptionDefinition\n */\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\nimport { first } from 'ckeditor5/src/utils';\n\n/**\n * @module image/imagestyle/converters\n */\n\n/**\n * Returns a converter for the `imageStyle` attribute. It can be used for adding, changing and removing the attribute.\n *\n * @param {Array.<module:image/imagestyle~ImageStyleOptionDefinition>} styles\n * An array containing available image style options.\n * @returns {Function} A model-to-view attribute converter.\n */\nexport function modelToViewStyleAttribute( styles ) {\n\treturn ( evt, data, conversionApi ) => {\n\t\tif ( !conversionApi.consumable.consume( data.item, evt.name ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if there is class name associated with given value.\n\t\tconst newStyle = getStyleDefinitionByName( data.attributeNewValue, styles );\n\t\tconst oldStyle = getStyleDefinitionByName( data.attributeOldValue, styles );\n\n\t\tconst viewElement = conversionApi.mapper.toViewElement( data.item );\n\t\tconst viewWriter = conversionApi.writer;\n\n\t\tif ( oldStyle ) {\n\t\t\tviewWriter.removeClass( oldStyle.className, viewElement );\n\t\t}\n\n\t\tif ( newStyle ) {\n\t\t\tviewWriter.addClass( newStyle.className, viewElement );\n\t\t}\n\t};\n}\n\n/**\n * Returns a view-to-model converter converting image CSS classes to a proper value in the model.\n *\n * @param {Array.<module:image/imagestyle~ImageStyleOptionDefinition>} styles\n * Image style options for which the converter is created.\n * @returns {Function} A view-to-model converter.\n */\nexport function viewToModelStyleAttribute( styles ) {\n\t// Convert only non–default styles.\n\tconst nonDefaultStyles = {\n\t\timageInline: styles.filter( style => !style.isDefault && style.modelElements.includes( 'imageInline' ) ),\n\t\timageBlock: styles.filter( style => !style.isDefault && style.modelElements.includes( 'imageBlock' ) )\n\t};\n\n\treturn ( evt, data, conversionApi ) => {\n\t\tif ( !data.modelRange ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst viewElement = data.viewItem;\n\t\tconst modelImageElement = first( data.modelRange.getItems() );\n\n\t\t// Run this converter only if an image has been found in the model.\n\t\t// In some cases it may not be found (for example if we run this on a figure with different type than image).\n\t\tif ( !modelImageElement ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// ...and the `imageStyle` attribute is allowed for that element, otherwise stop conversion early.\n\t\tif ( !conversionApi.schema.checkAttribute( modelImageElement, 'imageStyle' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Convert styles one by one.\n\t\tfor ( const style of nonDefaultStyles[ modelImageElement.name ] ) {\n\t\t\t// Try to consume class corresponding with the style.\n\t\t\tif ( conversionApi.consumable.consume( viewElement, { classes: style.className } ) ) {\n\t\t\t\t// And convert this style to model attribute.\n\t\t\t\tconversionApi.writer.setAttribute( 'imageStyle', style.name, modelImageElement );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Returns the style with a given `name` from an array of styles.\n//\n// @param {String} name\n// @param {Array.<module:image/imagestyle~ImageStyleOptionDefinition> } styles\n// @returns {module:image/imagestyle~ImageStyleOptionDefinition|undefined}\nfunction getStyleDefinitionByName( name, styles ) {\n\tfor ( const style of styles ) {\n\t\tif ( style.name === name ) {\n\t\t\treturn style;\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagestyle/imagestylecommand\n */\n\nimport { Command } from 'ckeditor5/src/core';\n\n/**\n * The image style command. It is used to apply {@link module:image/imagestyle~ImageStyleConfig#options image style option}\n * to a selected image.\n *\n * **Note**: Executing this command may change the image model element if the desired style requires an image of a different\n * type. See {@link module:image/imagestyle/imagestylecommand~ImageStyleCommand#execute} to learn more.\n *\n * @extends module:core/command~Command\n */\nexport default class ImageStyleCommand extends Command {\n\t/**\n\t * Creates an instance of the image style command. When executed, the command applies one of\n\t * {@link module:image/imagestyle~ImageStyleConfig#options style options} to the currently selected image.\n\t *\n\t * @param {module:core/editor/editor~Editor} editor The editor instance.\n\t * @param {Array.<module:image/imagestyle~ImageStyleOptionDefinition>} styles\n\t * The style options that this command supports.\n\t */\n\tconstructor( editor, styles ) {\n\t\tsuper( editor );\n\n\t\t/**\n\t\t * An object containing names of default style options for the inline and block images.\n\t\t * If there is no default style option for the given image type in the configuration,\n\t\t * the name will be `false`.\n\t\t *\n\t\t * @private\n\t\t * @type {Object.<String,module:image/imagestyle~ImageStyleOptionDefinition#name>}\n\t\t */\n\t\tthis._defaultStyles = {\n\t\t\timageBlock: false,\n\t\t\timageInline: false\n\t\t};\n\n\t\t/**\n\t\t * The styles handled by this command.\n\t\t *\n\t\t * @private\n\t\t * @type {module:image/imagestyle~ImageStyleConfig#options}\n\t\t */\n\t\tthis._styles = new Map( styles.map( style => {\n\t\t\tif ( style.isDefault ) {\n\t\t\t\tfor ( const modelElementName of style.modelElements ) {\n\t\t\t\t\tthis._defaultStyles[ modelElementName ] = style.name;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn [ style.name, style ];\n\t\t} ) );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\trefresh() {\n\t\tconst editor = this.editor;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst element = imageUtils.getClosestSelectedImageElement( this.editor.model.document.selection );\n\n\t\tthis.isEnabled = !!element;\n\n\t\tif ( !this.isEnabled ) {\n\t\t\tthis.value = false;\n\t\t} else if ( element.hasAttribute( 'imageStyle' ) ) {\n\t\t\tthis.value = element.getAttribute( 'imageStyle' );\n\t\t} else {\n\t\t\tthis.value = this._defaultStyles[ element.name ];\n\t\t}\n\t}\n\n\t/**\n\t * Executes the command and applies the style to the currently selected image:\n\t *\n\t *\t\teditor.execute( 'imageStyle', { value: 'side' } );\n\t *\n\t * **Note**: Executing this command may change the image model element if the desired style requires an image\n\t * of a different type. Learn more about {@link module:image/imagestyle~ImageStyleOptionDefinition#modelElements model element}\n\t * configuration for the style option.\n\t *\n\t * @param {Object} options\n\t * @param {module:image/imagestyle~ImageStyleOptionDefinition#name} options.value The name of the style (as configured in\n\t * {@link module:image/imagestyle~ImageStyleConfig#options}).\n\t * @fires execute\n\t */\n\texecute( options = {} ) {\n\t\tconst editor = this.editor;\n\t\tconst model = editor.model;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\n\t\tmodel.change( writer => {\n\t\t\tconst requestedStyle = options.value;\n\n\t\t\tlet imageElement = imageUtils.getClosestSelectedImageElement( model.document.selection );\n\n\t\t\t// Change the image type if a style requires it.\n\t\t\tif ( requestedStyle && this.shouldConvertImageType( requestedStyle, imageElement ) ) {\n\t\t\t\tthis.editor.execute( imageUtils.isBlockImage( imageElement ) ? 'imageTypeInline' : 'imageTypeBlock' );\n\n\t\t\t\t// Update the imageElement to the newly created image.\n\t\t\t\timageElement = imageUtils.getClosestSelectedImageElement( model.document.selection );\n\t\t\t}\n\n\t\t\t// Default style means that there is no `imageStyle` attribute in the model.\n\t\t\t// https://github.com/ckeditor/ckeditor5-image/issues/147\n\t\t\tif ( !requestedStyle || this._styles.get( requestedStyle ).isDefault ) {\n\t\t\t\twriter.removeAttribute( 'imageStyle', imageElement );\n\t\t\t} else {\n\t\t\t\twriter.setAttribute( 'imageStyle', requestedStyle, imageElement );\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * Returns `true` if requested style change would trigger the image type change.\n\t *\n\t * @param {module:image/imagestyle~ImageStyleOptionDefinition} requestedStyle The name of the style (as configured in\n\t * {@link module:image/imagestyle~ImageStyleConfig#options}).\n\t * @param {module:engine/model/element~Element} imageElement The image model element.\n\t * @returns {Boolean}\n\t */\n\tshouldConvertImageType( requestedStyle, imageElement ) {\n\t\tconst supportedTypes = this._styles.get( requestedStyle ).modelElements;\n\n\t\treturn !supportedTypes.includes( imageElement.name );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagestyle/imagestyleediting\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport ImageStyleCommand from './imagestylecommand';\nimport ImageUtils from '../imageutils';\nimport utils from './utils';\nimport { viewToModelStyleAttribute, modelToViewStyleAttribute } from './converters';\n\n/**\n * The image style engine plugin. It sets the default configuration, creates converters and registers\n * {@link module:image/imagestyle/imagestylecommand~ImageStyleCommand ImageStyleCommand}.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageStyleEditing extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageStyleEditing';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageUtils ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst { normalizeStyles, getDefaultStylesConfiguration } = utils;\n\t\tconst editor = this.editor;\n\t\tconst isBlockPluginLoaded = editor.plugins.has( 'ImageBlockEditing' );\n\t\tconst isInlinePluginLoaded = editor.plugins.has( 'ImageInlineEditing' );\n\n\t\teditor.config.define( 'image.styles', getDefaultStylesConfiguration( isBlockPluginLoaded, isInlinePluginLoaded ) );\n\n\t\t/**\n\t\t * It contains a list of the normalized and validated style options.\n\t\t *\n\t\t * * Each option contains a complete icon markup.\n\t\t * * The style options not supported by any of the loaded image editing plugins (\n\t\t * {@link module:image/image/imageinlineediting~ImageInlineEditing `ImageInlineEditing`} or\n\t\t * {@link module:image/image/imageblockediting~ImageBlockEditing `ImageBlockEditing`}) are filtered out.\n\t\t *\n\t\t * @protected\n\t\t * @readonly\n\t\t * @type {module:image/imagestyle~ImageStyleConfig}\n\t\t */\n\t\tthis.normalizedStyles = normalizeStyles( {\n\t\t\tconfiguredStyles: editor.config.get( 'image.styles' ),\n\t\t\tisBlockPluginLoaded,\n\t\t\tisInlinePluginLoaded\n\t\t} );\n\n\t\tthis._setupConversion( isBlockPluginLoaded, isInlinePluginLoaded );\n\t\tthis._setupPostFixer();\n\n\t\t// Register imageStyle command.\n\t\teditor.commands.add( 'imageStyle', new ImageStyleCommand( editor, this.normalizedStyles ) );\n\t}\n\n\t/**\n\t * Sets the editor conversion taking the presence of\n\t * {@link module:image/image/imageinlineediting~ImageInlineEditing `ImageInlineEditing`}\n\t * and {@link module:image/image/imageblockediting~ImageBlockEditing `ImageBlockEditing`} plugins into consideration.\n\t *\n\t * @private\n\t * @param {Boolean} isBlockPluginLoaded\n\t * @param {Boolean} isInlinePluginLoaded\n\t */\n\t_setupConversion( isBlockPluginLoaded, isInlinePluginLoaded ) {\n\t\tconst editor = this.editor;\n\t\tconst schema = editor.model.schema;\n\n\t\tconst modelToViewConverter = modelToViewStyleAttribute( this.normalizedStyles );\n\t\tconst viewToModelConverter = viewToModelStyleAttribute( this.normalizedStyles );\n\n\t\teditor.editing.downcastDispatcher.on( 'attribute:imageStyle', modelToViewConverter );\n\t\teditor.data.downcastDispatcher.on( 'attribute:imageStyle', modelToViewConverter );\n\n\t\t// Allow imageStyle attribute in image and imageInline.\n\t\t// We could call it 'style' but https://github.com/ckeditor/ckeditor5-engine/issues/559.\n\t\tif ( isBlockPluginLoaded ) {\n\t\t\tschema.extend( 'imageBlock', { allowAttributes: 'imageStyle' } );\n\n\t\t\t// Converter for figure element from view to model.\n\t\t\teditor.data.upcastDispatcher.on( 'element:figure', viewToModelConverter, { priority: 'low' } );\n\t\t}\n\n\t\tif ( isInlinePluginLoaded ) {\n\t\t\tschema.extend( 'imageInline', { allowAttributes: 'imageStyle' } );\n\n\t\t\t// Converter for the img element from view to model.\n\t\t\teditor.data.upcastDispatcher.on( 'element:img', viewToModelConverter, { priority: 'low' } );\n\t\t}\n\t}\n\n\t/**\n\t * Registers a post-fixer that will make sure that the style attribute value is correct for a specific image type (block vs inline).\n\t *\n\t * @private\n\t */\n\t_setupPostFixer() {\n\t\tconst editor = this.editor;\n\t\tconst document = editor.model.document;\n\n\t\tconst imageUtils = editor.plugins.get( ImageUtils );\n\t\tconst stylesMap = new Map( this.normalizedStyles.map( style => [ style.name, style ] ) );\n\n\t\t// Make sure that style attribute is valid for the image type.\n\t\tdocument.registerPostFixer( writer => {\n\t\t\tlet changed = false;\n\n\t\t\tfor ( const change of document.differ.getChanges() ) {\n\t\t\t\tif ( change.type == 'insert' || change.type == 'attribute' && change.attributeKey == 'imageStyle' ) {\n\t\t\t\t\tlet element = change.type == 'insert' ? change.position.nodeAfter : change.range.start.nodeAfter;\n\n\t\t\t\t\tif ( element && element.is( 'element', 'paragraph' ) && element.childCount > 0 ) {\n\t\t\t\t\t\telement = element.getChild( 0 );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !imageUtils.isImage( element ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst imageStyle = element.getAttribute( 'imageStyle' );\n\n\t\t\t\t\tif ( !imageStyle ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst imageStyleDefinition = stylesMap.get( imageStyle );\n\n\t\t\t\t\tif ( !imageStyleDefinition || !imageStyleDefinition.modelElements.includes( element.name ) ) {\n\t\t\t\t\t\twriter.removeAttribute( 'imageStyle', element );\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagestyle/imagestyleui\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { ButtonView, createDropdown, addToolbarToDropdown, SplitButtonView } from 'ckeditor5/src/ui';\nimport ImageStyleEditing from './imagestyleediting';\nimport utils from './utils';\nimport { isObject, identity } from 'lodash-es';\n\nimport '../../theme/imagestyle.css';\n\n/**\n * The image style UI plugin.\n *\n * It registers buttons corresponding to the {@link module:image/image~ImageConfig#styles} configuration.\n * It also registers the {@link module:image/imagestyle/utils~DEFAULT_DROPDOWN_DEFINITIONS default drop-downs} and the\n * custom drop-downs defined by the developer in the {@link module:image/image~ImageConfig#toolbar} configuration.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageStyleUI extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageStyleEditing ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageStyleUI';\n\t}\n\n\t/**\n\t * Returns the default localized style titles provided by the plugin.\n\t *\n\t * The following localized titles corresponding with\n\t * {@link module:image/imagestyle/utils~DEFAULT_OPTIONS} are available:\n\t *\n\t * * `'Wrap text'`,\n\t * * `'Break text'`,\n\t * * `'In line'`,\n\t * * `'Full size image'`,\n\t * * `'Side image'`,\n\t * * `'Left aligned image'`,\n\t * * `'Centered image'`,\n\t * * `'Right aligned image'`\n\t *\n\t * @returns {Object.<String,String>}\n\t */\n\tget localizedDefaultStylesTitles() {\n\t\tconst t = this.editor.t;\n\n\t\treturn {\n\t\t\t'Wrap text': t( 'Wrap text' ),\n\t\t\t'Break text': t( 'Break text' ),\n\t\t\t'In line': t( 'In line' ),\n\t\t\t'Full size image': t( 'Full size image' ),\n\t\t\t'Side image': t( 'Side image' ),\n\t\t\t'Left aligned image': t( 'Left aligned image' ),\n\t\t\t'Centered image': t( 'Centered image' ),\n\t\t\t'Right aligned image': t( 'Right aligned image' )\n\t\t};\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst plugins = this.editor.plugins;\n\t\tconst toolbarConfig = this.editor.config.get( 'image.toolbar' ) || [];\n\n\t\tconst definedStyles = translateStyles(\n\t\t\tplugins.get( 'ImageStyleEditing' ).normalizedStyles,\n\t\t\tthis.localizedDefaultStylesTitles\n\t\t);\n\n\t\tfor ( const styleConfig of definedStyles ) {\n\t\t\tthis._createButton( styleConfig );\n\t\t}\n\n\t\tconst definedDropdowns = translateStyles(\n\t\t\t[ ...toolbarConfig.filter( isObject ), ...utils.getDefaultDropdownDefinitions( plugins ) ],\n\t\t\tthis.localizedDefaultStylesTitles\n\t\t);\n\n\t\tfor ( const dropdownConfig of definedDropdowns ) {\n\t\t\tthis._createDropdown( dropdownConfig, definedStyles );\n\t\t}\n\t}\n\n\t/**\n\t * Creates a dropdown and stores it in the editor {@link module:ui/componentfactory~ComponentFactory}.\n\t *\n\t * @private\n\t * @param {module:image/imagestyle/imagestyleui~ImageStyleDropdownDefinition} dropdownConfig\n\t * @param {Array.<module:image/imagestyle~ImageStyleOptionDefinition>} definedStyles\n\t */\n\t_createDropdown( dropdownConfig, definedStyles ) {\n\t\tconst factory = this.editor.ui.componentFactory;\n\n\t\tfactory.add( dropdownConfig.name, locale => {\n\t\t\tlet defaultButton;\n\n\t\t\tconst { defaultItem, items, title } = dropdownConfig;\n\t\t\tconst buttonViews = items\n\t\t\t\t.filter( itemName => definedStyles.find( ( { name } ) => getUIComponentName( name ) === itemName ) )\n\t\t\t\t.map( buttonName => {\n\t\t\t\t\tconst button = factory.create( buttonName );\n\n\t\t\t\t\tif ( buttonName === defaultItem ) {\n\t\t\t\t\t\tdefaultButton = button;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn button;\n\t\t\t\t} );\n\n\t\t\tif ( items.length !== buttonViews.length ) {\n\t\t\t\tutils.warnInvalidStyle( { dropdown: dropdownConfig } );\n\t\t\t}\n\n\t\t\tconst dropdownView = createDropdown( locale, SplitButtonView );\n\t\t\tconst splitButtonView = dropdownView.buttonView;\n\t\t\tconst splitButtonViewArrow = splitButtonView.arrowView;\n\n\t\t\taddToolbarToDropdown( dropdownView, buttonViews, { enableActiveItemFocusOnDropdownOpen: true } );\n\n\t\t\tsplitButtonView.set( {\n\t\t\t\tlabel: getDropdownButtonTitle( title, defaultButton.label ),\n\t\t\t\tclass: null,\n\t\t\t\ttooltip: true\n\t\t\t} );\n\n\t\t\tsplitButtonViewArrow.unbind( 'label' );\n\t\t\tsplitButtonViewArrow.set( {\n\t\t\t\tlabel: title\n\t\t\t} );\n\n\t\t\tsplitButtonView.bind( 'icon' ).toMany( buttonViews, 'isOn', ( ...areOn ) => {\n\t\t\t\tconst index = areOn.findIndex( identity );\n\n\t\t\t\treturn ( index < 0 ) ? defaultButton.icon : buttonViews[ index ].icon;\n\t\t\t} );\n\n\t\t\tsplitButtonView.bind( 'label' ).toMany( buttonViews, 'isOn', ( ...areOn ) => {\n\t\t\t\tconst index = areOn.findIndex( identity );\n\n\t\t\t\treturn getDropdownButtonTitle( title, ( index < 0 ) ? defaultButton.label : buttonViews[ index ].label );\n\t\t\t} );\n\n\t\t\tsplitButtonView.bind( 'isOn' ).toMany( buttonViews, 'isOn', ( ...areOn ) => areOn.some( identity ) );\n\n\t\t\tsplitButtonView.bind( 'class' )\n\t\t\t\t.toMany( buttonViews, 'isOn', ( ...areOn ) => areOn.some( identity ) ? 'ck-splitbutton_flatten' : null );\n\n\t\t\tsplitButtonView.on( 'execute', () => {\n\t\t\t\tif ( !buttonViews.some( ( { isOn } ) => isOn ) ) {\n\t\t\t\t\tdefaultButton.fire( 'execute' );\n\t\t\t\t} else {\n\t\t\t\t\tdropdownView.isOpen = !dropdownView.isOpen;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tdropdownView.bind( 'isEnabled' )\n\t\t\t\t.toMany( buttonViews, 'isEnabled', ( ...areEnabled ) => areEnabled.some( identity ) );\n\n\t\t\t// Focus the editable after executing the command.\n\t\t\t// Overrides a default behaviour where the focus is moved to the dropdown button (#12125).\n\t\t\tthis.listenTo( dropdownView, 'execute', () => {\n\t\t\t\tthis.editor.editing.view.focus();\n\t\t\t} );\n\n\t\t\treturn dropdownView;\n\t\t} );\n\t}\n\n\t/**\n\t * Creates a button and stores it in the editor {@link module:ui/componentfactory~ComponentFactory}.\n\t *\n\t * @private\n\t * @param {module:image/imagestyle~ImageStyleOptionDefinition} buttonConfig\n\t */\n\t_createButton( buttonConfig ) {\n\t\tconst buttonName = buttonConfig.name;\n\n\t\tthis.editor.ui.componentFactory.add( getUIComponentName( buttonName ), locale => {\n\t\t\tconst command = this.editor.commands.get( 'imageStyle' );\n\t\t\tconst view = new ButtonView( locale );\n\n\t\t\tview.set( {\n\t\t\t\tlabel: buttonConfig.title,\n\t\t\t\ticon: buttonConfig.icon,\n\t\t\t\ttooltip: true,\n\t\t\t\tisToggleable: true\n\t\t\t} );\n\n\t\t\tview.bind( 'isEnabled' ).to( command, 'isEnabled' );\n\t\t\tview.bind( 'isOn' ).to( command, 'value', value => value === buttonName );\n\t\t\tview.on( 'execute', this._executeCommand.bind( this, buttonName ) );\n\n\t\t\treturn view;\n\t\t} );\n\t}\n\n\t_executeCommand( name ) {\n\t\tthis.editor.execute( 'imageStyle', { value: name } );\n\t\tthis.editor.editing.view.focus();\n\t}\n}\n\n// Returns the translated `title` from the passed styles array.\n//\n// @param {Array.<module:image/imagestyle~ImageStyleOptionDefinition|\n// module:image/imagestyle/imagestyleui~ImageStyleDropdownDefinition>} styles\n// @param {Object.<String,String>} titles\n//\n// @returns {Array.<module:image/imagestyle~ImageStyleOptionDefinition|module:image/imagestyle/imagestyleui~ImageStyleDropdownDefinition>}\nfunction translateStyles( styles, titles ) {\n\tfor ( const style of styles ) {\n\t\t// Localize the titles of the styles, if a title corresponds with\n\t\t// a localized default provided by the plugin.\n\t\tif ( titles[ style.title ] ) {\n\t\t\tstyle.title = titles[ style.title ];\n\t\t}\n\t}\n\n\treturn styles;\n}\n\n// Returns the image style component name with the \"imageStyle:\" prefix.\n//\n// @param {String} name\n// @returns {String}\nfunction getUIComponentName( name ) {\n\treturn `imageStyle:${ name }`;\n}\n\n// Returns title for the splitbutton containing the dropdown title and default action item title.\n//\n// @param {String|undefined} dropdownTitle\n// @param {String} buttonTitle\n// @returns {String}\nfunction getDropdownButtonTitle( dropdownTitle, buttonTitle ) {\n\treturn ( dropdownTitle ? dropdownTitle + ': ' : '' ) + buttonTitle;\n}\n\n/**\n * # **The image style custom drop-down definition descriptor**\n *\n * This definition can be implemented in the {@link module:image/image~ImageConfig#toolbar image toolbar configuration}\n * to define a completely custom drop-down in the image toolbar.\n *\n *\t\tClassicEditor.create( editorElement, {\n *\t\t\timage: { toolbar: [\n *\t \t\t\t// One of the predefined drop-downs\n *\t \t\t\t'imageStyle:wrapText',\n *\t\t\t\t// Custom drop-down\n *\t\t\t\t{\n *\t\t\t\t\tname: 'imageStyle:customDropdown',\n *\t\t\t\t\ttitle: Custom drop-down title,\n *\t\t\t\t\titems: [ 'imageStyle:alignLeft', 'imageStyle:alignRight' ],\n *\t\t\t\t\tdefaultItem: 'imageStyle:alignLeft'\n *\t\t\t\t}\n *\t\t\t] }\n *\t\t} );\n *\n * **Note:** At the moment it is possible to populate the custom drop-down with only the buttons registered by the `ImageStyle` plugin.\n *\n * The defined drop-down will be registered\n * as the {@link module:ui/dropdown/dropdownview~DropdownView}\n * with the {@link module:ui/dropdown/button/splitbuttonview~SplitButtonView} under the provided name in the\n * {@link module:ui/componentfactory~ComponentFactory}\n *\n * @property {String} name The unique name of the drop-down. It is recommended to precede it with the \"imageStyle:\" prefix\n * to avoid collision with the components' names registered by other plugins.\n *\n * @property {String} [title] The drop-down's title. It will be used as the split button label along with the title of the default item\n * in the following manner: \"Custom drop-down title: Default item title\".\n *\n * Setting `title` to one of\n * {@link module:image/imagestyle/imagestyleui~ImageStyleUI#localizedDefaultStylesTitles}\n * will automatically translate it to the language of the editor.\n *\n * @property {Array.<String>} items The list of the names of the buttons that will be placed in the drop-down's toolbar.\n * Each of the buttons has to be one of the {@link module:image/image~ImageConfig#styles default image style buttons}\n * or to be defined as the {@link module:image/imagestyle~ImageStyleOptionDefinition image styling option}.\n *\n * @property {String} defaultItem The name of one of the buttons from the items list,\n * which will be used as a default button for the drop-down's split button.\n *\n * @typedef {Object} module:image/imagestyle/imagestyleui~ImageStyleDropdownDefinition\n */\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagestyle/utils\n */\n\nimport { icons } from 'ckeditor5/src/core';\nimport { logWarning } from 'ckeditor5/src/utils';\n\nconst {\n\tobjectFullWidth,\n\tobjectInline,\n\tobjectLeft,\tobjectRight, objectCenter,\n\tobjectBlockLeft, objectBlockRight\n} = icons;\n\n/**\n * Default image style options provided by the plugin that can be referred in the {@link module:image/image~ImageConfig#styles}\n * configuration.\n *\n * There are available 5 styles focused on formatting:\n *\n * * **`'alignLeft'`** aligns the inline or block image to the left and wraps it with the text using the `image-style-align-left` class,\n * * **`'alignRight'`** aligns the inline or block image to the right and wraps it with the text using the `image-style-align-right` class,\n * * **`'alignCenter'`** centers the block image using the `image-style-align-center` class,\n * * **`'alignBlockLeft'`** aligns the block image to the left using the `image-style-block-align-left` class,\n * * **`'alignBlockRight'`** aligns the block image to the right using the `image-style-block-align-right` class,\n *\n * and 3 semantic styles:\n *\n * * **`'inline'`** is an inline image without any CSS class,\n * * **`'block'`** is a block image without any CSS class,\n * * **`'side'`** is a block image styled with the `image-style-side` CSS class.\n *\n * @readonly\n * @type {Object.<String,module:image/imagestyle~ImageStyleOptionDefinition>}\n */\nconst DEFAULT_OPTIONS = {\n\t// This style represents an image placed in the line of text.\n\tget inline() {\n\t\treturn {\n\t\t\tname: 'inline',\n\t\t\ttitle: 'In line',\n\t\t\ticon: objectInline,\n\t\t\tmodelElements: [ 'imageInline' ],\n\t\t\tisDefault: true\n\t\t};\n\t},\n\n\t// This style represents an image aligned to the left and wrapped with text.\n\tget alignLeft() {\n\t\treturn {\n\t\t\tname: 'alignLeft',\n\t\t\ttitle: 'Left aligned image',\n\t\t\ticon: objectLeft,\n\t\t\tmodelElements: [ 'imageBlock', 'imageInline' ],\n\t\t\tclassName: 'image-style-align-left'\n\t\t};\n\t},\n\n\t// This style represents an image aligned to the left.\n\tget alignBlockLeft() {\n\t\treturn {\n\t\t\tname: 'alignBlockLeft',\n\t\t\ttitle: 'Left aligned image',\n\t\t\ticon: objectBlockLeft,\n\t\t\tmodelElements: [ 'imageBlock' ],\n\t\t\tclassName: 'image-style-block-align-left'\n\t\t};\n\t},\n\n\t// This style represents a centered image.\n\tget alignCenter() {\n\t\treturn {\n\t\t\tname: 'alignCenter',\n\t\t\ttitle: 'Centered image',\n\t\t\ticon: objectCenter,\n\t\t\tmodelElements: [ 'imageBlock' ],\n\t\t\tclassName: 'image-style-align-center'\n\t\t};\n\t},\n\n\t// This style represents an image aligned to the right and wrapped with text.\n\tget alignRight() {\n\t\treturn {\n\t\t\tname: 'alignRight',\n\t\t\ttitle: 'Right aligned image',\n\t\t\ticon: objectRight,\n\t\t\tmodelElements: [ 'imageBlock', 'imageInline' ],\n\t\t\tclassName: 'image-style-align-right'\n\t\t};\n\t},\n\n\t// This style represents an image aligned to the right.\n\tget alignBlockRight() {\n\t\treturn {\n\t\t\tname: 'alignBlockRight',\n\t\t\ttitle: 'Right aligned image',\n\t\t\ticon: objectBlockRight,\n\t\t\tmodelElements: [ 'imageBlock' ],\n\t\t\tclassName: 'image-style-block-align-right'\n\t\t};\n\t},\n\n\t// This option is equal to the situation when no style is applied.\n\tget block() {\n\t\treturn {\n\t\t\tname: 'block',\n\t\t\ttitle: 'Centered image',\n\t\t\ticon: objectCenter,\n\t\t\tmodelElements: [ 'imageBlock' ],\n\t\t\tisDefault: true\n\t\t};\n\t},\n\n\t// This represents a side image.\n\tget side() {\n\t\treturn {\n\t\t\tname: 'side',\n\t\t\ttitle: 'Side image',\n\t\t\ticon: objectRight,\n\t\t\tmodelElements: [ 'imageBlock' ],\n\t\t\tclassName: 'image-style-side'\n\t\t};\n\t}\n};\n\n/**\n * Default image style icons provided by the plugin that can be referred in the {@link module:image/image~ImageConfig#styles}\n * configuration.\n *\n * See {@link module:image/imagestyle~ImageStyleOptionDefinition#icon} to learn more.\n *\n * There are 7 default icons available: `'full'`, `'left'`, `'inlineLeft'`, `'center'`, `'right'`, `'inlineRight'`, and `'inline'`.\n *\n * @readonly\n * @type {Object.<String,String>}\n */\nconst DEFAULT_ICONS = {\n\tfull: objectFullWidth,\n\tleft: objectBlockLeft,\n\tright: objectBlockRight,\n\tcenter: objectCenter,\n\tinlineLeft: objectLeft,\n\tinlineRight: objectRight,\n\tinline: objectInline\n};\n\n/**\n * Default drop-downs provided by the plugin that can be referred in the {@link module:image/image~ImageConfig#toolbar}\n * configuration. The drop-downs are containers for the {@link module:image/imagestyle~ImageStyleConfig#options image style options}.\n *\n * If both of the `ImageEditing` plugins are loaded, there are 2 predefined drop-downs available:\n *\n * * **`'imageStyle:wrapText'`**, which contains the `alignLeft` and `alignRight` options, that is,\n * those that wraps the text around the image,\n * * **`'imageStyle:breakText'`**, which contains the `alignBlockLeft`, `alignCenter` and `alignBlockRight` options, that is,\n * those that breaks the text around the image.\n *\n * @readonly\n * @type {Array.<module:image/imagestyle/imagestyleui~ImageStyleDropdownDefinition>}\n */\nconst DEFAULT_DROPDOWN_DEFINITIONS = [ {\n\tname: 'imageStyle:wrapText',\n\ttitle: 'Wrap text',\n\tdefaultItem: 'imageStyle:alignLeft',\n\titems: [ 'imageStyle:alignLeft', 'imageStyle:alignRight' ]\n}, {\n\tname: 'imageStyle:breakText',\n\ttitle: 'Break text',\n\tdefaultItem: 'imageStyle:block',\n\titems: [ 'imageStyle:alignBlockLeft', 'imageStyle:block', 'imageStyle:alignBlockRight' ]\n} ];\n\n/**\n * Returns a list of the normalized and validated image style options.\n *\n * @protected\n * @param {Object} config\n * @param {Boolean} config.isInlinePluginLoaded\n * Determines whether the {@link module:image/image/imageblockediting~ImageBlockEditing `ImageBlockEditing`} plugin has been loaded.\n * @param {Boolean} config.isBlockPluginLoaded\n * Determines whether the {@link module:image/image/imageinlineediting~ImageInlineEditing `ImageInlineEditing`} plugin has been loaded.\n * @param {module:image/imagestyle~ImageStyleConfig} config.configuredStyles\n * The image styles configuration provided in the image styles {@link module:image/image~ImageConfig#styles configuration}\n * as a default or custom value.\n * @returns {module:image/imagestyle~ImageStyleConfig}\n * * Each of options contains a complete icon markup.\n * * The image style options not supported by any of the loaded plugins are filtered out.\n */\nfunction normalizeStyles( config ) {\n\tconst configuredStyles = config.configuredStyles.options || [];\n\n\tconst styles = configuredStyles\n\t\t.map( arrangement => normalizeDefinition( arrangement ) )\n\t\t.filter( arrangement => isValidOption( arrangement, config ) );\n\n\treturn styles;\n}\n\n/**\n * Returns the default image styles configuration depending on the loaded image editing plugins.\n * @protected\n *\n * @param {Boolean} isInlinePluginLoaded\n * Determines whether the {@link module:image/image/imageblockediting~ImageBlockEditing `ImageBlockEditing`} plugin has been loaded.\n *\n * @param {Boolean} isBlockPluginLoaded\n * Determines whether the {@link module:image/image/imageinlineediting~ImageInlineEditing `ImageInlineEditing`} plugin has been loaded.\n *\n * @returns {Object<String,Array>}\n * It returns an object with the lists of the image style options and groups defined as strings related to the\n * {@link module:image/imagestyle/utils~DEFAULT_OPTIONS default options}\n */\nfunction getDefaultStylesConfiguration( isBlockPluginLoaded, isInlinePluginLoaded ) {\n\tif ( isBlockPluginLoaded && isInlinePluginLoaded ) {\n\t\treturn {\n\t\t\toptions: [\n\t\t\t\t'inline', 'alignLeft', 'alignRight',\n\t\t\t\t'alignCenter', 'alignBlockLeft', 'alignBlockRight',\n\t\t\t\t'block', 'side'\n\t\t\t]\n\t\t};\n\t} else if ( isBlockPluginLoaded ) {\n\t\treturn {\n\t\t\toptions: [ 'block', 'side' ]\n\t\t};\n\t} else if ( isInlinePluginLoaded ) {\n\t\treturn {\n\t\t\toptions: [ 'inline', 'alignLeft', 'alignRight' ]\n\t\t};\n\t}\n\n\treturn {};\n}\n\n/**\n * Returns a list of the available predefined drop-downs' definitions depending on the loaded image editing plugins.\n * @protected\n *\n * @param {module:core/plugincollection~PluginCollection} pluginCollection\n * @returns {Array.<module:image/imagestyle/imagestyleui~ImageStyleDropdownDefinition>}\n */\nfunction getDefaultDropdownDefinitions( pluginCollection ) {\n\tif ( pluginCollection.has( 'ImageBlockEditing' ) && pluginCollection.has( 'ImageInlineEditing' ) ) {\n\t\treturn [ ...DEFAULT_DROPDOWN_DEFINITIONS ];\n\t} else {\n\t\treturn [];\n\t}\n}\n\n// Normalizes an image style option or group provided in the {@link module:image/image~ImageConfig#styles}\n// and returns it in a {@link module:image/imagestyle~ImageStyleOptionDefinition}/\n//\n// @param {Object|String} definition\n//\n// @returns {module:image/imagestyle~ImageStyleOptionDefinition}}\nfunction normalizeDefinition( definition ) {\n\tif ( typeof definition === 'string' ) {\n\t\t// Just the name of the style has been passed, but none of the defaults.\n\t\tif ( !DEFAULT_OPTIONS[ definition ] ) {\n\t\t\t// Normalize the style anyway to prevent errors.\n\t\t\tdefinition = { name: definition };\n\t\t}\n\t\t// Just the name of the style has been passed and it's one of the defaults, just use it.\n\t\t// Clone the style to avoid overriding defaults.\n\t\telse {\n\t\t\tdefinition = { ...DEFAULT_OPTIONS[ definition ] };\n\t\t}\n\t} else {\n\t\t// If an object style has been passed and if the name matches one of the defaults,\n\t\t// extend it with defaults – the user wants to customize a default style.\n\t\t// Note: Don't override the user–defined style object, clone it instead.\n\t\tdefinition = extendStyle( DEFAULT_OPTIONS[ definition.name ], definition );\n\t}\n\n\t// If an icon is defined as a string and correspond with a name\n\t// in default icons, use the default icon provided by the plugin.\n\tif ( typeof definition.icon === 'string' ) {\n\t\tdefinition.icon = DEFAULT_ICONS[ definition.icon ] || definition.icon;\n\t}\n\n\treturn definition;\n}\n\n// Checks if the image style option is valid:\n// * if it has the modelElements fields defined and filled,\n// * if the defined modelElements are supported by any of the loaded image editing plugins.\n// It also displays a console warning these conditions are not met.\n//\n// @param {module:image/imagestyle~ImageStyleOptionDefinition} image style option\n// @param {Object.<String,Boolean>} { isBlockPluginLoaded, isInlinePluginLoaded }\n//\n// @returns Boolean\nfunction isValidOption( option, { isBlockPluginLoaded, isInlinePluginLoaded } ) {\n\tconst { modelElements, name } = option;\n\n\tif ( !modelElements || !modelElements.length || !name ) {\n\t\twarnInvalidStyle( { style: option } );\n\n\t\treturn false;\n\t} else {\n\t\tconst supportedElements = [ isBlockPluginLoaded ? 'imageBlock' : null, isInlinePluginLoaded ? 'imageInline' : null ];\n\n\t\t// Check if the option is supported by any of the loaded plugins.\n\t\tif ( !modelElements.some( elementName => supportedElements.includes( elementName ) ) ) {\n\t\t\t/**\n\t\t\t * In order to work correctly, each image style {@link module:image/imagestyle~ImageStyleOptionDefinition option}\n\t\t\t * requires specific model elements (also: types of images) to be supported by the editor.\n\t\t\t *\n\t\t\t * Model element names to which the image style option can be applied are defined in the\n\t\t\t * {@link module:image/imagestyle~ImageStyleOptionDefinition#modelElements} property of the style option\n\t\t\t * definition.\n\t\t\t *\n\t\t\t * Explore the warning in the console to find out precisely which option is not supported and which editor plugins\n\t\t\t * are missing. Make sure these plugins are loaded in your editor to get this image style option working.\n\t\t\t *\n\t\t\t * @error image-style-missing-dependency\n\t\t\t * @param {String} [option] The name of the unsupported option.\n\t\t\t * @param {String} [missingPlugins] The names of the plugins one of which has to be loaded for the particular option.\n\t\t\t */\n\t\t\tlogWarning( 'image-style-missing-dependency', {\n\t\t\t\tstyle: option,\n\t\t\t\tmissingPlugins: modelElements.map( name => name === 'imageBlock' ? 'ImageBlockEditing' : 'ImageInlineEditing' )\n\t\t\t} );\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n// Extends the default style with a style provided by the developer.\n// Note: Don't override the custom–defined style object, clone it instead.\n//\n// @param {module:image/imagestyle~ImageStyleOptionDefinition} source\n// @param {Object} style\n//\n// @returns {module:image/imagestyle~ImageStyleOptionDefinition}\nfunction extendStyle( source, style ) {\n\tconst extendedStyle = { ...style };\n\n\tfor ( const prop in source ) {\n\t\tif ( !Object.prototype.hasOwnProperty.call( style, prop ) ) {\n\t\t\textendedStyle[ prop ] = source[ prop ];\n\t\t}\n\t}\n\n\treturn extendedStyle;\n}\n\n// Displays a console warning with the 'image-style-configuration-definition-invalid' error.\n// @param {Object} info\nfunction warnInvalidStyle( info ) {\n\t/**\n\t * The image style definition provided in the configuration is invalid.\n\t *\n\t * Please make sure the definition implements properly one of the following:\n\t *\n\t * * {@link module:image/imagestyle~ImageStyleOptionDefinition image style option definition},\n\t * * {@link module:image/imagestyle/imagestyleui~ImageStyleDropdownDefinition image style dropdown definition}\n\t *\n\t * @error image-style-configuration-definition-invalid\n\t * @param {String} [dropdown] The name of the invalid drop-down\n\t * @param {String} [style] The name of the invalid image style option\n\t */\n\tlogWarning( 'image-style-configuration-definition-invalid', info );\n}\n\nexport default {\n\tnormalizeStyles,\n\tgetDefaultStylesConfiguration,\n\tgetDefaultDropdownDefinitions,\n\twarnInvalidStyle,\n\tDEFAULT_OPTIONS,\n\tDEFAULT_ICONS,\n\tDEFAULT_DROPDOWN_DEFINITIONS\n};\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagetextalternative\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport ImageTextAlternativeEditing from './imagetextalternative/imagetextalternativeediting';\nimport ImageTextAlternativeUI from './imagetextalternative/imagetextalternativeui';\n\n/**\n * The image text alternative plugin.\n *\n * For a detailed overview, check the {@glink features/images/images-styles image styles} documentation.\n *\n * This is a \"glue\" plugin which loads the\n * {@link module:image/imagetextalternative/imagetextalternativeediting~ImageTextAlternativeEditing}\n * and {@link module:image/imagetextalternative/imagetextalternativeui~ImageTextAlternativeUI} plugins.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageTextAlternative extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageTextAlternativeEditing, ImageTextAlternativeUI ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageTextAlternative';\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagetextalternative/imagetextalternativecommand\n */\n\nimport { Command } from 'ckeditor5/src/core';\n\n/**\n * The image text alternative command. It is used to change the `alt` attribute of `<imageBlock>` and `<imageInline>` model elements.\n *\n * @extends module:core/command~Command\n */\nexport default class ImageTextAlternativeCommand extends Command {\n\t/**\n\t * The command value: `false` if there is no `alt` attribute, otherwise the value of the `alt` attribute.\n\t *\n\t * @readonly\n\t * @observable\n\t * @member {String|Boolean} #value\n\t */\n\n\t/**\n\t * @inheritDoc\n\t */\n\trefresh() {\n\t\tconst editor = this.editor;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst element = imageUtils.getClosestSelectedImageElement( this.editor.model.document.selection );\n\n\t\tthis.isEnabled = !!element;\n\n\t\tif ( this.isEnabled && element.hasAttribute( 'alt' ) ) {\n\t\t\tthis.value = element.getAttribute( 'alt' );\n\t\t} else {\n\t\t\tthis.value = false;\n\t\t}\n\t}\n\n\t/**\n\t * Executes the command.\n\t *\n\t * @fires execute\n\t * @param {Object} options\n\t * @param {String} options.newValue The new value of the `alt` attribute to set.\n\t */\n\texecute( options ) {\n\t\tconst editor = this.editor;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst model = editor.model;\n\t\tconst imageElement = imageUtils.getClosestSelectedImageElement( model.document.selection );\n\n\t\tmodel.change( writer => {\n\t\t\twriter.setAttribute( 'alt', options.newValue, imageElement );\n\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagetextalternative/imagetextalternativeediting\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport ImageTextAlternativeCommand from './imagetextalternativecommand';\nimport ImageUtils from '../imageutils';\n\n/**\n * The image text alternative editing plugin.\n *\n * Registers the `'imageTextAlternative'` command.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageTextAlternativeEditing extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageUtils ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageTextAlternativeEditing';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tthis.editor.commands.add( 'imageTextAlternative', new ImageTextAlternativeCommand( this.editor ) );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagetextalternative/imagetextalternativeui\n */\n\nimport { Plugin, icons } from 'ckeditor5/src/core';\nimport { ButtonView, ContextualBalloon, clickOutsideHandler } from 'ckeditor5/src/ui';\n\nimport TextAlternativeFormView from './ui/textalternativeformview';\nimport { repositionContextualBalloon, getBalloonPositionData } from '../image/ui/utils';\n\n/**\n * The image text alternative UI plugin.\n *\n * The plugin uses the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon}.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageTextAlternativeUI extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ContextualBalloon ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageTextAlternativeUI';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tthis._createButton();\n\t\tthis._createForm();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tdestroy() {\n\t\tsuper.destroy();\n\n\t\t// Destroy created UI components as they are not automatically destroyed (see ckeditor5#1341).\n\t\tthis._form.destroy();\n\t}\n\n\t/**\n\t * Creates a button showing the balloon panel for changing the image text alternative and\n\t * registers it in the editor {@link module:ui/componentfactory~ComponentFactory ComponentFactory}.\n\t *\n\t * @private\n\t */\n\t_createButton() {\n\t\tconst editor = this.editor;\n\t\tconst t = editor.t;\n\n\t\teditor.ui.componentFactory.add( 'imageTextAlternative', locale => {\n\t\t\tconst command = editor.commands.get( 'imageTextAlternative' );\n\t\t\tconst view = new ButtonView( locale );\n\n\t\t\tview.set( {\n\t\t\t\tlabel: t( 'Change image text alternative' ),\n\t\t\t\ticon: icons.lowVision,\n\t\t\t\ttooltip: true\n\t\t\t} );\n\n\t\t\tview.bind( 'isEnabled' ).to( command, 'isEnabled' );\n\t\t\tview.bind( 'isOn' ).to( command, 'value', value => !!value );\n\n\t\t\tthis.listenTo( view, 'execute', () => {\n\t\t\t\tthis._showForm();\n\t\t\t} );\n\n\t\t\treturn view;\n\t\t} );\n\t}\n\n\t/**\n\t * Creates the {@link module:image/imagetextalternative/ui/textalternativeformview~TextAlternativeFormView}\n\t * form.\n\t *\n\t * @private\n\t */\n\t_createForm() {\n\t\tconst editor = this.editor;\n\t\tconst view = editor.editing.view;\n\t\tconst viewDocument = view.document;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\n\t\t/**\n\t\t * The contextual balloon plugin instance.\n\t\t *\n\t\t * @private\n\t\t * @member {module:ui/panel/balloon/contextualballoon~ContextualBalloon}\n\t\t */\n\t\tthis._balloon = this.editor.plugins.get( 'ContextualBalloon' );\n\n\t\t/**\n\t\t * A form containing a textarea and buttons, used to change the `alt` text value.\n\t\t *\n\t\t * @member {module:image/imagetextalternative/ui/textalternativeformview~TextAlternativeFormView}\n\t\t */\n\t\tthis._form = new TextAlternativeFormView( editor.locale );\n\n\t\t// Render the form so its #element is available for clickOutsideHandler.\n\t\tthis._form.render();\n\n\t\tthis.listenTo( this._form, 'submit', () => {\n\t\t\teditor.execute( 'imageTextAlternative', {\n\t\t\t\tnewValue: this._form.labeledInput.fieldView.element.value\n\t\t\t} );\n\n\t\t\tthis._hideForm( true );\n\t\t} );\n\n\t\tthis.listenTo( this._form, 'cancel', () => {\n\t\t\tthis._hideForm( true );\n\t\t} );\n\n\t\t// Close the form on Esc key press.\n\t\tthis._form.keystrokes.set( 'Esc', ( data, cancel ) => {\n\t\t\tthis._hideForm( true );\n\t\t\tcancel();\n\t\t} );\n\n\t\t// Reposition the balloon or hide the form if an image widget is no longer selected.\n\t\tthis.listenTo( editor.ui, 'update', () => {\n\t\t\tif ( !imageUtils.getClosestSelectedImageWidget( viewDocument.selection ) ) {\n\t\t\t\tthis._hideForm( true );\n\t\t\t} else if ( this._isVisible ) {\n\t\t\t\trepositionContextualBalloon( editor );\n\t\t\t}\n\t\t} );\n\n\t\t// Close on click outside of balloon panel element.\n\t\tclickOutsideHandler( {\n\t\t\temitter: this._form,\n\t\t\tactivator: () => this._isVisible,\n\t\t\tcontextElements: [ this._balloon.view.element ],\n\t\t\tcallback: () => this._hideForm()\n\t\t} );\n\t}\n\n\t/**\n\t * Shows the {@link #_form} in the {@link #_balloon}.\n\t *\n\t * @private\n\t */\n\t_showForm() {\n\t\tif ( this._isVisible ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst editor = this.editor;\n\t\tconst command = editor.commands.get( 'imageTextAlternative' );\n\t\tconst labeledInput = this._form.labeledInput;\n\n\t\tthis._form.disableCssTransitions();\n\n\t\tif ( !this._isInBalloon ) {\n\t\t\tthis._balloon.add( {\n\t\t\t\tview: this._form,\n\t\t\t\tposition: getBalloonPositionData( editor )\n\t\t\t} );\n\t\t}\n\n\t\t// Make sure that each time the panel shows up, the field remains in sync with the value of\n\t\t// the command. If the user typed in the input, then canceled the balloon (`labeledInput#value`\n\t\t// stays unaltered) and re-opened it without changing the value of the command, they would see the\n\t\t// old value instead of the actual value of the command.\n\t\t// https://github.com/ckeditor/ckeditor5-image/issues/114\n\t\tlabeledInput.fieldView.value = labeledInput.fieldView.element.value = command.value || '';\n\n\t\tthis._form.labeledInput.fieldView.select();\n\n\t\tthis._form.enableCssTransitions();\n\t}\n\n\t/**\n\t * Removes the {@link #_form} from the {@link #_balloon}.\n\t *\n\t * @param {Boolean} [focusEditable=false] Controls whether the editing view is focused afterwards.\n\t * @private\n\t */\n\t_hideForm( focusEditable ) {\n\t\tif ( !this._isInBalloon ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Blur the input element before removing it from DOM to prevent issues in some browsers.\n\t\t// See https://github.com/ckeditor/ckeditor5/issues/1501.\n\t\tif ( this._form.focusTracker.isFocused ) {\n\t\t\tthis._form.saveButtonView.focus();\n\t\t}\n\n\t\tthis._balloon.remove( this._form );\n\n\t\tif ( focusEditable ) {\n\t\t\tthis.editor.editing.view.focus();\n\t\t}\n\t}\n\n\t/**\n\t * Returns `true` when the {@link #_form} is the visible view in the {@link #_balloon}.\n\t *\n\t * @private\n\t * @type {Boolean}\n\t */\n\tget _isVisible() {\n\t\treturn this._balloon.visibleView === this._form;\n\t}\n\n\t/**\n\t * Returns `true` when the {@link #_form} is in the {@link #_balloon}.\n\t *\n\t * @private\n\t * @type {Boolean}\n\t */\n\tget _isInBalloon() {\n\t\treturn this._balloon.hasView( this._form );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagetextalternative/ui/textalternativeformview\n */\n\nimport {\n\tButtonView,\n\tFocusCycler,\n\tLabeledFieldView,\n\tView,\n\tViewCollection,\n\tcreateLabeledInputText,\n\tinjectCssTransitionDisabler,\n\tsubmitHandler\n} from 'ckeditor5/src/ui';\nimport { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';\nimport { icons } from 'ckeditor5/src/core';\n\nimport '../../../theme/textalternativeform.css';\n\n// See: #8833.\n// eslint-disable-next-line ckeditor5-rules/ckeditor-imports\nimport '@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css';\n\n/**\n * The TextAlternativeFormView class.\n *\n * @extends module:ui/view~View\n */\nexport default class TextAlternativeFormView extends View {\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( locale ) {\n\t\tsuper( locale );\n\n\t\tconst t = this.locale.t;\n\n\t\t/**\n\t\t * Tracks information about the DOM focus in the form.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:utils/focustracker~FocusTracker}\n\t\t */\n\t\tthis.focusTracker = new FocusTracker();\n\n\t\t/**\n\t\t * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:utils/keystrokehandler~KeystrokeHandler}\n\t\t */\n\t\tthis.keystrokes = new KeystrokeHandler();\n\n\t\t/**\n\t\t * An input with a label.\n\t\t *\n\t\t * @member {module:ui/labeledfield/labeledfieldview~LabeledFieldView} #labeledInput\n\t\t */\n\t\tthis.labeledInput = this._createLabeledInputView();\n\n\t\t/**\n\t\t * A button used to submit the form.\n\t\t *\n\t\t * @member {module:ui/button/buttonview~ButtonView} #saveButtonView\n\t\t */\n\t\tthis.saveButtonView = this._createButton( t( 'Save' ), icons.check, 'ck-button-save' );\n\t\tthis.saveButtonView.type = 'submit';\n\n\t\t/**\n\t\t * A button used to cancel the form.\n\t\t *\n\t\t * @member {module:ui/button/buttonview~ButtonView} #cancelButtonView\n\t\t */\n\t\tthis.cancelButtonView = this._createButton( t( 'Cancel' ), icons.cancel, 'ck-button-cancel', 'cancel' );\n\n\t\t/**\n\t\t * A collection of views which can be focused in the form.\n\t\t *\n\t\t * @readonly\n\t\t * @protected\n\t\t * @member {module:ui/viewcollection~ViewCollection}\n\t\t */\n\t\tthis._focusables = new ViewCollection();\n\n\t\t/**\n\t\t * Helps cycling over {@link #_focusables} in the form.\n\t\t *\n\t\t * @readonly\n\t\t * @protected\n\t\t * @member {module:ui/focuscycler~FocusCycler}\n\t\t */\n\t\tthis._focusCycler = new FocusCycler( {\n\t\t\tfocusables: this._focusables,\n\t\t\tfocusTracker: this.focusTracker,\n\t\t\tkeystrokeHandler: this.keystrokes,\n\t\t\tactions: {\n\t\t\t\t// Navigate form fields backwards using the Shift + Tab keystroke.\n\t\t\t\tfocusPrevious: 'shift + tab',\n\n\t\t\t\t// Navigate form fields forwards using the Tab key.\n\t\t\t\tfocusNext: 'tab'\n\t\t\t}\n\t\t} );\n\n\t\tthis.setTemplate( {\n\t\t\ttag: 'form',\n\n\t\t\tattributes: {\n\t\t\t\tclass: [\n\t\t\t\t\t'ck',\n\t\t\t\t\t'ck-text-alternative-form',\n\t\t\t\t\t'ck-responsive-form'\n\t\t\t\t],\n\n\t\t\t\t// https://github.com/ckeditor/ckeditor5-image/issues/40\n\t\t\t\ttabindex: '-1'\n\t\t\t},\n\n\t\t\tchildren: [\n\t\t\t\tthis.labeledInput,\n\t\t\t\tthis.saveButtonView,\n\t\t\t\tthis.cancelButtonView\n\t\t\t]\n\t\t} );\n\n\t\tinjectCssTransitionDisabler( this );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\trender() {\n\t\tsuper.render();\n\n\t\tthis.keystrokes.listenTo( this.element );\n\n\t\tsubmitHandler( { view: this } );\n\n\t\t[ this.labeledInput, this.saveButtonView, this.cancelButtonView ]\n\t\t\t.forEach( v => {\n\t\t\t\t// Register the view as focusable.\n\t\t\t\tthis._focusables.add( v );\n\n\t\t\t\t// Register the view in the focus tracker.\n\t\t\t\tthis.focusTracker.add( v.element );\n\t\t\t} );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tdestroy() {\n\t\tsuper.destroy();\n\n\t\tthis.focusTracker.destroy();\n\t\tthis.keystrokes.destroy();\n\t}\n\n\t/**\n\t * Creates the button view.\n\t *\n\t * @private\n\t * @param {String} label The button label\n\t * @param {String} icon The button's icon.\n\t * @param {String} className The additional button CSS class name.\n\t * @param {String} [eventName] The event name that the ButtonView#execute event will be delegated to.\n\t * @returns {module:ui/button/buttonview~ButtonView} The button view instance.\n\t */\n\t_createButton( label, icon, className, eventName ) {\n\t\tconst button = new ButtonView( this.locale );\n\n\t\tbutton.set( {\n\t\t\tlabel,\n\t\t\ticon,\n\t\t\ttooltip: true\n\t\t} );\n\n\t\tbutton.extendTemplate( {\n\t\t\tattributes: {\n\t\t\t\tclass: className\n\t\t\t}\n\t\t} );\n\n\t\tif ( eventName ) {\n\t\t\tbutton.delegate( 'execute' ).to( this, eventName );\n\t\t}\n\n\t\treturn button;\n\t}\n\n\t/**\n\t * Creates an input with a label.\n\t *\n\t * @private\n\t * @returns {module:ui/labeledfield/labeledfieldview~LabeledFieldView} Labeled field view instance.\n\t */\n\t_createLabeledInputView() {\n\t\tconst t = this.locale.t;\n\t\tconst labeledInput = new LabeledFieldView( this.locale, createLabeledInputText );\n\n\t\tlabeledInput.label = t( 'Text alternative' );\n\n\t\treturn labeledInput;\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imagetoolbar\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { WidgetToolbarRepository } from 'ckeditor5/src/widget';\nimport ImageUtils from './imageutils';\nimport { isObject } from 'lodash-es';\n\n/**\n * The image toolbar plugin. It creates and manages the image toolbar (the toolbar displayed when an image is selected).\n *\n * For an overview, check the {@glink features/images/images-overview#image-contextual-toolbar image contextual toolbar} documentation.\n *\n * Instances of toolbar components (e.g. buttons) are created using the editor's\n * {@link module:ui/componentfactory~ComponentFactory component factory}\n * based on the {@link module:image/image~ImageConfig#toolbar `image.toolbar` configuration option}.\n *\n * The toolbar uses the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon}.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageToolbar extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ WidgetToolbarRepository, ImageUtils ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageToolbar';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tafterInit() {\n\t\tconst editor = this.editor;\n\t\tconst t = editor.t;\n\t\tconst widgetToolbarRepository = editor.plugins.get( WidgetToolbarRepository );\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\n\t\twidgetToolbarRepository.register( 'image', {\n\t\t\tariaLabel: t( 'Image toolbar' ),\n\t\t\titems: normalizeDeclarativeConfig( editor.config.get( 'image.toolbar' ) || [] ),\n\t\t\tgetRelatedElement: selection => imageUtils.getClosestSelectedImageWidget( selection )\n\t\t} );\n\t}\n}\n\n/**\n * Items to be placed in the image toolbar.\n * This option is used by the {@link module:image/imagetoolbar~ImageToolbar} feature.\n *\n * Assuming that you use the following features:\n *\n * * {@link module:image/imagestyle~ImageStyle} (with a default configuration),\n * * {@link module:image/imagetextalternative~ImageTextAlternative},\n * * {@link module:image/imagecaption~ImageCaption},\n *\n * the following toolbar items will be available in {@link module:ui/componentfactory~ComponentFactory}:\n * * `'imageTextAlternative'`,\n * * `'toggleImageCaption'`,\n * * {@link module:image/image~ImageConfig#styles buttons provided by the `ImageStyle` plugin},\n * * {@link module:image/imagestyle/utils~DEFAULT_DROPDOWN_DEFINITIONS drop-downs provided by the `ImageStyle` plugin},\n *\n * so you can configure the toolbar like this:\n *\n *\t\tconst imageConfig = {\n *\t\t\ttoolbar: [\n *\t \t\t\t'imageStyle:inline', 'imageStyle:wrapText', 'imageStyle:breakText', '|',\n *\t\t\t\t'toggleImageCaption', 'imageTextAlternative'\n *\t\t\t]\n *\t\t};\n *\n * Besides that, the `ImageStyle` plugin allows to define a\n * {@link module:image/imagestyle/imagestyleui~ImageStyleDropdownDefinition custom drop-down} while configuring the toolbar.\n *\n * The same items can also be used in the {@link module:core/editor/editorconfig~EditorConfig#toolbar main editor toolbar}.\n *\n * Read more about configuring toolbar in {@link module:core/editor/editorconfig~EditorConfig#toolbar}.\n *\n * @member {Array.<String>} module:image/image~ImageConfig#toolbar\n */\n\n// Convert the dropdown definitions to their keys registered in the ComponentFactory.\n// The registration precess should be handled by the plugin which handles the UI of a particular feature.\n//\n// @param {Array.<String|module:image/imagestyle/imagestyleui~ImageStyleDropdownDefinition>} config\n//\n// @returns {Array.<String>}\nfunction normalizeDeclarativeConfig( config ) {\n\treturn config.map( item => isObject( item ) ? item.name : item );\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageupload\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport ImageUploadUI from './imageupload/imageuploadui';\nimport ImageUploadProgress from './imageupload/imageuploadprogress';\nimport ImageUploadEditing from './imageupload/imageuploadediting';\n\n/**\n * The image upload plugin.\n *\n * For a detailed overview, check the {@glink features/images/image-upload/image-upload image upload feature} documentation.\n *\n * This plugin does not do anything directly, but it loads a set of specific plugins to enable image uploading:\n *\n * * {@link module:image/imageupload/imageuploadediting~ImageUploadEditing},\n * * {@link module:image/imageupload/imageuploadui~ImageUploadUI},\n * * {@link module:image/imageupload/imageuploadprogress~ImageUploadProgress}.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageUpload extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageUpload';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageUploadEditing, ImageUploadUI, ImageUploadProgress ];\n\t}\n}\n\n/**\n * The image upload configuration.\n *\n * @member {module:image/imageupload~ImageUploadConfig} module:image/image~ImageConfig#upload\n */\n\n/**\n * The configuration of the image upload feature. Used by the image upload feature in the `@ckeditor/ckeditor5-image` package.\n *\n *\t\tClassicEditor\n *\t\t\t.create( editorElement, {\n * \t\t\t\timage: {\n * \t\t\t\t\tupload: ... // Image upload feature options.\n * \t\t\t\t}\n *\t\t\t} )\n *\t\t\t.then( ... )\n *\t\t\t.catch( ... );\n *\n * See {@link module:core/editor/editorconfig~EditorConfig all editor options}.\n *\n * @interface module:image/imageupload~ImageUploadConfig\n */\n\n/**\n * The list of accepted image types.\n *\n * The accepted types of images can be customized to allow only certain types of images:\n *\n *\t\t// Allow only JPEG and PNG images:\n *\t\tconst imageUploadConfig = {\n *\t\t\ttypes: [ 'png', 'jpeg' ]\n *\t\t};\n *\n * The type string should match [one of the sub-types](https://www.iana.org/assignments/media-types/media-types.xhtml#image)\n * of the image MIME type. For example, for the `image/jpeg` MIME type, add `'jpeg'` to your image upload configuration.\n *\n * **Note:** This setting only restricts some image types to be selected and uploaded through the CKEditor UI and commands. Image type\n * recognition and filtering should also be implemented on the server which accepts image uploads.\n *\n * @member {Array.<String>} module:image/imageupload~ImageUploadConfig#types\n * @default [ 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff' ]\n */\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageupload/imageuploadediting\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\n\nimport { UpcastWriter } from 'ckeditor5/src/engine';\n\nimport { Notification } from 'ckeditor5/src/ui';\nimport { ClipboardPipeline } from 'ckeditor5/src/clipboard';\nimport { FileRepository } from 'ckeditor5/src/upload';\nimport { env } from 'ckeditor5/src/utils';\n\nimport ImageUtils from '../imageutils';\nimport UploadImageCommand from './uploadimagecommand';\nimport { fetchLocalImage, isLocalImage } from '../../src/imageupload/utils';\nimport { createImageTypeRegExp } from './utils';\n\n/**\n * The editing part of the image upload feature. It registers the `'uploadImage'` command\n * and the `imageUpload` command as an aliased name.\n *\n * When an image is uploaded, it fires the {@link ~ImageUploadEditing#event:uploadComplete `uploadComplete`} event\n * that allows adding custom attributes to the {@link module:engine/model/element~Element image element}.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageUploadEditing extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ FileRepository, Notification, ClipboardPipeline, ImageUtils ];\n\t}\n\n\tstatic get pluginName() {\n\t\treturn 'ImageUploadEditing';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor ) {\n\t\tsuper( editor );\n\n\t\teditor.config.define( 'image', {\n\t\t\tupload: {\n\t\t\t\ttypes: [ 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff' ]\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * An internal mapping of {@link module:upload/filerepository~FileLoader#id file loader UIDs} and\n\t\t * model elements during the upload.\n\t\t *\n\t\t * Model element of the uploaded image can change, for instance, when {@link module:image/image/imagetypecommand~ImageTypeCommand}\n\t\t * is executed as a result of adding caption or changing image style. As a result, the upload logic must keep track of the model\n\t\t * element (reference) and resolve the upload for the correct model element (instead of the one that landed in the `$graveyard`\n\t\t * after image type changed).\n\t\t *\n\t\t * @private\n\t\t * @readonly\n\t\t * @member {Map.<String,module:engine/model/element~Element>}\n\t\t */\n\t\tthis._uploadImageElements = new Map();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst doc = editor.model.document;\n\t\tconst conversion = editor.conversion;\n\t\tconst fileRepository = editor.plugins.get( FileRepository );\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst imageTypes = createImageTypeRegExp( editor.config.get( 'image.upload.types' ) );\n\t\tconst uploadImageCommand = new UploadImageCommand( editor );\n\n\t\t// Register `uploadImage` command and add `imageUpload` command as an alias for backward compatibility.\n\t\teditor.commands.add( 'uploadImage', uploadImageCommand );\n\t\teditor.commands.add( 'imageUpload', uploadImageCommand );\n\n\t\t// Register upcast converter for uploadId.\n\t\tconversion.for( 'upcast' )\n\t\t\t.attributeToAttribute( {\n\t\t\t\tview: {\n\t\t\t\t\tname: 'img',\n\t\t\t\t\tkey: 'uploadId'\n\t\t\t\t},\n\t\t\t\tmodel: 'uploadId'\n\t\t\t} );\n\n\t\t// Handle pasted images.\n\t\t// For every image file, a new file loader is created and a placeholder image is\n\t\t// inserted into the content. Then, those images are uploaded once they appear in the model\n\t\t// (see Document#change listener below).\n\t\tthis.listenTo( editor.editing.view.document, 'clipboardInput', ( evt, data ) => {\n\t\t\t// Skip if non empty HTML data is included.\n\t\t\t// https://github.com/ckeditor/ckeditor5-upload/issues/68\n\t\t\tif ( isHtmlIncluded( data.dataTransfer ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst images = Array.from( data.dataTransfer.files ).filter( file => {\n\t\t\t\t// See https://github.com/ckeditor/ckeditor5-image/pull/254.\n\t\t\t\tif ( !file ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn imageTypes.test( file.type );\n\t\t\t} );\n\n\t\t\tif ( !images.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tevt.stop();\n\n\t\t\teditor.model.change( writer => {\n\t\t\t\t// Set selection to paste target.\n\t\t\t\tif ( data.targetRanges ) {\n\t\t\t\t\twriter.setSelection( data.targetRanges.map( viewRange => editor.editing.mapper.toModelRange( viewRange ) ) );\n\t\t\t\t}\n\n\t\t\t\t// Upload images after the selection has changed in order to ensure the command's state is refreshed.\n\t\t\t\teditor.model.enqueueChange( () => {\n\t\t\t\t\teditor.execute( 'uploadImage', { file: images } );\n\t\t\t\t} );\n\t\t\t} );\n\t\t} );\n\n\t\t// Handle HTML pasted with images with base64 or blob sources.\n\t\t// For every image file, a new file loader is created and a placeholder image is\n\t\t// inserted into the content. Then, those images are uploaded once they appear in the model\n\t\t// (see Document#change listener below).\n\t\tthis.listenTo( editor.plugins.get( 'ClipboardPipeline' ), 'inputTransformation', ( evt, data ) => {\n\t\t\tconst fetchableImages = Array.from( editor.editing.view.createRangeIn( data.content ) )\n\t\t\t\t.filter( value => isLocalImage( imageUtils, value.item ) && !value.item.getAttribute( 'uploadProcessed' ) )\n\t\t\t\t.map( value => { return { promise: fetchLocalImage( value.item ), imageElement: value.item }; } );\n\n\t\t\tif ( !fetchableImages.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst writer = new UpcastWriter( editor.editing.view.document );\n\n\t\t\tfor ( const fetchableImage of fetchableImages ) {\n\t\t\t\t// Set attribute marking that the image was processed already.\n\t\t\t\twriter.setAttribute( 'uploadProcessed', true, fetchableImage.imageElement );\n\n\t\t\t\tconst loader = fileRepository.createLoader( fetchableImage.promise );\n\n\t\t\t\tif ( loader ) {\n\t\t\t\t\twriter.setAttribute( 'src', '', fetchableImage.imageElement );\n\t\t\t\t\twriter.setAttribute( 'uploadId', loader.id, fetchableImage.imageElement );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Prevents from the browser redirecting to the dropped image.\n\t\teditor.editing.view.document.on( 'dragover', ( evt, data ) => {\n\t\t\tdata.preventDefault();\n\t\t} );\n\n\t\t// Upload placeholder images that appeared in the model.\n\t\tdoc.on( 'change', () => {\n\t\t\t// Note: Reversing changes to start with insertions and only then handle removals. If it was the other way around,\n\t\t\t// loaders for **all** images that land in the $graveyard would abort while in fact only those that were **not** replaced\n\t\t\t// by other images should be aborted.\n\t\t\tconst changes = doc.differ.getChanges( { includeChangesInGraveyard: true } ).reverse();\n\t\t\tconst insertedImagesIds = new Set();\n\n\t\t\tfor ( const entry of changes ) {\n\t\t\t\tif ( entry.type == 'insert' && entry.name != '$text' ) {\n\t\t\t\t\tconst item = entry.position.nodeAfter;\n\t\t\t\t\tconst isInsertedInGraveyard = entry.position.root.rootName == '$graveyard';\n\n\t\t\t\t\tfor ( const imageElement of getImagesFromChangeItem( editor, item ) ) {\n\t\t\t\t\t\t// Check if the image element still has upload id.\n\t\t\t\t\t\tconst uploadId = imageElement.getAttribute( 'uploadId' );\n\n\t\t\t\t\t\tif ( !uploadId ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check if the image is loaded on this client.\n\t\t\t\t\t\tconst loader = fileRepository.loaders.get( uploadId );\n\n\t\t\t\t\t\tif ( !loader ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isInsertedInGraveyard ) {\n\t\t\t\t\t\t\t// If the image was inserted to the graveyard for good (**not** replaced by another image),\n\t\t\t\t\t\t\t// only then abort the loading process.\n\t\t\t\t\t\t\tif ( !insertedImagesIds.has( uploadId ) ) {\n\t\t\t\t\t\t\t\tloader.abort();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Remember the upload id of the inserted image. If it acted as a replacement for another\n\t\t\t\t\t\t\t// image (which landed in the $graveyard), the related loader will not be aborted because\n\t\t\t\t\t\t\t// this is still the same image upload.\n\t\t\t\t\t\t\tinsertedImagesIds.add( uploadId );\n\n\t\t\t\t\t\t\t// Keep the mapping between the upload ID and the image model element so the upload\n\t\t\t\t\t\t\t// can later resolve in the context of the correct model element. The model element could\n\t\t\t\t\t\t\t// change for the same upload if one image was replaced by another (e.g. image type was changed),\n\t\t\t\t\t\t\t// so this may also replace an existing mapping.\n\t\t\t\t\t\t\tthis._uploadImageElements.set( uploadId, imageElement );\n\n\t\t\t\t\t\t\tif ( loader.status == 'idle' ) {\n\t\t\t\t\t\t\t\t// If the image was inserted into content and has not been loaded yet, start loading it.\n\t\t\t\t\t\t\t\tthis._readAndUpload( loader );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Set the default handler for feeding the image element with `src` and `srcset` attributes.\n\t\tthis.on( 'uploadComplete', ( evt, { imageElement, data } ) => {\n\t\t\tconst urls = data.urls ? data.urls : data;\n\n\t\t\tthis.editor.model.change( writer => {\n\t\t\t\twriter.setAttribute( 'src', urls.default, imageElement );\n\t\t\t\tthis._parseAndSetSrcsetAttributeOnImage( urls, imageElement, writer );\n\t\t\t} );\n\t\t}, { priority: 'low' } );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tafterInit() {\n\t\tconst schema = this.editor.model.schema;\n\n\t\t// Setup schema to allow uploadId and uploadStatus for images.\n\t\t// Wait for ImageBlockEditing or ImageInlineEditing to register their elements first,\n\t\t// that's why doing this in afterInit() instead of init().\n\t\tif ( this.editor.plugins.has( 'ImageBlockEditing' ) ) {\n\t\t\tschema.extend( 'imageBlock', {\n\t\t\t\tallowAttributes: [ 'uploadId', 'uploadStatus' ]\n\t\t\t} );\n\t\t}\n\n\t\tif ( this.editor.plugins.has( 'ImageInlineEditing' ) ) {\n\t\t\tschema.extend( 'imageInline', {\n\t\t\t\tallowAttributes: [ 'uploadId', 'uploadStatus' ]\n\t\t\t} );\n\t\t}\n\t}\n\n\t/**\n\t * Reads and uploads an image.\n\t *\n\t * The image is read from the disk and as a Base64-encoded string it is set temporarily to\n\t * `image[src]`. When the image is successfully uploaded, the temporary data is replaced with the target\n\t * image's URL (the URL to the uploaded image on the server).\n\t *\n\t * @protected\n\t * @param {module:upload/filerepository~FileLoader} loader\n\t * @returns {Promise}\n\t */\n\t_readAndUpload( loader ) {\n\t\tconst editor = this.editor;\n\t\tconst model = editor.model;\n\t\tconst t = editor.locale.t;\n\t\tconst fileRepository = editor.plugins.get( FileRepository );\n\t\tconst notification = editor.plugins.get( Notification );\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst imageUploadElements = this._uploadImageElements;\n\n\t\tmodel.enqueueChange( { isUndoable: false }, writer => {\n\t\t\twriter.setAttribute( 'uploadStatus', 'reading', imageUploadElements.get( loader.id ) );\n\t\t} );\n\n\t\treturn loader.read()\n\t\t\t.then( () => {\n\t\t\t\tconst promise = loader.upload();\n\t\t\t\tconst imageElement = imageUploadElements.get( loader.id );\n\n\t\t\t\t// Force re–paint in Safari. Without it, the image will display with a wrong size.\n\t\t\t\t// https://github.com/ckeditor/ckeditor5/issues/1975\n\t\t\t\t/* istanbul ignore next */\n\t\t\t\tif ( env.isSafari ) {\n\t\t\t\t\tconst viewFigure = editor.editing.mapper.toViewElement( imageElement );\n\t\t\t\t\tconst viewImg = imageUtils.findViewImgElement( viewFigure );\n\n\t\t\t\t\teditor.editing.view.once( 'render', () => {\n\t\t\t\t\t\t// Early returns just to be safe. There might be some code ran\n\t\t\t\t\t\t// in between the outer scope and this callback.\n\t\t\t\t\t\tif ( !viewImg.parent ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst domFigure = editor.editing.view.domConverter.mapViewToDom( viewImg.parent );\n\n\t\t\t\t\t\tif ( !domFigure ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst originalDisplay = domFigure.style.display;\n\n\t\t\t\t\t\tdomFigure.style.display = 'none';\n\n\t\t\t\t\t\t// Make sure this line will never be removed during minification for having \"no effect\".\n\t\t\t\t\t\tdomFigure._ckHack = domFigure.offsetHeight;\n\n\t\t\t\t\t\tdomFigure.style.display = originalDisplay;\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tmodel.enqueueChange( { isUndoable: false }, writer => {\n\t\t\t\t\twriter.setAttribute( 'uploadStatus', 'uploading', imageElement );\n\t\t\t\t} );\n\n\t\t\t\treturn promise;\n\t\t\t} )\n\t\t\t.then( data => {\n\t\t\t\tmodel.enqueueChange( { isUndoable: false }, writer => {\n\t\t\t\t\tconst imageElement = imageUploadElements.get( loader.id );\n\n\t\t\t\t\twriter.setAttribute( 'uploadStatus', 'complete', imageElement );\n\n\t\t\t\t\t/**\n\t\t\t\t\t * An event fired when an image is uploaded. You can hook into this event to provide\n\t\t\t\t\t * custom attributes to the {@link module:engine/model/element~Element image element} based on the data from\n\t\t\t\t\t * the server.\n\t\t\t\t\t *\n\t\t\t\t\t * \t\tconst imageUploadEditing = editor.plugins.get( 'ImageUploadEditing' );\n\t\t\t\t\t *\n\t\t\t\t\t * \t\timageUploadEditing.on( 'uploadComplete', ( evt, { data, imageElement } ) => {\n\t\t\t\t\t * \t\t\teditor.model.change( writer => {\n\t\t\t\t\t * \t\t\t\twriter.setAttribute( 'someAttribute', 'foo', imageElement );\n\t\t\t\t\t * \t\t\t} );\n\t\t\t\t\t * \t\t} );\n\t\t\t\t\t *\n\t\t\t\t\t * You can also stop the default handler that sets the `src` and `srcset` attributes\n\t\t\t\t\t * if you want to provide custom values for these attributes.\n\t\t\t\t\t *\n\t\t\t\t\t * \t\timageUploadEditing.on( 'uploadComplete', ( evt, { data, imageElement } ) => {\n\t\t\t\t\t * \t\t\tevt.stop();\n\t\t\t\t\t * \t\t} );\n\t\t\t\t\t *\n\t\t\t\t\t * **Note**: This event is fired by the {@link module:image/imageupload/imageuploadediting~ImageUploadEditing} plugin.\n\t\t\t\t\t *\n\t\t\t\t\t * @event uploadComplete\n\t\t\t\t\t * @param {Object} data The `uploadComplete` event data.\n\t\t\t\t\t * @param {Object} data.data The data coming from the upload adapter.\n\t\t\t\t\t * @param {module:engine/model/element~Element} data.imageElement The\n\t\t\t\t\t * model {@link module:engine/model/element~Element image element} that can be customized.\n\t\t\t\t\t */\n\t\t\t\t\tthis.fire( 'uploadComplete', { data, imageElement } );\n\t\t\t\t} );\n\n\t\t\t\tclean();\n\t\t\t} )\n\t\t\t.catch( error => {\n\t\t\t\t// If status is not 'error' nor 'aborted' - throw error because it means that something else went wrong,\n\t\t\t\t// it might be generic error and it would be real pain to find what is going on.\n\t\t\t\tif ( loader.status !== 'error' && loader.status !== 'aborted' ) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\n\t\t\t\t// Might be 'aborted'.\n\t\t\t\tif ( loader.status == 'error' && error ) {\n\t\t\t\t\tnotification.showWarning( error, {\n\t\t\t\t\t\ttitle: t( 'Upload failed' ),\n\t\t\t\t\t\tnamespace: 'upload'\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// Permanently remove image from insertion batch.\n\t\t\t\tmodel.enqueueChange( { isUndoable: false }, writer => {\n\t\t\t\t\twriter.remove( imageUploadElements.get( loader.id ) );\n\t\t\t\t} );\n\n\t\t\t\tclean();\n\t\t\t} );\n\n\t\tfunction clean() {\n\t\t\tmodel.enqueueChange( { isUndoable: false }, writer => {\n\t\t\t\tconst imageElement = imageUploadElements.get( loader.id );\n\n\t\t\t\twriter.removeAttribute( 'uploadId', imageElement );\n\t\t\t\twriter.removeAttribute( 'uploadStatus', imageElement );\n\n\t\t\t\timageUploadElements.delete( loader.id );\n\t\t\t} );\n\n\t\t\tfileRepository.destroyLoader( loader );\n\t\t}\n\t}\n\n\t/**\n\t * Creates the `srcset` attribute based on a given file upload response and sets it as an attribute to a specific image element.\n\t *\n\t * @protected\n\t * @param {Object} data Data object from which `srcset` will be created.\n\t * @param {module:engine/model/element~Element} image The image element on which the `srcset` attribute will be set.\n\t * @param {module:engine/model/writer~Writer} writer\n\t */\n\t_parseAndSetSrcsetAttributeOnImage( data, image, writer ) {\n\t\t// Srcset attribute for responsive images support.\n\t\tlet maxWidth = 0;\n\n\t\tconst srcsetAttribute = Object.keys( data )\n\t\t\t// Filter out keys that are not integers.\n\t\t\t.filter( key => {\n\t\t\t\tconst width = parseInt( key, 10 );\n\n\t\t\t\tif ( !isNaN( width ) ) {\n\t\t\t\t\tmaxWidth = Math.max( maxWidth, width );\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} )\n\n\t\t\t// Convert each key to srcset entry.\n\t\t\t.map( key => `${ data[ key ] } ${ key }w` )\n\n\t\t\t// Join all entries.\n\t\t\t.join( ', ' );\n\n\t\tif ( srcsetAttribute != '' ) {\n\t\t\twriter.setAttribute( 'srcset', {\n\t\t\t\tdata: srcsetAttribute,\n\t\t\t\twidth: maxWidth\n\t\t\t}, image );\n\t\t}\n\t}\n}\n\n// Returns `true` if non-empty `text/html` is included in the data transfer.\n//\n// @param {module:engine/view/datatransfer~DataTransfer} dataTransfer\n// @returns {Boolean}\nexport function isHtmlIncluded( dataTransfer ) {\n\treturn Array.from( dataTransfer.types ).includes( 'text/html' ) && dataTransfer.getData( 'text/html' ) !== '';\n}\n\nfunction getImagesFromChangeItem( editor, item ) {\n\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\n\treturn Array.from( editor.model.createRangeOn( item ) )\n\t\t.filter( value => imageUtils.isImage( value.item ) )\n\t\t.map( value => value.item );\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageupload/imageuploadprogress\n */\n\n/* globals setTimeout */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { FileRepository } from 'ckeditor5/src/upload';\n\nimport '../../theme/imageuploadprogress.css';\nimport '../../theme/imageuploadicon.css';\nimport '../../theme/imageuploadloader.css';\n\n/**\n * The image upload progress plugin.\n * It shows a placeholder when the image is read from the disk and a progress bar while the image is uploading.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageUploadProgress extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageUploadProgress';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor ) {\n\t\tsuper( editor );\n\n\t\t/**\n\t\t * The image placeholder that is displayed before real image data can be accessed.\n\t\t *\n\t\t * For the record, this image is a 1x1 px GIF with an aspect ratio set by CSS.\n\t\t *\n\t\t * @protected\n\t\t * @member {String} #placeholder\n\t\t */\n\t\tthis.placeholder = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\n\t\t// Upload status change - update image's view according to that status.\n\t\tif ( editor.plugins.has( 'ImageBlockEditing' ) ) {\n\t\t\teditor.editing.downcastDispatcher.on( 'attribute:uploadStatus:imageBlock', ( ...args ) => this.uploadStatusChange( ...args ) );\n\t\t}\n\n\t\tif ( editor.plugins.has( 'ImageInlineEditing' ) ) {\n\t\t\teditor.editing.downcastDispatcher.on( 'attribute:uploadStatus:imageInline', ( ...args ) => this.uploadStatusChange( ...args ) );\n\t\t}\n\t}\n\n\t/**\n\t * This method is called each time the image `uploadStatus` attribute is changed.\n\t *\n\t * @param {module:utils/eventinfo~EventInfo} evt An object containing information about the fired event.\n\t * @param {Object} data Additional information about the change.\n\t * @param {module:engine/conversion/downcastdispatcher~DowncastConversionApi} conversionApi\n\t */\n\tuploadStatusChange( evt, data, conversionApi ) {\n\t\tconst editor = this.editor;\n\t\tconst modelImage = data.item;\n\t\tconst uploadId = modelImage.getAttribute( 'uploadId' );\n\n\t\tif ( !conversionApi.consumable.consume( data.item, evt.name ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst fileRepository = editor.plugins.get( FileRepository );\n\t\tconst status = uploadId ? data.attributeNewValue : null;\n\t\tconst placeholder = this.placeholder;\n\t\tconst viewFigure = editor.editing.mapper.toViewElement( modelImage );\n\t\tconst viewWriter = conversionApi.writer;\n\n\t\tif ( status == 'reading' ) {\n\t\t\t// Start \"appearing\" effect and show placeholder with infinite progress bar on the top\n\t\t\t// while image is read from disk.\n\t\t\t_startAppearEffect( viewFigure, viewWriter );\n\t\t\t_showPlaceholder( imageUtils, placeholder, viewFigure, viewWriter );\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Show progress bar on the top of the image when image is uploading.\n\t\tif ( status == 'uploading' ) {\n\t\t\tconst loader = fileRepository.loaders.get( uploadId );\n\n\t\t\t// Start appear effect if needed - see https://github.com/ckeditor/ckeditor5-image/issues/191.\n\t\t\t_startAppearEffect( viewFigure, viewWriter );\n\n\t\t\tif ( !loader ) {\n\t\t\t\t// There is no loader associated with uploadId - this means that image came from external changes.\n\t\t\t\t// In such cases we still want to show the placeholder until image is fully uploaded.\n\t\t\t\t// Show placeholder if needed - see https://github.com/ckeditor/ckeditor5-image/issues/191.\n\t\t\t\t_showPlaceholder( imageUtils, placeholder, viewFigure, viewWriter );\n\t\t\t} else {\n\t\t\t\t// Hide placeholder and initialize progress bar showing upload progress.\n\t\t\t\t_hidePlaceholder( viewFigure, viewWriter );\n\t\t\t\t_showProgressBar( viewFigure, viewWriter, loader, editor.editing.view );\n\t\t\t\t_displayLocalImage( imageUtils, viewFigure, viewWriter, loader );\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif ( status == 'complete' && fileRepository.loaders.get( uploadId ) ) {\n\t\t\t_showCompleteIcon( viewFigure, viewWriter, editor.editing.view );\n\t\t}\n\n\t\t// Clean up.\n\t\t_hideProgressBar( viewFigure, viewWriter );\n\t\t_hidePlaceholder( viewFigure, viewWriter );\n\t\t_stopAppearEffect( viewFigure, viewWriter );\n\t}\n}\n\n// Adds ck-appear class to the image figure if one is not already applied.\n//\n// @param {module:engine/view/containerelement~ContainerElement} viewFigure\n// @param {module:engine/view/downcastwriter~DowncastWriter} writer\nfunction _startAppearEffect( viewFigure, writer ) {\n\tif ( !viewFigure.hasClass( 'ck-appear' ) ) {\n\t\twriter.addClass( 'ck-appear', viewFigure );\n\t}\n}\n\n// Removes ck-appear class to the image figure if one is not already removed.\n//\n// @param {module:engine/view/containerelement~ContainerElement} viewFigure\n// @param {module:engine/view/downcastwriter~DowncastWriter} writer\nfunction _stopAppearEffect( viewFigure, writer ) {\n\twriter.removeClass( 'ck-appear', viewFigure );\n}\n\n// Shows placeholder together with infinite progress bar on given image figure.\n//\n// @param {module:image/imageutils~ImageUtils} imageUtils\n// @param {String} Data-uri with a svg placeholder.\n// @param {module:engine/view/containerelement~ContainerElement} viewFigure\n// @param {module:engine/view/downcastwriter~DowncastWriter} writer\nfunction _showPlaceholder( imageUtils, placeholder, viewFigure, writer ) {\n\tif ( !viewFigure.hasClass( 'ck-image-upload-placeholder' ) ) {\n\t\twriter.addClass( 'ck-image-upload-placeholder', viewFigure );\n\t}\n\n\tconst viewImg = imageUtils.findViewImgElement( viewFigure );\n\n\tif ( viewImg.getAttribute( 'src' ) !== placeholder ) {\n\t\twriter.setAttribute( 'src', placeholder, viewImg );\n\t}\n\n\tif ( !_getUIElement( viewFigure, 'placeholder' ) ) {\n\t\twriter.insert( writer.createPositionAfter( viewImg ), _createPlaceholder( writer ) );\n\t}\n}\n\n// Removes placeholder together with infinite progress bar on given image figure.\n//\n// @param {module:engine/view/containerelement~ContainerElement} viewFigure\n// @param {module:engine/view/downcastwriter~DowncastWriter} writer\nfunction _hidePlaceholder( viewFigure, writer ) {\n\tif ( viewFigure.hasClass( 'ck-image-upload-placeholder' ) ) {\n\t\twriter.removeClass( 'ck-image-upload-placeholder', viewFigure );\n\t}\n\n\t_removeUIElement( viewFigure, writer, 'placeholder' );\n}\n\n// Shows progress bar displaying upload progress.\n// Attaches it to the file loader to update when upload percentace is changed.\n//\n// @param {module:engine/view/containerelement~ContainerElement} viewFigure\n// @param {module:engine/view/downcastwriter~DowncastWriter} writer\n// @param {module:upload/filerepository~FileLoader} loader\n// @param {module:engine/view/view~View} view\nfunction _showProgressBar( viewFigure, writer, loader, view ) {\n\tconst progressBar = _createProgressBar( writer );\n\twriter.insert( writer.createPositionAt( viewFigure, 'end' ), progressBar );\n\n\t// Update progress bar width when uploadedPercent is changed.\n\tloader.on( 'change:uploadedPercent', ( evt, name, value ) => {\n\t\tview.change( writer => {\n\t\t\twriter.setStyle( 'width', value + '%', progressBar );\n\t\t} );\n\t} );\n}\n\n// Hides upload progress bar.\n//\n// @param {module:engine/view/containerelement~ContainerElement} viewFigure\n// @param {module:engine/view/downcastwriter~DowncastWriter} writer\nfunction _hideProgressBar( viewFigure, writer ) {\n\t_removeUIElement( viewFigure, writer, 'progressBar' );\n}\n\n// Shows complete icon and hides after a certain amount of time.\n//\n// @param {module:engine/view/containerelement~ContainerElement} viewFigure\n// @param {module:engine/view/downcastwriter~DowncastWriter} writer\n// @param {module:engine/view/view~View} view\nfunction _showCompleteIcon( viewFigure, writer, view ) {\n\tconst completeIcon = writer.createUIElement( 'div', { class: 'ck-image-upload-complete-icon' } );\n\n\twriter.insert( writer.createPositionAt( viewFigure, 'end' ), completeIcon );\n\n\tsetTimeout( () => {\n\t\tview.change( writer => writer.remove( writer.createRangeOn( completeIcon ) ) );\n\t}, 3000 );\n}\n\n// Create progress bar element using {@link module:engine/view/uielement~UIElement}.\n//\n// @private\n// @param {module:engine/view/downcastwriter~DowncastWriter} writer\n// @returns {module:engine/view/uielement~UIElement}\nfunction _createProgressBar( writer ) {\n\tconst progressBar = writer.createUIElement( 'div', { class: 'ck-progress-bar' } );\n\n\twriter.setCustomProperty( 'progressBar', true, progressBar );\n\n\treturn progressBar;\n}\n\n// Create placeholder element using {@link module:engine/view/uielement~UIElement}.\n//\n// @private\n// @param {module:engine/view/downcastwriter~DowncastWriter} writer\n// @returns {module:engine/view/uielement~UIElement}\nfunction _createPlaceholder( writer ) {\n\tconst placeholder = writer.createUIElement( 'div', { class: 'ck-upload-placeholder-loader' } );\n\n\twriter.setCustomProperty( 'placeholder', true, placeholder );\n\n\treturn placeholder;\n}\n\n// Returns {@link module:engine/view/uielement~UIElement} of given unique property from image figure element.\n// Returns `undefined` if element is not found.\n//\n// @private\n// @param {module:engine/view/element~Element} imageFigure\n// @param {String} uniqueProperty\n// @returns {module:engine/view/uielement~UIElement|undefined}\nfunction _getUIElement( imageFigure, uniqueProperty ) {\n\tfor ( const child of imageFigure.getChildren() ) {\n\t\tif ( child.getCustomProperty( uniqueProperty ) ) {\n\t\t\treturn child;\n\t\t}\n\t}\n}\n\n// Removes {@link module:engine/view/uielement~UIElement} of given unique property from image figure element.\n//\n// @private\n// @param {module:engine/view/element~Element} imageFigure\n// @param {module:engine/view/downcastwriter~DowncastWriter} writer\n// @param {String} uniqueProperty\nfunction _removeUIElement( viewFigure, writer, uniqueProperty ) {\n\tconst element = _getUIElement( viewFigure, uniqueProperty );\n\n\tif ( element ) {\n\t\twriter.remove( writer.createRangeOn( element ) );\n\t}\n}\n\n// Displays local data from file loader.\n//\n// @param {module:image/imageutils~ImageUtils} imageUtils\n// @param {module:engine/view/element~Element} imageFigure\n// @param {module:engine/view/downcastwriter~DowncastWriter} writer\n// @param {module:upload/filerepository~FileLoader} loader\nfunction _displayLocalImage( imageUtils, viewFigure, writer, loader ) {\n\tif ( loader.data ) {\n\t\tconst viewImg = imageUtils.findViewImgElement( viewFigure );\n\n\t\twriter.setAttribute( 'src', loader.data, viewImg );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageupload/imageuploadui\n */\n\nimport { Plugin, icons } from 'ckeditor5/src/core';\nimport { FileDialogButtonView } from 'ckeditor5/src/upload';\nimport { createImageTypeRegExp } from './utils';\n\n/**\n * The image upload button plugin.\n *\n * For a detailed overview, check the {@glink features/images/image-upload/image-upload Image upload feature} documentation.\n *\n * Adds the `'uploadImage'` button to the {@link module:ui/componentfactory~ComponentFactory UI component factory}\n * and also the `imageUpload` button as an alias for backward compatibility.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageUploadUI extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageUploadUI';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst t = editor.t;\n\t\tconst componentCreator = locale => {\n\t\t\tconst view = new FileDialogButtonView( locale );\n\t\t\tconst command = editor.commands.get( 'uploadImage' );\n\t\t\tconst imageTypes = editor.config.get( 'image.upload.types' );\n\t\t\tconst imageTypesRegExp = createImageTypeRegExp( imageTypes );\n\n\t\t\tview.set( {\n\t\t\t\tacceptedType: imageTypes.map( type => `image/${ type }` ).join( ',' ),\n\t\t\t\tallowMultipleFiles: true\n\t\t\t} );\n\n\t\t\tview.buttonView.set( {\n\t\t\t\tlabel: t( 'Insert image' ),\n\t\t\t\ticon: icons.image,\n\t\t\t\ttooltip: true\n\t\t\t} );\n\n\t\t\tview.buttonView.bind( 'isEnabled' ).to( command );\n\n\t\t\tview.on( 'done', ( evt, files ) => {\n\t\t\t\tconst imagesToUpload = Array.from( files ).filter( file => imageTypesRegExp.test( file.type ) );\n\n\t\t\t\tif ( imagesToUpload.length ) {\n\t\t\t\t\teditor.execute( 'uploadImage', { file: imagesToUpload } );\n\n\t\t\t\t\teditor.editing.view.focus();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturn view;\n\t\t};\n\n\t\t// Setup `uploadImage` button and add `imageUpload` button as an alias for backward compatibility.\n\t\teditor.ui.componentFactory.add( 'uploadImage', componentCreator );\n\t\teditor.ui.componentFactory.add( 'imageUpload', componentCreator );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\nimport { FileRepository } from 'ckeditor5/src/upload';\nimport { Command } from 'ckeditor5/src/core';\nimport { toArray } from 'ckeditor5/src/utils';\n\n/**\n * @module image/imageupload/uploadimagecommand\n */\n\n/**\n * The upload image command.\n *\n * The command is registered by the {@link module:image/imageupload/imageuploadediting~ImageUploadEditing} plugin as `uploadImage`\n * and it is also available via aliased `imageUpload` name.\n *\n * In order to upload an image at the current selection position\n * (according to the {@link module:widget/utils~findOptimalInsertionRange} algorithm),\n * execute the command and pass the native image file instance:\n *\n *\t\tthis.listenTo( editor.editing.view.document, 'clipboardInput', ( evt, data ) => {\n *\t\t\t// Assuming that only images were pasted:\n *\t\t\tconst images = Array.from( data.dataTransfer.files );\n *\n *\t\t\t// Upload the first image:\n *\t\t\teditor.execute( 'uploadImage', { file: images[ 0 ] } );\n *\t\t} );\n *\n * It is also possible to insert multiple images at once:\n *\n *\t\teditor.execute( 'uploadImage', {\n *\t\t\tfile: [\n *\t\t\t\tfile1,\n *\t\t\t\tfile2\n *\t\t\t]\n *\t\t} );\n *\n * @extends module:core/command~Command\n */\nexport default class UploadImageCommand extends Command {\n\t/**\n\t * @inheritDoc\n\t */\n\trefresh() {\n\t\tconst editor = this.editor;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t\tconst selectedElement = editor.model.document.selection.getSelectedElement();\n\n\t\t// TODO: This needs refactoring.\n\t\tthis.isEnabled = imageUtils.isImageAllowed() || imageUtils.isImage( selectedElement );\n\t}\n\n\t/**\n\t * Executes the command.\n\t *\n\t * @fires execute\n\t * @param {Object} options Options for the executed command.\n\t * @param {File|Array.<File>} options.file The image file or an array of image files to upload.\n\t */\n\texecute( options ) {\n\t\tconst files = toArray( options.file );\n\t\tconst selection = this.editor.model.document.selection;\n\t\tconst imageUtils = this.editor.plugins.get( 'ImageUtils' );\n\n\t\t// In case of multiple files, each file (starting from the 2nd) will be inserted at a position that\n\t\t// follows the previous one. That will move the selection and, to stay on the safe side and make sure\n\t\t// all images inherit the same selection attributes, they are collected beforehand.\n\t\t//\n\t\t// Applying these attributes ensures, for instance, that inserting an (inline) image into a link does\n\t\t// not split that link but preserves its continuity.\n\t\t//\n\t\t// Note: Selection attributes that do not make sense for images will be filtered out by insertImage() anyway.\n\t\tconst selectionAttributes = Object.fromEntries( selection.getAttributes() );\n\n\t\tfiles.forEach( ( file, index ) => {\n\t\t\tconst selectedElement = selection.getSelectedElement();\n\n\t\t\t// Inserting of an inline image replace the selected element and make a selection on the inserted image.\n\t\t\t// Therefore inserting multiple inline images requires creating position after each element.\n\t\t\tif ( index && selectedElement && imageUtils.isImage( selectedElement ) ) {\n\t\t\t\tconst position = this.editor.model.createPositionAfter( selectedElement );\n\n\t\t\t\tthis._uploadImage( file, selectionAttributes, position );\n\t\t\t} else {\n\t\t\t\tthis._uploadImage( file, selectionAttributes );\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * Handles uploading single file.\n\t *\n\t * @private\n\t * @param {File} file\n\t * @param {Object} attributes\n\t * @param {module:engine/model/position~Position} position\n\t */\n\t_uploadImage( file, attributes, position ) {\n\t\tconst editor = this.editor;\n\t\tconst fileRepository = editor.plugins.get( FileRepository );\n\t\tconst loader = fileRepository.createLoader( file );\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\n\t\t// Do not throw when upload adapter is not set. FileRepository will log an error anyway.\n\t\tif ( !loader ) {\n\t\t\treturn;\n\t\t}\n\n\t\timageUtils.insertImage( { ...attributes, uploadId: loader.id }, position );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageupload/utils\n */\n\n/* global fetch, File */\n\nimport { global } from 'ckeditor5/src/utils';\n\n/**\n * Creates a regular expression used to test for image files.\n *\n *\t\tconst imageType = createImageTypeRegExp( [ 'png', 'jpeg', 'svg+xml', 'vnd.microsoft.icon' ] );\n *\n *\t\tconsole.log( 'is supported image', imageType.test( file.type ) );\n *\n * @param {Array.<String>} types\n * @returns {RegExp}\n */\nexport function createImageTypeRegExp( types ) {\n\t// Sanitize the MIME type name which may include: \"+\", \"-\" or \".\".\n\tconst regExpSafeNames = types.map( type => type.replace( '+', '\\\\+' ) );\n\n\treturn new RegExp( `^image\\\\/(${ regExpSafeNames.join( '|' ) })$` );\n}\n\n/**\n * Creates a promise that fetches the image local source (Base64 or blob) and resolves with a `File` object.\n *\n * @param {module:engine/view/element~Element} image Image whose source to fetch.\n * @returns {Promise.<File>} A promise which resolves when an image source is fetched and converted to a `File` instance.\n * It resolves with a `File` object. If there were any errors during file processing, the promise will be rejected.\n */\nexport function fetchLocalImage( image ) {\n\treturn new Promise( ( resolve, reject ) => {\n\t\tconst imageSrc = image.getAttribute( 'src' );\n\n\t\t// Fetch works asynchronously and so does not block browser UI when processing data.\n\t\tfetch( imageSrc )\n\t\t\t.then( resource => resource.blob() )\n\t\t\t.then( blob => {\n\t\t\t\tconst mimeType = getImageMimeType( blob, imageSrc );\n\t\t\t\tconst ext = mimeType.replace( 'image/', '' );\n\t\t\t\tconst filename = `image.${ ext }`;\n\t\t\t\tconst file = new File( [ blob ], filename, { type: mimeType } );\n\n\t\t\t\tresolve( file );\n\t\t\t} )\n\t\t\t.catch( err => {\n\t\t\t\t// Fetch fails only, if it can't make a request due to a network failure or if anything prevented the request\n\t\t\t\t// from completing, i.e. the Content Security Policy rules. It is not possible to detect the exact cause of failure,\n\t\t\t\t// so we are just trying the fallback solution, if general TypeError is thrown.\n\t\t\t\treturn err && err.name === 'TypeError' ?\n\t\t\t\t\tconvertLocalImageOnCanvas( imageSrc ).then( resolve ).catch( reject ) :\n\t\t\t\t\treject( err );\n\t\t\t} );\n\t} );\n}\n\n/**\n * Checks whether a given node is an image element with a local source (Base64 or blob).\n *\n * @param {module:image/imageutils~ImageUtils} imageUtils\n * @param {module:engine/view/node~Node} node The node to check.\n * @returns {Boolean}\n */\nexport function isLocalImage( imageUtils, node ) {\n\tif ( !imageUtils.isInlineImageView( node ) || !node.getAttribute( 'src' ) ) {\n\t\treturn false;\n\t}\n\n\treturn node.getAttribute( 'src' ).match( /^data:image\\/\\w+;base64,/g ) ||\n\t\tnode.getAttribute( 'src' ).match( /^blob:/g );\n}\n\n// Extracts an image type based on its blob representation or its source.\n//\n// @param {String} src Image `src` attribute value.\n// @param {Blob} blob Image blob representation.\n// @returns {String}\nfunction getImageMimeType( blob, src ) {\n\tif ( blob.type ) {\n\t\treturn blob.type;\n\t} else if ( src.match( /data:(image\\/\\w+);base64/ ) ) {\n\t\treturn src.match( /data:(image\\/\\w+);base64/ )[ 1 ].toLowerCase();\n\t} else {\n\t\t// Fallback to 'jpeg' as common extension.\n\t\treturn 'image/jpeg';\n\t}\n}\n\n// Creates a promise that converts the image local source (Base64 or blob) to a blob using canvas and resolves\n// with a `File` object.\n//\n// @param {String} imageSrc Image `src` attribute value.\n// @returns {Promise.<File>} A promise which resolves when an image source is converted to a `File` instance.\n// It resolves with a `File` object. If there were any errors during file processing, the promise will be rejected.\nfunction convertLocalImageOnCanvas( imageSrc ) {\n\treturn getBlobFromCanvas( imageSrc ).then( blob => {\n\t\tconst mimeType = getImageMimeType( blob, imageSrc );\n\t\tconst ext = mimeType.replace( 'image/', '' );\n\t\tconst filename = `image.${ ext }`;\n\n\t\treturn new File( [ blob ], filename, { type: mimeType } );\n\t} );\n}\n\n// Creates a promise that resolves with a `Blob` object converted from the image source (Base64 or blob).\n//\n// @param {String} imageSrc Image `src` attribute value.\n// @returns {Promise.<Blob>}\nfunction getBlobFromCanvas( imageSrc ) {\n\treturn new Promise( ( resolve, reject ) => {\n\t\tconst image = global.document.createElement( 'img' );\n\n\t\timage.addEventListener( 'load', () => {\n\t\t\tconst canvas = global.document.createElement( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst ctx = canvas.getContext( '2d' );\n\n\t\t\tctx.drawImage( image, 0, 0 );\n\n\t\t\tcanvas.toBlob( blob => blob ? resolve( blob ) : reject() );\n\t\t} );\n\n\t\timage.addEventListener( 'error', () => reject() );\n\n\t\timage.src = imageSrc;\n\t} );\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/imageutils\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { findOptimalInsertionRange, isWidget, toWidget } from 'ckeditor5/src/widget';\nimport { determineImageTypeForInsertionAtSelection } from './image/utils';\n\n/**\n * A set of helpers related to images.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class ImageUtils extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'ImageUtils';\n\t}\n\n\t/**\n\t * Checks if the provided model element is an `image` or `imageInline`.\n\t *\n\t * @param {module:engine/model/element~Element} modelElement\n\t * @returns {Boolean}\n\t */\n\tisImage( modelElement ) {\n\t\treturn this.isInlineImage( modelElement ) || this.isBlockImage( modelElement );\n\t}\n\n\t/**\n\t * Checks if the provided view element represents an inline image.\n\t *\n\t * Also, see {@link module:image/imageutils~ImageUtils#isImageWidget}.\n\t *\n\t * @param {module:engine/view/element~Element} element\n\t * @returns {Boolean}\n\t */\n\tisInlineImageView( element ) {\n\t\treturn !!element && element.is( 'element', 'img' );\n\t}\n\n\t/**\n\t * Checks if the provided view element represents a block image.\n\t *\n\t * Also, see {@link module:image/imageutils~ImageUtils#isImageWidget}.\n\t *\n\t * @param {module:engine/view/element~Element} element\n\t * @returns {Boolean}\n\t */\n\tisBlockImageView( element ) {\n\t\treturn !!element && element.is( 'element', 'figure' ) && element.hasClass( 'image' );\n\t}\n\n\t/**\n\t * Handles inserting single file. This method unifies image insertion using {@link module:widget/utils~findOptimalInsertionRange}\n\t * method.\n\t *\n\t *\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\t *\n\t *\t\timageUtils.insertImage( { src: 'path/to/image.jpg' } );\n\t *\n\t * @param {Object} [attributes={}] Attributes of the inserted image.\n\t * This method filters out the attributes which are disallowed by the {@link module:engine/model/schema~Schema}.\n\t * @param {module:engine/model/selection~Selectable} [selectable] Place to insert the image. If not specified,\n\t * the {@link module:widget/utils~findOptimalInsertionRange} logic will be applied for the block images\n\t * and `model.document.selection` for the inline images.\n\t *\n\t * **Note**: If `selectable` is passed, this helper will not be able to set selection attributes (such as `linkHref`)\n\t * and apply them to the new image. In this case, make sure all selection attributes are passed in `attributes`.\n\t *\n\t * @param {'imageBlock'|'imageInline'} [imageType] Image type of inserted image. If not specified,\n\t * it will be determined automatically depending of editor config or place of the insertion.\n\t * @return {module:engine/view/element~Element|null} The inserted model image element.\n\t */\n\tinsertImage( attributes = {}, selectable = null, imageType = null ) {\n\t\tconst editor = this.editor;\n\t\tconst model = editor.model;\n\t\tconst selection = model.document.selection;\n\n\t\timageType = determineImageTypeForInsertion( editor, selectable || selection, imageType );\n\n\t\t// Mix declarative attributes with selection attributes because the new image should \"inherit\"\n\t\t// the latter for best UX. For instance, inline images inserted into existing links\n\t\t// should not split them. To do that, they need to have \"linkHref\" inherited from the selection.\n\t\tattributes = {\n\t\t\t...Object.fromEntries( selection.getAttributes() ),\n\t\t\t...attributes\n\t\t};\n\n\t\tfor ( const attributeName in attributes ) {\n\t\t\tif ( !model.schema.checkAttribute( imageType, attributeName ) ) {\n\t\t\t\tdelete attributes[ attributeName ];\n\t\t\t}\n\t\t}\n\n\t\treturn model.change( writer => {\n\t\t\tconst imageElement = writer.createElement( imageType, attributes );\n\n\t\t\tmodel.insertObject( imageElement, selectable, null, {\n\t\t\t\tsetSelection: 'on',\n\t\t\t\t// If we want to insert a block image (for whatever reason) then we don't want to split text blocks.\n\t\t\t\t// This applies only when we don't have the selectable specified (i.e., we insert multiple block images at once).\n\t\t\t\tfindOptimalPosition: !selectable && imageType != 'imageInline'\n\t\t\t} );\n\n\t\t\t// Inserting an image might've failed due to schema regulations.\n\t\t\tif ( imageElement.parent ) {\n\t\t\t\treturn imageElement;\n\t\t\t}\n\n\t\t\treturn null;\n\t\t} );\n\t}\n\n\t/**\n\t * Returns an image widget editing view element if one is selected or is among the selection's ancestors.\n\t *\n\t * @protected\n\t * @param {module:engine/view/selection~Selection|module:engine/view/documentselection~DocumentSelection} selection\n\t * @returns {module:engine/view/element~Element|null}\n\t */\n\tgetClosestSelectedImageWidget( selection ) {\n\t\tconst selectionPosition = selection.getFirstPosition();\n\n\t\tif ( !selectionPosition ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst viewElement = selection.getSelectedElement();\n\n\t\tif ( viewElement && this.isImageWidget( viewElement ) ) {\n\t\t\treturn viewElement;\n\t\t}\n\n\t\tlet parent = selectionPosition.parent;\n\n\t\twhile ( parent ) {\n\t\t\tif ( parent.is( 'element' ) && this.isImageWidget( parent ) ) {\n\t\t\t\treturn parent;\n\t\t\t}\n\n\t\t\tparent = parent.parent;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Returns a image model element if one is selected or is among the selection's ancestors.\n\t *\n\t * @param {module:engine/model/selection~Selection|module:engine/model/documentselection~DocumentSelection} selection\n\t * @returns {module:engine/model/element~Element|null}\n\t */\n\tgetClosestSelectedImageElement( selection ) {\n\t\tconst selectedElement = selection.getSelectedElement();\n\n\t\treturn this.isImage( selectedElement ) ? selectedElement : selection.getFirstPosition().findAncestor( 'imageBlock' );\n\t}\n\n\t/**\n\t * Checks if image can be inserted at current model selection.\n\t *\n\t * @protected\n\t * @returns {Boolean}\n\t */\n\tisImageAllowed() {\n\t\tconst model = this.editor.model;\n\t\tconst selection = model.document.selection;\n\n\t\treturn isImageAllowedInParent( this.editor, selection ) && isNotInsideImage( selection );\n\t}\n\n\t/**\n\t * Converts a given {@link module:engine/view/element~Element} to an image widget:\n\t * * Adds a {@link module:engine/view/element~Element#_setCustomProperty custom property} allowing to recognize the image widget\n\t * element.\n\t * * Calls the {@link module:widget/utils~toWidget} function with the proper element's label creator.\n\t *\n\t * @protected\n\t * @param {module:engine/view/element~Element} viewElement\n\t * @param {module:engine/view/downcastwriter~DowncastWriter} writer An instance of the view writer.\n\t * @param {String} label The element's label. It will be concatenated with the image `alt` attribute if one is present.\n\t * @returns {module:engine/view/element~Element}\n\t */\n\ttoImageWidget( viewElement, writer, label ) {\n\t\twriter.setCustomProperty( 'image', true, viewElement );\n\n\t\tconst labelCreator = () => {\n\t\t\tconst imgElement = this.findViewImgElement( viewElement );\n\t\t\tconst altText = imgElement.getAttribute( 'alt' );\n\n\t\t\treturn altText ? `${ altText } ${ label }` : label;\n\t\t};\n\n\t\treturn toWidget( viewElement, writer, { label: labelCreator } );\n\t}\n\n\t/**\n\t * Checks if a given view element is an image widget.\n\t *\n\t * @protected\n\t * @param {module:engine/view/element~Element} viewElement\n\t * @returns {Boolean}\n\t */\n\tisImageWidget( viewElement ) {\n\t\treturn !!viewElement.getCustomProperty( 'image' ) && isWidget( viewElement );\n\t}\n\n\t/**\n\t * Checks if the provided model element is an `image`.\n\t *\n\t * @param {module:engine/model/element~Element} modelElement\n\t * @returns {Boolean}\n\t */\n\tisBlockImage( modelElement ) {\n\t\treturn !!modelElement && modelElement.is( 'element', 'imageBlock' );\n\t}\n\n\t/**\n\t * Checks if the provided model element is an `imageInline`.\n\t *\n\t * @param {module:engine/model/element~Element} modelElement\n\t * @returns {Boolean}\n\t */\n\tisInlineImage( modelElement ) {\n\t\treturn !!modelElement && modelElement.is( 'element', 'imageInline' );\n\t}\n\n\t/**\n\t * Get the view `<img>` from another view element, e.g. a widget (`<figure class=\"image\">`), a link (`<a>`).\n\t *\n\t * The `<img>` can be located deep in other elements, so this helper performs a deep tree search.\n\t *\n\t * @param {module:engine/view/element~Element} figureView\n\t * @returns {module:engine/view/element~Element}\n\t */\n\tfindViewImgElement( figureView ) {\n\t\tif ( this.isInlineImageView( figureView ) ) {\n\t\t\treturn figureView;\n\t\t}\n\n\t\tconst editingView = this.editor.editing.view;\n\n\t\tfor ( const { item } of editingView.createRangeIn( figureView ) ) {\n\t\t\tif ( this.isInlineImageView( item ) ) {\n\t\t\t\treturn item;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Checks if image is allowed by schema in optimal insertion parent.\n//\n// @private\n// @param {module:core/editor/editor~Editor} editor\n// @param {module:engine/model/selection~Selection} selection\n// @returns {Boolean}\nfunction isImageAllowedInParent( editor, selection ) {\n\tconst imageType = determineImageTypeForInsertion( editor, selection );\n\n\tif ( imageType == 'imageBlock' ) {\n\t\tconst parent = getInsertImageParent( selection, editor.model );\n\n\t\tif ( editor.model.schema.checkChild( parent, 'imageBlock' ) ) {\n\t\t\treturn true;\n\t\t}\n\t} else if ( editor.model.schema.checkChild( selection.focus, 'imageInline' ) ) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n// Checks if selection is not placed inside an image (e.g. its caption).\n//\n// @private\n// @param {module:engine/model/selection~Selectable} selection\n// @returns {Boolean}\nfunction isNotInsideImage( selection ) {\n\treturn [ ...selection.focus.getAncestors() ].every( ancestor => !ancestor.is( 'element', 'imageBlock' ) );\n}\n\n// Returns a node that will be used to insert image with `model.insertContent`.\n//\n// @private\n// @param {module:engine/model/selection~Selection} selection\n// @param {module:engine/model/model~Model} model\n// @returns {module:engine/model/element~Element}\nfunction getInsertImageParent( selection, model ) {\n\tconst insertionRange = findOptimalInsertionRange( selection, model );\n\tconst parent = insertionRange.start.parent;\n\n\tif ( parent.isEmpty && !parent.is( 'element', '$root' ) ) {\n\t\treturn parent.parent;\n\t}\n\n\treturn parent;\n}\n\n// Determine image element type name depending on editor config or place of insertion.\n//\n// @private\n// @param {module:core/editor/editor~Editor} editor\n// @param {module:engine/model/selection~Selectable} selectable\n// @param {'imageBlock'|'imageInline'} [imageType] Image element type name. Used to force return of provided element name,\n// but only if there is proper plugin enabled.\n// @returns {'imageBlock'|'imageInline'} imageType\nfunction determineImageTypeForInsertion( editor, selectable, imageType ) {\n\tconst schema = editor.model.schema;\n\tconst configImageInsertType = editor.config.get( 'image.insert.type' );\n\n\tif ( !editor.plugins.has( 'ImageBlockEditing' ) ) {\n\t\treturn 'imageInline';\n\t}\n\n\tif ( !editor.plugins.has( 'ImageInlineEditing' ) ) {\n\t\treturn 'imageBlock';\n\t}\n\n\tif ( imageType ) {\n\t\treturn imageType;\n\t}\n\n\tif ( configImageInsertType === 'inline' ) {\n\t\treturn 'imageInline';\n\t}\n\n\tif ( configImageInsertType === 'block' ) {\n\t\treturn 'imageBlock';\n\t}\n\n\t// Try to replace the selected widget (e.g. another image).\n\tif ( selectable.is( 'selection' ) ) {\n\t\treturn determineImageTypeForInsertionAtSelection( schema, selectable );\n\t}\n\n\treturn schema.checkChild( selectable, 'imageInline' ) ? 'imageInline' : 'imageBlock';\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image/pictureediting\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\n\nimport ImageEditing from './image/imageediting';\nimport ImageUtils from './imageutils';\nimport {\n\tdowncastSourcesAttribute,\n\tupcastPicture\n} from './image/converters';\n\n/**\n * This plugin enables the [`<picture>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture) element support in the editor.\n *\n * * It enables the `sources` model attribute on `imageBlock` and `imageInline` model elements\n * (brought by {@link module:image/imageblock~ImageBlock} and {@link module:image/imageinline~ImageInline}, respectively).\n * * It translates the `sources` model element to the view (also: data) structure that may look as follows:\n *\n *\t\t<p>Inline image using picture:\n *\t\t\t<picture>\n *\t\t\t\t<source media=\"(min-width: 800px)\" srcset=\"image-large.webp\" type=\"image/webp\">\n *\t\t\t\t<source media=\"(max-width: 800px)\" srcset=\"image-small.webp\" type=\"image/webp\">\n *\t\t\t\t<!-- Other sources as specified in the \"sources\" model attribute... -->\n *\t\t\t\t<img src=\"image.png\" alt=\"An image using picture\" />\n *\t\t\t</picture>\n *\t\t</p>\n *\n *\t\t<p>Block image using picture:</p>\n *\t\t<figure class=\"image\">\n *\t\t\t<picture>\n *\t\t\t\t<source media=\"(min-width: 800px)\" srcset=\"image-large.webp\" type=\"image/webp\">\n *\t\t\t\t<source media=\"(max-width: 800px)\" srcset=\"image-small.webp\" type=\"image/webp\">\n *\t\t\t\t<!-- Other sources as specified in the \"sources\" model attribute... -->\n *\t\t\t\t<img src=\"image.png\" alt=\"An image using picture\" />\n *\t\t\t</picture>\n *\t\t\t<figcaption>Caption of the image</figcaption>\n *\t\t</figure>\n *\n *\t**Note:** The value of the `sources` {@glink framework/guides/architecture/editing-engine#changing-the-model model attribute}\n * \tin both examples equals:\n *\n *\t\t[\n *\t\t\t{\n *\t\t\t\tmedia: '(min-width: 800px)',\n *\t\t\t\tsrcset: 'image-large.webp',\n *\t\t\t\ttype: 'image/webp'\n *\t\t\t},\n *\t\t\t{\n *\t\t\t\tmedia: '(max-width: 800px)',\n *\t\t\t\tsrcset: 'image-small.webp',\n *\t\t\t\ttype: 'image/webp'\n *\t\t\t}\n * \t\t]\n *\n * * It integrates with the {@link module:image/imageupload~ImageUpload} plugin so images uploaded in the editor\n * automatically render using `<picture>` if the {@glink features/images/image-upload/image-upload upload adapter}\n * supports image sources and provides neccessary data.\n *\n * @private\n * @extends module:core/plugin~Plugin\n */\nexport default class PictureEditing extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ ImageEditing, ImageUtils ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'PictureEditing';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tafterInit() {\n\t\tconst editor = this.editor;\n\n\t\tif ( editor.plugins.has( 'ImageBlockEditing' ) ) {\n\t\t\teditor.model.schema.extend( 'imageBlock', {\n\t\t\t\tallowAttributes: [ 'sources' ]\n\t\t\t} );\n\t\t}\n\n\t\tif ( editor.plugins.has( 'ImageInlineEditing' ) ) {\n\t\t\teditor.model.schema.extend( 'imageInline', {\n\t\t\t\tallowAttributes: [ 'sources' ]\n\t\t\t} );\n\t\t}\n\n\t\tthis._setupConversion();\n\t\tthis._setupImageUploadEditingIntegration();\n\t}\n\n\t/**\n\t * Configures conversion pipelines to support upcasting and downcasting images using the `<picture>` view element\n\t * and the model `sources` attribute.\n\t *\n\t * @private\n\t */\n\t_setupConversion() {\n\t\tconst editor = this.editor;\n\t\tconst conversion = editor.conversion;\n\t\tconst imageUtils = editor.plugins.get( 'ImageUtils' );\n\n\t\tconversion.for( 'upcast' ).add( upcastPicture( imageUtils ) );\n\t\tconversion.for( 'downcast' ).add( downcastSourcesAttribute( imageUtils ) );\n\t}\n\n\t/**\n\t * Makes it possible for uploaded images to get the `sources` model attribute and the `<picture>...</picture>`\n\t * view structure out-of-the-box if relevant data is provided along the\n\t * {@link module:image/imageupload/imageuploadediting~ImageUploadEditing#event:uploadComplete} event.\n\t *\n\t * @private\n\t */\n\t_setupImageUploadEditingIntegration() {\n\t\tconst editor = this.editor;\n\n\t\tif ( !editor.plugins.has( 'ImageUploadEditing' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.listenTo( editor.plugins.get( 'ImageUploadEditing' ), 'uploadComplete', ( evt, { imageElement, data } ) => {\n\t\t\tconst sources = data.sources;\n\n\t\t\tif ( !sources ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\teditor.model.change( writer => {\n\t\t\t\twriter.setAttributes( {\n\t\t\t\t\tsources\n\t\t\t\t}, imageElement );\n\t\t\t} );\n\t\t} );\n\t}\n}\n","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/clipboard.js\");","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/core.js\");","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/engine.js\");","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/typing.js\");","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/ui.js\");","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/undo.js\");","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/upload.js\");","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/utils.js\");","module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ \"dll-reference CKEditor5.dll\"))(\"./src/widget.js\");","module.exports = CKEditor5.dll;","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nexport default identity;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module image\n */\n\nexport { default as AutoImage } from './autoimage';\nexport { default as Image } from './image';\nexport { default as ImageEditing } from './image/imageediting';\nexport { default as ImageCaptionUtils } from './imagecaption/imagecaptionutils';\nexport { default as ImageCaption } from './imagecaption';\nexport { default as ImageCaptionEditing } from './imagecaption/imagecaptionediting';\nexport { default as ImageInsert } from './imageinsert';\nexport { default as ImageInsertUI } from './imageinsert/imageinsertui';\nexport { default as ImageResize } from './imageresize';\nexport { default as ImageResizeButtons } from './imageresize/imageresizebuttons';\nexport { default as ImageResizeEditing } from './imageresize/imageresizeediting';\nexport { default as ImageResizeHandles } from './imageresize/imageresizehandles';\nexport { default as ImageStyle } from './imagestyle';\nexport { default as ImageStyleEditing } from './imagestyle/imagestyleediting';\nexport { default as ImageStyleUI } from './imagestyle/imagestyleui';\nexport { default as ImageTextAlternative } from './imagetextalternative';\nexport { default as ImageTextAlternativeEditing } from './imagetextalternative/imagetextalternativeediting';\nexport { default as ImageTextAlternativeUI } from './imagetextalternative/imagetextalternativeui';\nexport { default as ImageToolbar } from './imagetoolbar';\nexport { default as ImageUpload } from './imageupload';\nexport { default as ImageUploadEditing } from './imageupload/imageuploadediting';\nexport { default as ImageUploadProgress } from './imageupload/imageuploadprogress';\nexport { default as ImageUploadUI } from './imageupload/imageuploadui';\nexport { default as PictureEditing } from './pictureediting';\n"],"sourceRoot":""}
|